diff --git a/.gitignore b/.gitignore
new file mode 100644
index 00000000..3c3629e6
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+node_modules
diff --git a/cypress/.gitignore b/cypress/.gitignore
new file mode 100644
index 00000000..133da84e
--- /dev/null
+++ b/cypress/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/cypress/README.md b/cypress/README.md
new file mode 100644
index 00000000..943d20f2
--- /dev/null
+++ b/cypress/README.md
@@ -0,0 +1,42 @@
+# cypress
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[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).
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Headed Component Tests with [Cypress Component Testing](https://on.cypress.io/component)
+
+```sh
+pnpm test:unit # or `pnpm test:unit:ci` for headless testing
+```
+
+### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
+
+```sh
+pnpm build
+pnpm test:e2e # or `pnpm test:e2e:ci` for headless testing
+```
diff --git a/cypress/cypress.config.js b/cypress/cypress.config.js
new file mode 100644
index 00000000..c3aba743
--- /dev/null
+++ b/cypress/cypress.config.js
@@ -0,0 +1,15 @@
+const { defineConfig } = require('cypress')
+
+module.exports = defineConfig({
+ e2e: {
+ specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
+ baseUrl: 'http://localhost:4173/'
+ },
+ component: {
+ specPattern: 'src/**/__tests__/*.{cy,spec}.{js,ts,jsx,tsx}',
+ devServer: {
+ framework: 'vue',
+ bundler: 'vite'
+ }
+ }
+})
diff --git a/jsx-pinia-with-tests/cypress/integration/example.spec.js b/cypress/cypress/e2e/example.cy.js
similarity index 100%
rename from jsx-pinia-with-tests/cypress/integration/example.spec.js
rename to cypress/cypress/e2e/example.cy.js
diff --git a/jsx-router-with-tests/cypress/jsconfig.json b/cypress/cypress/e2e/jsconfig.json
similarity index 70%
rename from jsx-router-with-tests/cypress/jsconfig.json
rename to cypress/cypress/e2e/jsconfig.json
index b5b2f972..c790a70d 100644
--- a/jsx-router-with-tests/cypress/jsconfig.json
+++ b/cypress/cypress/e2e/jsconfig.json
@@ -4,5 +4,5 @@
"lib": ["es5", "dom"],
"types": ["cypress"]
},
- "include": ["./**/*"]
+ "include": ["./**/*", "../support/**/*"]
}
diff --git a/cypress/cypress/fixtures/example.json b/cypress/cypress/fixtures/example.json
new file mode 100644
index 00000000..02e42543
--- /dev/null
+++ b/cypress/cypress/fixtures/example.json
@@ -0,0 +1,5 @@
+{
+ "name": "Using fixtures to represent data",
+ "email": "hello@cypress.io",
+ "body": "Fixtures are a great way to mock data for responses to routes"
+}
diff --git a/cypress/cypress/support/commands.js b/cypress/cypress/support/commands.js
new file mode 100644
index 00000000..119ab03f
--- /dev/null
+++ b/cypress/cypress/support/commands.js
@@ -0,0 +1,25 @@
+// ***********************************************
+// This example commands.js shows you how to
+// create various custom commands and overwrite
+// existing commands.
+//
+// For more comprehensive examples of custom
+// commands please read more here:
+// https://on.cypress.io/custom-commands
+// ***********************************************
+//
+//
+// -- This is a parent command --
+// Cypress.Commands.add('login', (email, password) => { ... })
+//
+//
+// -- This is a child command --
+// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
+//
+//
+// -- This is a dual command --
+// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
+//
+//
+// -- This will overwrite an existing command --
+// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
diff --git a/cypress/cypress/support/component-index.html b/cypress/cypress/support/component-index.html
new file mode 100644
index 00000000..5f9622ae
--- /dev/null
+++ b/cypress/cypress/support/component-index.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+ Components App
+
+
+
+
+
diff --git a/cypress/cypress/support/component.js b/cypress/cypress/support/component.js
new file mode 100644
index 00000000..9b98cf0e
--- /dev/null
+++ b/cypress/cypress/support/component.js
@@ -0,0 +1,30 @@
+// ***********************************************************
+// This example support/component.js is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
+
+// Import global styles
+import '@/assets/main.css'
+
+import { mount } from 'cypress/vue2'
+
+Cypress.Commands.add('mount', mount)
+
+// Example use:
+// cy.mount(MyComponent)
diff --git a/jsx-pinia-with-tests/cypress/support/index.js b/cypress/cypress/support/e2e.js
similarity index 100%
rename from jsx-pinia-with-tests/cypress/support/index.js
rename to cypress/cypress/support/e2e.js
diff --git a/cypress/index.html b/cypress/index.html
new file mode 100644
index 00000000..030a6ff5
--- /dev/null
+++ b/cypress/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/cypress/package.json b/cypress/package.json
new file mode 100644
index 00000000..38f610bd
--- /dev/null
+++ b/cypress/package.json
@@ -0,0 +1,24 @@
+{
+ "name": "cypress",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview --port 4173",
+ "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
+ "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'",
+ "test:unit": "cypress open --component",
+ "test:unit:ci": "cypress run --component --quiet --reporter spec"
+ },
+ "dependencies": {
+ "vue": "^2.7.7"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "cypress": "^10.3.0",
+ "start-server-and-test": "^1.14.0",
+ "terser": "^5.14.2",
+ "vite": "^3.0.2"
+ }
+}
diff --git a/cypress/public/favicon.ico b/cypress/public/favicon.ico
new file mode 100644
index 00000000..df36fcfb
Binary files /dev/null and b/cypress/public/favicon.ico differ
diff --git a/cypress/src/App.vue b/cypress/src/App.vue
new file mode 100644
index 00000000..45fbfd94
--- /dev/null
+++ b/cypress/src/App.vue
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/cypress/src/assets/base.css b/cypress/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/cypress/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/cypress/src/assets/logo.svg b/cypress/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/cypress/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/cypress/src/assets/main.css b/cypress/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/cypress/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/cypress/src/components/HelloWorld.vue b/cypress/src/components/HelloWorld.vue
new file mode 100644
index 00000000..de8b576a
--- /dev/null
+++ b/cypress/src/components/HelloWorld.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 .
+
+
+
+
+
diff --git a/cypress/src/components/TheWelcome.vue b/cypress/src/components/TheWelcome.vue
new file mode 100644
index 00000000..cccc38ef
--- /dev/null
+++ b/cypress/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/cypress/src/components/WelcomeItem.vue b/cypress/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/cypress/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/cypress/src/components/__tests__/HelloWorld.cy.js b/cypress/src/components/__tests__/HelloWorld.cy.js
new file mode 100644
index 00000000..0e0c065a
--- /dev/null
+++ b/cypress/src/components/__tests__/HelloWorld.cy.js
@@ -0,0 +1,12 @@
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('playground', () => {
+ cy.mount(HelloWorld, { propsData: { msg: 'Hello Cypress' } })
+ })
+
+ it('renders properly', () => {
+ cy.mount(HelloWorld, { propsData: { msg: 'Hello Cypress' } })
+ cy.get('h1').should('contain', 'Hello Cypress')
+ })
+})
diff --git a/cypress/src/components/icons/IconCommunity.vue b/cypress/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/cypress/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/cypress/src/components/icons/IconDocumentation.vue b/cypress/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/cypress/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/cypress/src/components/icons/IconEcosystem.vue b/cypress/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/cypress/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/cypress/src/components/icons/IconSupport.vue b/cypress/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/cypress/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/cypress/src/components/icons/IconTooling.vue b/cypress/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/cypress/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/cypress/src/main.js b/cypress/src/main.js
new file mode 100644
index 00000000..c5da47dc
--- /dev/null
+++ b/cypress/src/main.js
@@ -0,0 +1,8 @@
+import Vue from 'vue'
+import App from './App.vue'
+
+import './assets/main.css'
+
+new Vue({
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/cypress/vite.config.js b/cypress/vite.config.js
new file mode 100644
index 00000000..d4945079
--- /dev/null
+++ b/cypress/vite.config.js
@@ -0,0 +1,21 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/default/README.md b/default/README.md
index c1783556..46c62b77 100644
--- a/default/README.md
+++ b/default/README.md
@@ -4,7 +4,7 @@ This template should help get you started developing with Vue 3 in Vite.
## Recommended IDE Setup
-[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=johnsoncodehk.volar) (and disable Vetur).
+[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).
## Customize configuration
diff --git a/default/package.json b/default/package.json
index 0a390125..2e6b920b 100644
--- a/default/package.json
+++ b/default/package.json
@@ -4,13 +4,15 @@
"scripts": {
"dev": "vite",
"build": "vite build",
- "preview": "vite preview --port 5050"
+ "preview": "vite preview --port 4173"
},
"dependencies": {
- "vue": "^3.2.22"
+ "vue": "^2.7.7"
},
"devDependencies": {
- "@vitejs/plugin-vue": "^1.10.0",
- "vite": "^2.6.14"
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "terser": "^5.14.2",
+ "vite": "^3.0.2"
}
}
diff --git a/default/src/App.vue b/default/src/App.vue
index b0b6901b..45fbfd94 100644
--- a/default/src/App.vue
+++ b/default/src/App.vue
@@ -4,30 +4,22 @@ import TheWelcome from './components/TheWelcome.vue'
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/default/src/assets/main.css b/default/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/default/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/default/src/components/HelloWorld.vue b/default/src/components/HelloWorld.vue
index aa16fa1f..de8b576a 100644
--- a/default/src/components/HelloWorld.vue
+++ b/default/src/components/HelloWorld.vue
@@ -13,7 +13,7 @@ defineProps({
You’ve successfully created a project with
Vite +
- Vue 3 .
+ Vue 2 .
diff --git a/default/src/components/TheWelcome.vue b/default/src/components/TheWelcome.vue
index 1d003f86..cccc38ef 100644
--- a/default/src/components/TheWelcome.vue
+++ b/default/src/components/TheWelcome.vue
@@ -8,77 +8,79 @@ import SupportIcon from './icons/IconSupport.vue'
-
-
-
-
- Documentation
+
+
+
+
+
+ Documentation
- Vue’s
- official documentation
- provides you with all information you need to get started.
-
+ Vue’s
+
official documentation
+ provides you with all information you need to get started.
+
-
-
-
-
- Tooling
+
+
+
+
+ Tooling
- This project is served and bundled with
- Vite . The recommended IDE
- setup is VSCode +
- Volar . If you need to test
- your components and web pages, check out
- Cypress and
- Cypress Component Testing .
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
-
+
- More instructions are available in README.md
.
-
+ More instructions are available in README.md
.
+
-
-
-
-
- Ecosystem
+
+
+
+
+ Ecosystem
- Get official tools and libraries for your project:
- Vuex ,
- Vue Router ,
- Vue Test Utils , and
- Vue Dev Tools . If you need more
- resources, we suggest paying
- Awesome Vue
- a visit.
-
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
-
-
-
-
- Community
+
+
+
+
+ Community
- Got stuck? Ask your question on
- Vue Land , our official Discord server, or
- StackOverflow .
- You should also subscribe to
- our mailing list and follow the official
- @vuejs
- twitter account for latest news in the Vue world.
-
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
-
-
-
-
- Support Vue
+
+
+
+
+ Support Vue
- As an independent project, Vue relies on community backing for its sustainability. You can help
- us by
- becoming a sponsor .
-
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
diff --git a/default/src/components/icons/IconTooling.vue b/default/src/components/icons/IconTooling.vue
index 660598d7..07dc46b0 100644
--- a/default/src/components/icons/IconTooling.vue
+++ b/default/src/components/icons/IconTooling.vue
@@ -2,8 +2,6 @@
h(App)
+}).$mount('#app')
diff --git a/default/vite.config.js b/default/vite.config.js
index 5cd06c63..d4945079 100644
--- a/default/vite.config.js
+++ b/default/vite.config.js
@@ -1,11 +1,18 @@
-import { fileURLToPath } from 'url'
+import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vite'
-import vue from '@vitejs/plugin-vue'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
// https://vitejs.dev/config/
export default defineConfig({
- plugins: [vue()],
+ plugins: [
+ vue2(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
diff --git a/jsx-cypress/.gitignore b/jsx-cypress/.gitignore
new file mode 100644
index 00000000..133da84e
--- /dev/null
+++ b/jsx-cypress/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/jsx-cypress/README.md b/jsx-cypress/README.md
new file mode 100644
index 00000000..0759480a
--- /dev/null
+++ b/jsx-cypress/README.md
@@ -0,0 +1,42 @@
+# jsx-cypress
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[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).
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Headed Component Tests with [Cypress Component Testing](https://on.cypress.io/component)
+
+```sh
+pnpm test:unit # or `pnpm test:unit:ci` for headless testing
+```
+
+### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
+
+```sh
+pnpm build
+pnpm test:e2e # or `pnpm test:e2e:ci` for headless testing
+```
diff --git a/jsx-cypress/cypress.config.js b/jsx-cypress/cypress.config.js
new file mode 100644
index 00000000..c3aba743
--- /dev/null
+++ b/jsx-cypress/cypress.config.js
@@ -0,0 +1,15 @@
+const { defineConfig } = require('cypress')
+
+module.exports = defineConfig({
+ e2e: {
+ specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
+ baseUrl: 'http://localhost:4173/'
+ },
+ component: {
+ specPattern: 'src/**/__tests__/*.{cy,spec}.{js,ts,jsx,tsx}',
+ devServer: {
+ framework: 'vue',
+ bundler: 'vite'
+ }
+ }
+})
diff --git a/jsx-with-tests/cypress/integration/example.spec.js b/jsx-cypress/cypress/e2e/example.cy.js
similarity index 100%
rename from jsx-with-tests/cypress/integration/example.spec.js
rename to jsx-cypress/cypress/e2e/example.cy.js
diff --git a/jsx-pinia-with-tests/cypress/jsconfig.json b/jsx-cypress/cypress/e2e/jsconfig.json
similarity index 70%
rename from jsx-pinia-with-tests/cypress/jsconfig.json
rename to jsx-cypress/cypress/e2e/jsconfig.json
index b5b2f972..c790a70d 100644
--- a/jsx-pinia-with-tests/cypress/jsconfig.json
+++ b/jsx-cypress/cypress/e2e/jsconfig.json
@@ -4,5 +4,5 @@
"lib": ["es5", "dom"],
"types": ["cypress"]
},
- "include": ["./**/*"]
+ "include": ["./**/*", "../support/**/*"]
}
diff --git a/jsx-cypress/cypress/fixtures/example.json b/jsx-cypress/cypress/fixtures/example.json
new file mode 100644
index 00000000..02e42543
--- /dev/null
+++ b/jsx-cypress/cypress/fixtures/example.json
@@ -0,0 +1,5 @@
+{
+ "name": "Using fixtures to represent data",
+ "email": "hello@cypress.io",
+ "body": "Fixtures are a great way to mock data for responses to routes"
+}
diff --git a/jsx-cypress/cypress/support/commands.js b/jsx-cypress/cypress/support/commands.js
new file mode 100644
index 00000000..119ab03f
--- /dev/null
+++ b/jsx-cypress/cypress/support/commands.js
@@ -0,0 +1,25 @@
+// ***********************************************
+// This example commands.js shows you how to
+// create various custom commands and overwrite
+// existing commands.
+//
+// For more comprehensive examples of custom
+// commands please read more here:
+// https://on.cypress.io/custom-commands
+// ***********************************************
+//
+//
+// -- This is a parent command --
+// Cypress.Commands.add('login', (email, password) => { ... })
+//
+//
+// -- This is a child command --
+// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
+//
+//
+// -- This is a dual command --
+// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
+//
+//
+// -- This will overwrite an existing command --
+// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
diff --git a/jsx-cypress/cypress/support/component-index.html b/jsx-cypress/cypress/support/component-index.html
new file mode 100644
index 00000000..5f9622ae
--- /dev/null
+++ b/jsx-cypress/cypress/support/component-index.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+ Components App
+
+
+
+
+
diff --git a/jsx-cypress/cypress/support/component.js b/jsx-cypress/cypress/support/component.js
new file mode 100644
index 00000000..9b98cf0e
--- /dev/null
+++ b/jsx-cypress/cypress/support/component.js
@@ -0,0 +1,30 @@
+// ***********************************************************
+// This example support/component.js is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
+
+// Import global styles
+import '@/assets/main.css'
+
+import { mount } from 'cypress/vue2'
+
+Cypress.Commands.add('mount', mount)
+
+// Example use:
+// cy.mount(MyComponent)
diff --git a/jsx-router-pinia-with-tests/cypress/support/index.js b/jsx-cypress/cypress/support/e2e.js
similarity index 100%
rename from jsx-router-pinia-with-tests/cypress/support/index.js
rename to jsx-cypress/cypress/support/e2e.js
diff --git a/jsx-cypress/index.html b/jsx-cypress/index.html
new file mode 100644
index 00000000..030a6ff5
--- /dev/null
+++ b/jsx-cypress/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/jsx-cypress/package.json b/jsx-cypress/package.json
new file mode 100644
index 00000000..bd73fa80
--- /dev/null
+++ b/jsx-cypress/package.json
@@ -0,0 +1,25 @@
+{
+ "name": "jsx-cypress",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview --port 4173",
+ "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
+ "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'",
+ "test:unit": "cypress open --component",
+ "test:unit:ci": "cypress run --component --quiet --reporter spec"
+ },
+ "dependencies": {
+ "vue": "^2.7.7"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vitejs/plugin-vue2-jsx": "^1.0.2",
+ "cypress": "^10.3.0",
+ "start-server-and-test": "^1.14.0",
+ "terser": "^5.14.2",
+ "vite": "^3.0.2"
+ }
+}
diff --git a/jsx-cypress/public/favicon.ico b/jsx-cypress/public/favicon.ico
new file mode 100644
index 00000000..df36fcfb
Binary files /dev/null and b/jsx-cypress/public/favicon.ico differ
diff --git a/jsx-cypress/src/App.vue b/jsx-cypress/src/App.vue
new file mode 100644
index 00000000..45fbfd94
--- /dev/null
+++ b/jsx-cypress/src/App.vue
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/jsx-cypress/src/assets/base.css b/jsx-cypress/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/jsx-cypress/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/jsx-cypress/src/assets/logo.svg b/jsx-cypress/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/jsx-cypress/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/jsx-cypress/src/assets/main.css b/jsx-cypress/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/jsx-cypress/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/jsx-cypress/src/components/HelloWorld.vue b/jsx-cypress/src/components/HelloWorld.vue
new file mode 100644
index 00000000..de8b576a
--- /dev/null
+++ b/jsx-cypress/src/components/HelloWorld.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 .
+
+
+
+
+
diff --git a/jsx-cypress/src/components/TheWelcome.vue b/jsx-cypress/src/components/TheWelcome.vue
new file mode 100644
index 00000000..cccc38ef
--- /dev/null
+++ b/jsx-cypress/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/jsx-cypress/src/components/WelcomeItem.vue b/jsx-cypress/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/jsx-cypress/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/jsx-cypress/src/components/__tests__/HelloWorld.cy.js b/jsx-cypress/src/components/__tests__/HelloWorld.cy.js
new file mode 100644
index 00000000..0e0c065a
--- /dev/null
+++ b/jsx-cypress/src/components/__tests__/HelloWorld.cy.js
@@ -0,0 +1,12 @@
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('playground', () => {
+ cy.mount(HelloWorld, { propsData: { msg: 'Hello Cypress' } })
+ })
+
+ it('renders properly', () => {
+ cy.mount(HelloWorld, { propsData: { msg: 'Hello Cypress' } })
+ cy.get('h1').should('contain', 'Hello Cypress')
+ })
+})
diff --git a/jsx-cypress/src/components/icons/IconCommunity.vue b/jsx-cypress/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/jsx-cypress/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-cypress/src/components/icons/IconDocumentation.vue b/jsx-cypress/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/jsx-cypress/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-cypress/src/components/icons/IconEcosystem.vue b/jsx-cypress/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/jsx-cypress/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-cypress/src/components/icons/IconSupport.vue b/jsx-cypress/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/jsx-cypress/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-cypress/src/components/icons/IconTooling.vue b/jsx-cypress/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/jsx-cypress/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/jsx-cypress/src/main.js b/jsx-cypress/src/main.js
new file mode 100644
index 00000000..c5da47dc
--- /dev/null
+++ b/jsx-cypress/src/main.js
@@ -0,0 +1,8 @@
+import Vue from 'vue'
+import App from './App.vue'
+
+import './assets/main.css'
+
+new Vue({
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/jsx-cypress/vite.config.js b/jsx-cypress/vite.config.js
new file mode 100644
index 00000000..54d7440f
--- /dev/null
+++ b/jsx-cypress/vite.config.js
@@ -0,0 +1,23 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+import vue2Jsx from '@vitejs/plugin-vue2-jsx'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ vue2Jsx(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/jsx-pinia-cypress/.gitignore b/jsx-pinia-cypress/.gitignore
new file mode 100644
index 00000000..133da84e
--- /dev/null
+++ b/jsx-pinia-cypress/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/jsx-pinia-cypress/README.md b/jsx-pinia-cypress/README.md
new file mode 100644
index 00000000..1ce12c70
--- /dev/null
+++ b/jsx-pinia-cypress/README.md
@@ -0,0 +1,42 @@
+# jsx-pinia-cypress
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[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).
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Headed Component Tests with [Cypress Component Testing](https://on.cypress.io/component)
+
+```sh
+pnpm test:unit # or `pnpm test:unit:ci` for headless testing
+```
+
+### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
+
+```sh
+pnpm build
+pnpm test:e2e # or `pnpm test:e2e:ci` for headless testing
+```
diff --git a/jsx-pinia-cypress/cypress.config.js b/jsx-pinia-cypress/cypress.config.js
new file mode 100644
index 00000000..c3aba743
--- /dev/null
+++ b/jsx-pinia-cypress/cypress.config.js
@@ -0,0 +1,15 @@
+const { defineConfig } = require('cypress')
+
+module.exports = defineConfig({
+ e2e: {
+ specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
+ baseUrl: 'http://localhost:4173/'
+ },
+ component: {
+ specPattern: 'src/**/__tests__/*.{cy,spec}.{js,ts,jsx,tsx}',
+ devServer: {
+ framework: 'vue',
+ bundler: 'vite'
+ }
+ }
+})
diff --git a/pinia-with-tests/cypress/integration/example.spec.js b/jsx-pinia-cypress/cypress/e2e/example.cy.js
similarity index 100%
rename from pinia-with-tests/cypress/integration/example.spec.js
rename to jsx-pinia-cypress/cypress/e2e/example.cy.js
diff --git a/jsx-router-pinia-with-tests/cypress/jsconfig.json b/jsx-pinia-cypress/cypress/e2e/jsconfig.json
similarity index 70%
rename from jsx-router-pinia-with-tests/cypress/jsconfig.json
rename to jsx-pinia-cypress/cypress/e2e/jsconfig.json
index b5b2f972..c790a70d 100644
--- a/jsx-router-pinia-with-tests/cypress/jsconfig.json
+++ b/jsx-pinia-cypress/cypress/e2e/jsconfig.json
@@ -4,5 +4,5 @@
"lib": ["es5", "dom"],
"types": ["cypress"]
},
- "include": ["./**/*"]
+ "include": ["./**/*", "../support/**/*"]
}
diff --git a/jsx-pinia-cypress/cypress/fixtures/example.json b/jsx-pinia-cypress/cypress/fixtures/example.json
new file mode 100644
index 00000000..02e42543
--- /dev/null
+++ b/jsx-pinia-cypress/cypress/fixtures/example.json
@@ -0,0 +1,5 @@
+{
+ "name": "Using fixtures to represent data",
+ "email": "hello@cypress.io",
+ "body": "Fixtures are a great way to mock data for responses to routes"
+}
diff --git a/jsx-pinia-cypress/cypress/support/commands.js b/jsx-pinia-cypress/cypress/support/commands.js
new file mode 100644
index 00000000..119ab03f
--- /dev/null
+++ b/jsx-pinia-cypress/cypress/support/commands.js
@@ -0,0 +1,25 @@
+// ***********************************************
+// This example commands.js shows you how to
+// create various custom commands and overwrite
+// existing commands.
+//
+// For more comprehensive examples of custom
+// commands please read more here:
+// https://on.cypress.io/custom-commands
+// ***********************************************
+//
+//
+// -- This is a parent command --
+// Cypress.Commands.add('login', (email, password) => { ... })
+//
+//
+// -- This is a child command --
+// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
+//
+//
+// -- This is a dual command --
+// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
+//
+//
+// -- This will overwrite an existing command --
+// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
diff --git a/jsx-pinia-cypress/cypress/support/component-index.html b/jsx-pinia-cypress/cypress/support/component-index.html
new file mode 100644
index 00000000..5f9622ae
--- /dev/null
+++ b/jsx-pinia-cypress/cypress/support/component-index.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+ Components App
+
+
+
+
+
diff --git a/jsx-pinia-cypress/cypress/support/component.js b/jsx-pinia-cypress/cypress/support/component.js
new file mode 100644
index 00000000..9b98cf0e
--- /dev/null
+++ b/jsx-pinia-cypress/cypress/support/component.js
@@ -0,0 +1,30 @@
+// ***********************************************************
+// This example support/component.js is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
+
+// Import global styles
+import '@/assets/main.css'
+
+import { mount } from 'cypress/vue2'
+
+Cypress.Commands.add('mount', mount)
+
+// Example use:
+// cy.mount(MyComponent)
diff --git a/jsx-router-with-tests/cypress/support/index.js b/jsx-pinia-cypress/cypress/support/e2e.js
similarity index 100%
rename from jsx-router-with-tests/cypress/support/index.js
rename to jsx-pinia-cypress/cypress/support/e2e.js
diff --git a/jsx-pinia-cypress/index.html b/jsx-pinia-cypress/index.html
new file mode 100644
index 00000000..030a6ff5
--- /dev/null
+++ b/jsx-pinia-cypress/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/jsx-pinia-cypress/package.json b/jsx-pinia-cypress/package.json
new file mode 100644
index 00000000..e9df7843
--- /dev/null
+++ b/jsx-pinia-cypress/package.json
@@ -0,0 +1,26 @@
+{
+ "name": "jsx-pinia-cypress",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview --port 4173",
+ "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
+ "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'",
+ "test:unit": "cypress open --component",
+ "test:unit:ci": "cypress run --component --quiet --reporter spec"
+ },
+ "dependencies": {
+ "pinia": "^2.0.16",
+ "vue": "^2.7.7"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vitejs/plugin-vue2-jsx": "^1.0.2",
+ "cypress": "^10.3.0",
+ "start-server-and-test": "^1.14.0",
+ "terser": "^5.14.2",
+ "vite": "^3.0.2"
+ }
+}
diff --git a/jsx-pinia-cypress/public/favicon.ico b/jsx-pinia-cypress/public/favicon.ico
new file mode 100644
index 00000000..df36fcfb
Binary files /dev/null and b/jsx-pinia-cypress/public/favicon.ico differ
diff --git a/jsx-pinia-cypress/src/App.vue b/jsx-pinia-cypress/src/App.vue
new file mode 100644
index 00000000..45fbfd94
--- /dev/null
+++ b/jsx-pinia-cypress/src/App.vue
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/jsx-pinia-cypress/src/assets/base.css b/jsx-pinia-cypress/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/jsx-pinia-cypress/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/jsx-pinia-cypress/src/assets/logo.svg b/jsx-pinia-cypress/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/jsx-pinia-cypress/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/jsx-pinia-cypress/src/assets/main.css b/jsx-pinia-cypress/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/jsx-pinia-cypress/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/jsx-pinia-cypress/src/components/HelloWorld.vue b/jsx-pinia-cypress/src/components/HelloWorld.vue
new file mode 100644
index 00000000..de8b576a
--- /dev/null
+++ b/jsx-pinia-cypress/src/components/HelloWorld.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 .
+
+
+
+
+
diff --git a/jsx-pinia-cypress/src/components/TheWelcome.vue b/jsx-pinia-cypress/src/components/TheWelcome.vue
new file mode 100644
index 00000000..cccc38ef
--- /dev/null
+++ b/jsx-pinia-cypress/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/jsx-pinia-cypress/src/components/WelcomeItem.vue b/jsx-pinia-cypress/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/jsx-pinia-cypress/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/jsx-pinia-cypress/src/components/__tests__/HelloWorld.cy.js b/jsx-pinia-cypress/src/components/__tests__/HelloWorld.cy.js
new file mode 100644
index 00000000..0e0c065a
--- /dev/null
+++ b/jsx-pinia-cypress/src/components/__tests__/HelloWorld.cy.js
@@ -0,0 +1,12 @@
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('playground', () => {
+ cy.mount(HelloWorld, { propsData: { msg: 'Hello Cypress' } })
+ })
+
+ it('renders properly', () => {
+ cy.mount(HelloWorld, { propsData: { msg: 'Hello Cypress' } })
+ cy.get('h1').should('contain', 'Hello Cypress')
+ })
+})
diff --git a/jsx-pinia-cypress/src/components/icons/IconCommunity.vue b/jsx-pinia-cypress/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/jsx-pinia-cypress/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-pinia-cypress/src/components/icons/IconDocumentation.vue b/jsx-pinia-cypress/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/jsx-pinia-cypress/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-pinia-cypress/src/components/icons/IconEcosystem.vue b/jsx-pinia-cypress/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/jsx-pinia-cypress/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-pinia-cypress/src/components/icons/IconSupport.vue b/jsx-pinia-cypress/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/jsx-pinia-cypress/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-pinia-cypress/src/components/icons/IconTooling.vue b/jsx-pinia-cypress/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/jsx-pinia-cypress/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/jsx-pinia-cypress/src/main.js b/jsx-pinia-cypress/src/main.js
new file mode 100644
index 00000000..febe0dbe
--- /dev/null
+++ b/jsx-pinia-cypress/src/main.js
@@ -0,0 +1,13 @@
+import Vue from 'vue'
+import { createPinia, PiniaVuePlugin } from 'pinia'
+
+import App from './App.vue'
+
+import './assets/main.css'
+
+Vue.use(PiniaVuePlugin)
+
+new Vue({
+ pinia: createPinia(),
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/jsx-pinia-cypress/src/stores/counter.js b/jsx-pinia-cypress/src/stores/counter.js
new file mode 100644
index 00000000..4a2d2427
--- /dev/null
+++ b/jsx-pinia-cypress/src/stores/counter.js
@@ -0,0 +1,16 @@
+import { defineStore } from 'pinia'
+
+export const useCounterStore = defineStore({
+ id: 'counter',
+ state: () => ({
+ counter: 0
+ }),
+ getters: {
+ doubleCount: (state) => state.counter * 2
+ },
+ actions: {
+ increment() {
+ this.counter++
+ }
+ }
+})
diff --git a/jsx-pinia-cypress/vite.config.js b/jsx-pinia-cypress/vite.config.js
new file mode 100644
index 00000000..54d7440f
--- /dev/null
+++ b/jsx-pinia-cypress/vite.config.js
@@ -0,0 +1,23 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+import vue2Jsx from '@vitejs/plugin-vue2-jsx'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ vue2Jsx(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/jsx-pinia-vitest-cypress/.gitignore b/jsx-pinia-vitest-cypress/.gitignore
new file mode 100644
index 00000000..133da84e
--- /dev/null
+++ b/jsx-pinia-vitest-cypress/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/jsx-pinia-vitest-cypress/README.md b/jsx-pinia-vitest-cypress/README.md
new file mode 100644
index 00000000..be67a1bd
--- /dev/null
+++ b/jsx-pinia-vitest-cypress/README.md
@@ -0,0 +1,42 @@
+# jsx-pinia-vitest-cypress
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[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).
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Unit Tests with [Vitest](https://vitest.dev/)
+
+```sh
+pnpm test:unit
+```
+
+### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
+
+```sh
+pnpm build
+pnpm test:e2e # or `pnpm test:e2e:ci` for headless testing
+```
diff --git a/jsx-pinia-vitest-cypress/cypress.config.js b/jsx-pinia-vitest-cypress/cypress.config.js
new file mode 100644
index 00000000..9cf6a199
--- /dev/null
+++ b/jsx-pinia-vitest-cypress/cypress.config.js
@@ -0,0 +1,8 @@
+const { defineConfig } = require('cypress')
+
+module.exports = defineConfig({
+ e2e: {
+ specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
+ baseUrl: 'http://localhost:4173/'
+ }
+})
diff --git a/typescript-jsx-pinia-with-tests/cypress/integration/example.spec.ts b/jsx-pinia-vitest-cypress/cypress/e2e/example.cy.js
similarity index 100%
rename from typescript-jsx-pinia-with-tests/cypress/integration/example.spec.ts
rename to jsx-pinia-vitest-cypress/cypress/e2e/example.cy.js
diff --git a/jsx-with-tests/cypress/jsconfig.json b/jsx-pinia-vitest-cypress/cypress/e2e/jsconfig.json
similarity index 70%
rename from jsx-with-tests/cypress/jsconfig.json
rename to jsx-pinia-vitest-cypress/cypress/e2e/jsconfig.json
index b5b2f972..c790a70d 100644
--- a/jsx-with-tests/cypress/jsconfig.json
+++ b/jsx-pinia-vitest-cypress/cypress/e2e/jsconfig.json
@@ -4,5 +4,5 @@
"lib": ["es5", "dom"],
"types": ["cypress"]
},
- "include": ["./**/*"]
+ "include": ["./**/*", "../support/**/*"]
}
diff --git a/jsx-pinia-vitest-cypress/cypress/fixtures/example.json b/jsx-pinia-vitest-cypress/cypress/fixtures/example.json
new file mode 100644
index 00000000..02e42543
--- /dev/null
+++ b/jsx-pinia-vitest-cypress/cypress/fixtures/example.json
@@ -0,0 +1,5 @@
+{
+ "name": "Using fixtures to represent data",
+ "email": "hello@cypress.io",
+ "body": "Fixtures are a great way to mock data for responses to routes"
+}
diff --git a/jsx-pinia-vitest-cypress/cypress/support/commands.js b/jsx-pinia-vitest-cypress/cypress/support/commands.js
new file mode 100644
index 00000000..119ab03f
--- /dev/null
+++ b/jsx-pinia-vitest-cypress/cypress/support/commands.js
@@ -0,0 +1,25 @@
+// ***********************************************
+// This example commands.js shows you how to
+// create various custom commands and overwrite
+// existing commands.
+//
+// For more comprehensive examples of custom
+// commands please read more here:
+// https://on.cypress.io/custom-commands
+// ***********************************************
+//
+//
+// -- This is a parent command --
+// Cypress.Commands.add('login', (email, password) => { ... })
+//
+//
+// -- This is a child command --
+// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
+//
+//
+// -- This is a dual command --
+// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
+//
+//
+// -- This will overwrite an existing command --
+// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
diff --git a/jsx-with-tests/cypress/support/index.js b/jsx-pinia-vitest-cypress/cypress/support/e2e.js
similarity index 100%
rename from jsx-with-tests/cypress/support/index.js
rename to jsx-pinia-vitest-cypress/cypress/support/e2e.js
diff --git a/jsx-pinia-vitest-cypress/index.html b/jsx-pinia-vitest-cypress/index.html
new file mode 100644
index 00000000..030a6ff5
--- /dev/null
+++ b/jsx-pinia-vitest-cypress/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/jsx-pinia-vitest-cypress/package.json b/jsx-pinia-vitest-cypress/package.json
new file mode 100644
index 00000000..56389abb
--- /dev/null
+++ b/jsx-pinia-vitest-cypress/package.json
@@ -0,0 +1,29 @@
+{
+ "name": "jsx-pinia-vitest-cypress",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom",
+ "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
+ "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'"
+ },
+ "dependencies": {
+ "pinia": "^2.0.16",
+ "vue": "^2.7.7"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vitejs/plugin-vue2-jsx": "^1.0.2",
+ "@vue/test-utils": "^1.3.0",
+ "cypress": "^10.3.0",
+ "jsdom": "^20.0.0",
+ "start-server-and-test": "^1.14.0",
+ "terser": "^5.14.2",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7"
+ }
+}
diff --git a/jsx-pinia-vitest-cypress/public/favicon.ico b/jsx-pinia-vitest-cypress/public/favicon.ico
new file mode 100644
index 00000000..df36fcfb
Binary files /dev/null and b/jsx-pinia-vitest-cypress/public/favicon.ico differ
diff --git a/jsx-pinia-vitest-cypress/src/App.vue b/jsx-pinia-vitest-cypress/src/App.vue
new file mode 100644
index 00000000..45fbfd94
--- /dev/null
+++ b/jsx-pinia-vitest-cypress/src/App.vue
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/jsx-pinia-vitest-cypress/src/assets/base.css b/jsx-pinia-vitest-cypress/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/jsx-pinia-vitest-cypress/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/jsx-pinia-vitest-cypress/src/assets/logo.svg b/jsx-pinia-vitest-cypress/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/jsx-pinia-vitest-cypress/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/jsx-pinia-vitest-cypress/src/assets/main.css b/jsx-pinia-vitest-cypress/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/jsx-pinia-vitest-cypress/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/jsx-pinia-vitest-cypress/src/components/HelloWorld.vue b/jsx-pinia-vitest-cypress/src/components/HelloWorld.vue
new file mode 100644
index 00000000..de8b576a
--- /dev/null
+++ b/jsx-pinia-vitest-cypress/src/components/HelloWorld.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 .
+
+
+
+
+
diff --git a/jsx-pinia-vitest-cypress/src/components/TheWelcome.vue b/jsx-pinia-vitest-cypress/src/components/TheWelcome.vue
new file mode 100644
index 00000000..cccc38ef
--- /dev/null
+++ b/jsx-pinia-vitest-cypress/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/jsx-pinia-vitest-cypress/src/components/WelcomeItem.vue b/jsx-pinia-vitest-cypress/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/jsx-pinia-vitest-cypress/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/jsx-pinia-vitest-cypress/src/components/__tests__/HelloWorld.spec.js b/jsx-pinia-vitest-cypress/src/components/__tests__/HelloWorld.spec.js
new file mode 100644
index 00000000..293bf197
--- /dev/null
+++ b/jsx-pinia-vitest-cypress/src/components/__tests__/HelloWorld.spec.js
@@ -0,0 +1,11 @@
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('renders properly', () => {
+ const wrapper = mount(HelloWorld, { propsData: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
+ })
+})
diff --git a/jsx-pinia-vitest-cypress/src/components/icons/IconCommunity.vue b/jsx-pinia-vitest-cypress/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/jsx-pinia-vitest-cypress/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-pinia-vitest-cypress/src/components/icons/IconDocumentation.vue b/jsx-pinia-vitest-cypress/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/jsx-pinia-vitest-cypress/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-pinia-vitest-cypress/src/components/icons/IconEcosystem.vue b/jsx-pinia-vitest-cypress/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/jsx-pinia-vitest-cypress/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-pinia-vitest-cypress/src/components/icons/IconSupport.vue b/jsx-pinia-vitest-cypress/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/jsx-pinia-vitest-cypress/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-pinia-vitest-cypress/src/components/icons/IconTooling.vue b/jsx-pinia-vitest-cypress/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/jsx-pinia-vitest-cypress/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/jsx-pinia-vitest-cypress/src/main.js b/jsx-pinia-vitest-cypress/src/main.js
new file mode 100644
index 00000000..febe0dbe
--- /dev/null
+++ b/jsx-pinia-vitest-cypress/src/main.js
@@ -0,0 +1,13 @@
+import Vue from 'vue'
+import { createPinia, PiniaVuePlugin } from 'pinia'
+
+import App from './App.vue'
+
+import './assets/main.css'
+
+Vue.use(PiniaVuePlugin)
+
+new Vue({
+ pinia: createPinia(),
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/jsx-pinia-vitest-cypress/src/stores/counter.js b/jsx-pinia-vitest-cypress/src/stores/counter.js
new file mode 100644
index 00000000..4a2d2427
--- /dev/null
+++ b/jsx-pinia-vitest-cypress/src/stores/counter.js
@@ -0,0 +1,16 @@
+import { defineStore } from 'pinia'
+
+export const useCounterStore = defineStore({
+ id: 'counter',
+ state: () => ({
+ counter: 0
+ }),
+ getters: {
+ doubleCount: (state) => state.counter * 2
+ },
+ actions: {
+ increment() {
+ this.counter++
+ }
+ }
+})
diff --git a/jsx-pinia-vitest-cypress/vite.config.js b/jsx-pinia-vitest-cypress/vite.config.js
new file mode 100644
index 00000000..54d7440f
--- /dev/null
+++ b/jsx-pinia-vitest-cypress/vite.config.js
@@ -0,0 +1,23 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+import vue2Jsx from '@vitejs/plugin-vue2-jsx'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ vue2Jsx(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/jsx-pinia-vitest/.gitignore b/jsx-pinia-vitest/.gitignore
new file mode 100644
index 00000000..133da84e
--- /dev/null
+++ b/jsx-pinia-vitest/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/jsx-pinia-vitest/README.md b/jsx-pinia-vitest/README.md
new file mode 100644
index 00000000..51625a96
--- /dev/null
+++ b/jsx-pinia-vitest/README.md
@@ -0,0 +1,35 @@
+# jsx-pinia-vitest
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[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).
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Unit Tests with [Vitest](https://vitest.dev/)
+
+```sh
+pnpm test:unit
+```
diff --git a/jsx-pinia-vitest/index.html b/jsx-pinia-vitest/index.html
new file mode 100644
index 00000000..030a6ff5
--- /dev/null
+++ b/jsx-pinia-vitest/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/jsx-pinia-vitest/package.json b/jsx-pinia-vitest/package.json
new file mode 100644
index 00000000..96c83956
--- /dev/null
+++ b/jsx-pinia-vitest/package.json
@@ -0,0 +1,25 @@
+{
+ "name": "jsx-pinia-vitest",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom"
+ },
+ "dependencies": {
+ "pinia": "^2.0.16",
+ "vue": "^2.7.7"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vitejs/plugin-vue2-jsx": "^1.0.2",
+ "@vue/test-utils": "^1.3.0",
+ "jsdom": "^20.0.0",
+ "terser": "^5.14.2",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7"
+ }
+}
diff --git a/jsx-pinia-vitest/public/favicon.ico b/jsx-pinia-vitest/public/favicon.ico
new file mode 100644
index 00000000..df36fcfb
Binary files /dev/null and b/jsx-pinia-vitest/public/favicon.ico differ
diff --git a/jsx-pinia-vitest/src/App.vue b/jsx-pinia-vitest/src/App.vue
new file mode 100644
index 00000000..45fbfd94
--- /dev/null
+++ b/jsx-pinia-vitest/src/App.vue
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/jsx-pinia-vitest/src/assets/base.css b/jsx-pinia-vitest/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/jsx-pinia-vitest/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/jsx-pinia-vitest/src/assets/logo.svg b/jsx-pinia-vitest/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/jsx-pinia-vitest/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/jsx-pinia-vitest/src/assets/main.css b/jsx-pinia-vitest/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/jsx-pinia-vitest/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/jsx-pinia-vitest/src/components/HelloWorld.vue b/jsx-pinia-vitest/src/components/HelloWorld.vue
new file mode 100644
index 00000000..de8b576a
--- /dev/null
+++ b/jsx-pinia-vitest/src/components/HelloWorld.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 .
+
+
+
+
+
diff --git a/jsx-pinia-vitest/src/components/TheWelcome.vue b/jsx-pinia-vitest/src/components/TheWelcome.vue
new file mode 100644
index 00000000..cccc38ef
--- /dev/null
+++ b/jsx-pinia-vitest/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/jsx-pinia-vitest/src/components/WelcomeItem.vue b/jsx-pinia-vitest/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/jsx-pinia-vitest/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/jsx-pinia-vitest/src/components/__tests__/HelloWorld.spec.js b/jsx-pinia-vitest/src/components/__tests__/HelloWorld.spec.js
new file mode 100644
index 00000000..293bf197
--- /dev/null
+++ b/jsx-pinia-vitest/src/components/__tests__/HelloWorld.spec.js
@@ -0,0 +1,11 @@
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('renders properly', () => {
+ const wrapper = mount(HelloWorld, { propsData: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
+ })
+})
diff --git a/jsx-pinia-vitest/src/components/icons/IconCommunity.vue b/jsx-pinia-vitest/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/jsx-pinia-vitest/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-pinia-vitest/src/components/icons/IconDocumentation.vue b/jsx-pinia-vitest/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/jsx-pinia-vitest/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-pinia-vitest/src/components/icons/IconEcosystem.vue b/jsx-pinia-vitest/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/jsx-pinia-vitest/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-pinia-vitest/src/components/icons/IconSupport.vue b/jsx-pinia-vitest/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/jsx-pinia-vitest/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-pinia-vitest/src/components/icons/IconTooling.vue b/jsx-pinia-vitest/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/jsx-pinia-vitest/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/jsx-pinia-vitest/src/main.js b/jsx-pinia-vitest/src/main.js
new file mode 100644
index 00000000..febe0dbe
--- /dev/null
+++ b/jsx-pinia-vitest/src/main.js
@@ -0,0 +1,13 @@
+import Vue from 'vue'
+import { createPinia, PiniaVuePlugin } from 'pinia'
+
+import App from './App.vue'
+
+import './assets/main.css'
+
+Vue.use(PiniaVuePlugin)
+
+new Vue({
+ pinia: createPinia(),
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/jsx-pinia-vitest/src/stores/counter.js b/jsx-pinia-vitest/src/stores/counter.js
new file mode 100644
index 00000000..4a2d2427
--- /dev/null
+++ b/jsx-pinia-vitest/src/stores/counter.js
@@ -0,0 +1,16 @@
+import { defineStore } from 'pinia'
+
+export const useCounterStore = defineStore({
+ id: 'counter',
+ state: () => ({
+ counter: 0
+ }),
+ getters: {
+ doubleCount: (state) => state.counter * 2
+ },
+ actions: {
+ increment() {
+ this.counter++
+ }
+ }
+})
diff --git a/jsx-pinia-vitest/vite.config.js b/jsx-pinia-vitest/vite.config.js
new file mode 100644
index 00000000..54d7440f
--- /dev/null
+++ b/jsx-pinia-vitest/vite.config.js
@@ -0,0 +1,23 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+import vue2Jsx from '@vitejs/plugin-vue2-jsx'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ vue2Jsx(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/jsx-pinia-with-tests/README.md b/jsx-pinia-with-tests/README.md
index 9e8bcaa7..f71ec1da 100644
--- a/jsx-pinia-with-tests/README.md
+++ b/jsx-pinia-with-tests/README.md
@@ -4,7 +4,7 @@ This template should help get you started developing with Vue 3 in Vite.
## Recommended IDE Setup
-[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=johnsoncodehk.volar) (and disable Vetur).
+[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).
## Customize configuration
@@ -28,10 +28,10 @@ pnpm dev
pnpm build
```
-### Run Unit Tests with [Cypress Component Testing](https://docs.cypress.io/guides/component-testing/introduction)
+### Run Unit Tests with [Vitest](https://vitest.dev/)
```sh
-pnpm test:unit # or `pnpm test:unit:ci` for headless testing
+pnpm test:unit
```
### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
diff --git a/jsx-pinia-with-tests/cypress.config.js b/jsx-pinia-with-tests/cypress.config.js
new file mode 100644
index 00000000..9cf6a199
--- /dev/null
+++ b/jsx-pinia-with-tests/cypress.config.js
@@ -0,0 +1,8 @@
+const { defineConfig } = require('cypress')
+
+module.exports = defineConfig({
+ e2e: {
+ specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
+ baseUrl: 'http://localhost:4173/'
+ }
+})
diff --git a/jsx-pinia-with-tests/cypress.json b/jsx-pinia-with-tests/cypress.json
deleted file mode 100644
index 3d372252..00000000
--- a/jsx-pinia-with-tests/cypress.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "baseUrl": "http://localhost:5050/",
- "component": {
- "componentFolder": "src",
- "testFiles": "**/__tests__/*.spec.{js,ts,jsx,tsx}"
- }
-}
diff --git a/typescript-jsx-with-tests/cypress/integration/example.spec.ts b/jsx-pinia-with-tests/cypress/e2e/example.cy.js
similarity index 100%
rename from typescript-jsx-with-tests/cypress/integration/example.spec.ts
rename to jsx-pinia-with-tests/cypress/e2e/example.cy.js
diff --git a/jsx-pinia-with-tests/cypress/e2e/jsconfig.json b/jsx-pinia-with-tests/cypress/e2e/jsconfig.json
new file mode 100644
index 00000000..c790a70d
--- /dev/null
+++ b/jsx-pinia-with-tests/cypress/e2e/jsconfig.json
@@ -0,0 +1,8 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "lib": ["es5", "dom"],
+ "types": ["cypress"]
+ },
+ "include": ["./**/*", "../support/**/*"]
+}
diff --git a/jsx-pinia-with-tests/cypress/plugins/index.js b/jsx-pinia-with-tests/cypress/plugins/index.js
deleted file mode 100644
index ad2e351d..00000000
--- a/jsx-pinia-with-tests/cypress/plugins/index.js
+++ /dev/null
@@ -1,28 +0,0 @@
-///
-// ***********************************************************
-// This example plugins/index.js can be used to load plugins
-//
-// You can change the location of this file or turn off loading
-// the plugins file with the 'pluginsFile' configuration option.
-//
-// You can read more here:
-// https://on.cypress.io/plugins-guide
-// ***********************************************************
-
-// This function is called when a project is opened or re-opened (e.g. due to
-// the project's config changing)
-
-const { startDevServer } = require('@cypress/vite-dev-server')
-
-/**
- * @type {Cypress.PluginConfig}
- */
-// eslint-disable-next-line no-unused-vars
-module.exports = (on, config) => {
- // `on` is used to hook into various events Cypress emits
- // `config` is the resolved Cypress config
- on('dev-server:start', (options) => {
- return startDevServer({ options })
- })
- return config
-}
diff --git a/pinia-with-tests/cypress/support/index.js b/jsx-pinia-with-tests/cypress/support/e2e.js
similarity index 100%
rename from pinia-with-tests/cypress/support/index.js
rename to jsx-pinia-with-tests/cypress/support/e2e.js
diff --git a/jsx-pinia-with-tests/package.json b/jsx-pinia-with-tests/package.json
index 4d40b370..1cb9b724 100644
--- a/jsx-pinia-with-tests/package.json
+++ b/jsx-pinia-with-tests/package.json
@@ -4,23 +4,26 @@
"scripts": {
"dev": "vite",
"build": "vite build",
- "preview": "vite preview --port 5050",
- "test:unit": "cypress open-ct",
- "test:unit:ci": "cypress run-ct --quiet --reporter spec",
- "test:e2e": "start-server-and-test preview http://127.0.0.1:5050/ 'cypress open'",
- "test:e2e:ci": "start-server-and-test preview http://127.0.0.1:5050/ 'cypress run'"
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom",
+ "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
+ "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'"
},
"dependencies": {
- "pinia": "^2.0.4",
- "vue": "^3.2.22"
+ "pinia": "^2.0.16",
+ "vue": "^2.7.7"
},
"devDependencies": {
- "@cypress/vite-dev-server": "^2.2.1",
- "@cypress/vue": "^3.0.5",
- "@vitejs/plugin-vue": "^1.10.0",
- "@vitejs/plugin-vue-jsx": "^1.3.0",
- "cypress": "^8.7.0",
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vitejs/plugin-vue2-jsx": "^1.0.2",
+ "@vue/test-utils": "^1.3.0",
+ "cypress": "^10.3.0",
+ "jsdom": "^20.0.0",
"start-server-and-test": "^1.14.0",
- "vite": "^2.6.14"
+ "terser": "^5.14.2",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7"
}
}
diff --git a/jsx-pinia-with-tests/src/App.vue b/jsx-pinia-with-tests/src/App.vue
index b0b6901b..45fbfd94 100644
--- a/jsx-pinia-with-tests/src/App.vue
+++ b/jsx-pinia-with-tests/src/App.vue
@@ -4,30 +4,22 @@ import TheWelcome from './components/TheWelcome.vue'
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/jsx-pinia-with-tests/src/assets/main.css b/jsx-pinia-with-tests/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/jsx-pinia-with-tests/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/jsx-pinia-with-tests/src/components/HelloWorld.vue b/jsx-pinia-with-tests/src/components/HelloWorld.vue
index aa16fa1f..de8b576a 100644
--- a/jsx-pinia-with-tests/src/components/HelloWorld.vue
+++ b/jsx-pinia-with-tests/src/components/HelloWorld.vue
@@ -13,7 +13,7 @@ defineProps({
You’ve successfully created a project with
Vite +
- Vue 3 .
+ Vue 2 .
diff --git a/jsx-pinia-with-tests/src/components/TheWelcome.vue b/jsx-pinia-with-tests/src/components/TheWelcome.vue
index 1d003f86..cccc38ef 100644
--- a/jsx-pinia-with-tests/src/components/TheWelcome.vue
+++ b/jsx-pinia-with-tests/src/components/TheWelcome.vue
@@ -8,77 +8,79 @@ import SupportIcon from './icons/IconSupport.vue'
-
-
-
-
- Documentation
+
+
+
+
+
+ Documentation
- Vue’s
- official documentation
- provides you with all information you need to get started.
-
+ Vue’s
+
official documentation
+ provides you with all information you need to get started.
+
-
-
-
-
- Tooling
+
+
+
+
+ Tooling
- This project is served and bundled with
- Vite . The recommended IDE
- setup is VSCode +
- Volar . If you need to test
- your components and web pages, check out
- Cypress and
- Cypress Component Testing .
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
-
+
- More instructions are available in README.md
.
-
+ More instructions are available in README.md
.
+
-
-
-
-
- Ecosystem
+
+
+
+
+ Ecosystem
- Get official tools and libraries for your project:
- Vuex ,
- Vue Router ,
- Vue Test Utils , and
- Vue Dev Tools . If you need more
- resources, we suggest paying
- Awesome Vue
- a visit.
-
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
-
-
-
-
- Community
+
+
+
+
+ Community
- Got stuck? Ask your question on
- Vue Land , our official Discord server, or
- StackOverflow .
- You should also subscribe to
- our mailing list and follow the official
- @vuejs
- twitter account for latest news in the Vue world.
-
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
-
-
-
-
- Support Vue
+
+
+
+
+ Support Vue
- As an independent project, Vue relies on community backing for its sustainability. You can help
- us by
- becoming a sponsor .
-
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
diff --git a/jsx-pinia-with-tests/src/components/__tests__/HelloWorld.spec.js b/jsx-pinia-with-tests/src/components/__tests__/HelloWorld.spec.js
index a69f3a9d..293bf197 100644
--- a/jsx-pinia-with-tests/src/components/__tests__/HelloWorld.spec.js
+++ b/jsx-pinia-with-tests/src/components/__tests__/HelloWorld.spec.js
@@ -1,13 +1,11 @@
-import { mount } from '@cypress/vue'
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
import HelloWorld from '../HelloWorld.vue'
describe('HelloWorld', () => {
- it('playground', () => {
- mount(HelloWorld, { props: { msg: 'Hello Cypress' } })
- })
-
it('renders properly', () => {
- mount(HelloWorld, { props: { msg: 'Hello Cypress' } })
- cy.get('h1').should('contain', 'Hello Cypress')
+ const wrapper = mount(HelloWorld, { propsData: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
})
})
diff --git a/jsx-pinia-with-tests/src/components/icons/IconTooling.vue b/jsx-pinia-with-tests/src/components/icons/IconTooling.vue
index 660598d7..07dc46b0 100644
--- a/jsx-pinia-with-tests/src/components/icons/IconTooling.vue
+++ b/jsx-pinia-with-tests/src/components/icons/IconTooling.vue
@@ -2,8 +2,6 @@
h(App)
+}).$mount('#app')
diff --git a/jsx-pinia-with-tests/vite.config.js b/jsx-pinia-with-tests/vite.config.js
index f140f276..54d7440f 100644
--- a/jsx-pinia-with-tests/vite.config.js
+++ b/jsx-pinia-with-tests/vite.config.js
@@ -1,12 +1,20 @@
-import { fileURLToPath } from 'url'
+import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vite'
-import vue from '@vitejs/plugin-vue'
-import vueJsx from '@vitejs/plugin-vue-jsx'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+import vue2Jsx from '@vitejs/plugin-vue2-jsx'
// https://vitejs.dev/config/
export default defineConfig({
- plugins: [vue(), vueJsx()],
+ plugins: [
+ vue2(),
+ vue2Jsx(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
diff --git a/jsx-pinia/README.md b/jsx-pinia/README.md
index 4f10fb57..5e367cb1 100644
--- a/jsx-pinia/README.md
+++ b/jsx-pinia/README.md
@@ -4,7 +4,7 @@ This template should help get you started developing with Vue 3 in Vite.
## Recommended IDE Setup
-[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=johnsoncodehk.volar) (and disable Vetur).
+[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).
## Customize configuration
diff --git a/jsx-pinia/package.json b/jsx-pinia/package.json
index 36d69f1e..4c9d6627 100644
--- a/jsx-pinia/package.json
+++ b/jsx-pinia/package.json
@@ -4,15 +4,17 @@
"scripts": {
"dev": "vite",
"build": "vite build",
- "preview": "vite preview --port 5050"
+ "preview": "vite preview --port 4173"
},
"dependencies": {
- "pinia": "^2.0.4",
- "vue": "^3.2.22"
+ "pinia": "^2.0.16",
+ "vue": "^2.7.7"
},
"devDependencies": {
- "@vitejs/plugin-vue": "^1.10.0",
- "@vitejs/plugin-vue-jsx": "^1.3.0",
- "vite": "^2.6.14"
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vitejs/plugin-vue2-jsx": "^1.0.2",
+ "terser": "^5.14.2",
+ "vite": "^3.0.2"
}
}
diff --git a/jsx-pinia/src/App.vue b/jsx-pinia/src/App.vue
index b0b6901b..45fbfd94 100644
--- a/jsx-pinia/src/App.vue
+++ b/jsx-pinia/src/App.vue
@@ -4,30 +4,22 @@ import TheWelcome from './components/TheWelcome.vue'
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/jsx-pinia/src/assets/main.css b/jsx-pinia/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/jsx-pinia/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/jsx-pinia/src/components/HelloWorld.vue b/jsx-pinia/src/components/HelloWorld.vue
index aa16fa1f..de8b576a 100644
--- a/jsx-pinia/src/components/HelloWorld.vue
+++ b/jsx-pinia/src/components/HelloWorld.vue
@@ -13,7 +13,7 @@ defineProps({
You’ve successfully created a project with
Vite +
- Vue 3 .
+ Vue 2 .
diff --git a/jsx-pinia/src/components/TheWelcome.vue b/jsx-pinia/src/components/TheWelcome.vue
index 1d003f86..cccc38ef 100644
--- a/jsx-pinia/src/components/TheWelcome.vue
+++ b/jsx-pinia/src/components/TheWelcome.vue
@@ -8,77 +8,79 @@ import SupportIcon from './icons/IconSupport.vue'
-
-
-
-
- Documentation
+
+
+
+
+
+ Documentation
- Vue’s
- official documentation
- provides you with all information you need to get started.
-
+ Vue’s
+
official documentation
+ provides you with all information you need to get started.
+
-
-
-
-
- Tooling
+
+
+
+
+ Tooling
- This project is served and bundled with
- Vite . The recommended IDE
- setup is VSCode +
- Volar . If you need to test
- your components and web pages, check out
- Cypress and
- Cypress Component Testing .
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
-
+
- More instructions are available in README.md
.
-
+ More instructions are available in README.md
.
+
-
-
-
-
- Ecosystem
+
+
+
+
+ Ecosystem
- Get official tools and libraries for your project:
- Vuex ,
- Vue Router ,
- Vue Test Utils , and
- Vue Dev Tools . If you need more
- resources, we suggest paying
- Awesome Vue
- a visit.
-
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
-
-
-
-
- Community
+
+
+
+
+ Community
- Got stuck? Ask your question on
- Vue Land , our official Discord server, or
- StackOverflow .
- You should also subscribe to
- our mailing list and follow the official
- @vuejs
- twitter account for latest news in the Vue world.
-
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
-
-
-
-
- Support Vue
+
+
+
+
+ Support Vue
- As an independent project, Vue relies on community backing for its sustainability. You can help
- us by
- becoming a sponsor .
-
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
diff --git a/jsx-pinia/src/components/icons/IconTooling.vue b/jsx-pinia/src/components/icons/IconTooling.vue
index 660598d7..07dc46b0 100644
--- a/jsx-pinia/src/components/icons/IconTooling.vue
+++ b/jsx-pinia/src/components/icons/IconTooling.vue
@@ -2,8 +2,6 @@
h(App)
+}).$mount('#app')
diff --git a/jsx-pinia/vite.config.js b/jsx-pinia/vite.config.js
index f140f276..54d7440f 100644
--- a/jsx-pinia/vite.config.js
+++ b/jsx-pinia/vite.config.js
@@ -1,12 +1,20 @@
-import { fileURLToPath } from 'url'
+import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vite'
-import vue from '@vitejs/plugin-vue'
-import vueJsx from '@vitejs/plugin-vue-jsx'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+import vue2Jsx from '@vitejs/plugin-vue2-jsx'
// https://vitejs.dev/config/
export default defineConfig({
- plugins: [vue(), vueJsx()],
+ plugins: [
+ vue2(),
+ vue2Jsx(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
diff --git a/jsx-router-cypress/.gitignore b/jsx-router-cypress/.gitignore
new file mode 100644
index 00000000..133da84e
--- /dev/null
+++ b/jsx-router-cypress/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/jsx-router-cypress/README.md b/jsx-router-cypress/README.md
new file mode 100644
index 00000000..a52feb39
--- /dev/null
+++ b/jsx-router-cypress/README.md
@@ -0,0 +1,42 @@
+# jsx-router-cypress
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[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).
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Headed Component Tests with [Cypress Component Testing](https://on.cypress.io/component)
+
+```sh
+pnpm test:unit # or `pnpm test:unit:ci` for headless testing
+```
+
+### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
+
+```sh
+pnpm build
+pnpm test:e2e # or `pnpm test:e2e:ci` for headless testing
+```
diff --git a/jsx-router-cypress/cypress.config.js b/jsx-router-cypress/cypress.config.js
new file mode 100644
index 00000000..c3aba743
--- /dev/null
+++ b/jsx-router-cypress/cypress.config.js
@@ -0,0 +1,15 @@
+const { defineConfig } = require('cypress')
+
+module.exports = defineConfig({
+ e2e: {
+ specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
+ baseUrl: 'http://localhost:4173/'
+ },
+ component: {
+ specPattern: 'src/**/__tests__/*.{cy,spec}.{js,ts,jsx,tsx}',
+ devServer: {
+ framework: 'vue',
+ bundler: 'vite'
+ }
+ }
+})
diff --git a/typescript-pinia-with-tests/cypress/integration/example.spec.ts b/jsx-router-cypress/cypress/e2e/example.cy.js
similarity index 100%
rename from typescript-pinia-with-tests/cypress/integration/example.spec.ts
rename to jsx-router-cypress/cypress/e2e/example.cy.js
diff --git a/jsx-router-cypress/cypress/e2e/jsconfig.json b/jsx-router-cypress/cypress/e2e/jsconfig.json
new file mode 100644
index 00000000..c790a70d
--- /dev/null
+++ b/jsx-router-cypress/cypress/e2e/jsconfig.json
@@ -0,0 +1,8 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "lib": ["es5", "dom"],
+ "types": ["cypress"]
+ },
+ "include": ["./**/*", "../support/**/*"]
+}
diff --git a/jsx-router-cypress/cypress/fixtures/example.json b/jsx-router-cypress/cypress/fixtures/example.json
new file mode 100644
index 00000000..02e42543
--- /dev/null
+++ b/jsx-router-cypress/cypress/fixtures/example.json
@@ -0,0 +1,5 @@
+{
+ "name": "Using fixtures to represent data",
+ "email": "hello@cypress.io",
+ "body": "Fixtures are a great way to mock data for responses to routes"
+}
diff --git a/jsx-router-cypress/cypress/support/commands.js b/jsx-router-cypress/cypress/support/commands.js
new file mode 100644
index 00000000..119ab03f
--- /dev/null
+++ b/jsx-router-cypress/cypress/support/commands.js
@@ -0,0 +1,25 @@
+// ***********************************************
+// This example commands.js shows you how to
+// create various custom commands and overwrite
+// existing commands.
+//
+// For more comprehensive examples of custom
+// commands please read more here:
+// https://on.cypress.io/custom-commands
+// ***********************************************
+//
+//
+// -- This is a parent command --
+// Cypress.Commands.add('login', (email, password) => { ... })
+//
+//
+// -- This is a child command --
+// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
+//
+//
+// -- This is a dual command --
+// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
+//
+//
+// -- This will overwrite an existing command --
+// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
diff --git a/jsx-router-cypress/cypress/support/component-index.html b/jsx-router-cypress/cypress/support/component-index.html
new file mode 100644
index 00000000..5f9622ae
--- /dev/null
+++ b/jsx-router-cypress/cypress/support/component-index.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+ Components App
+
+
+
+
+
diff --git a/jsx-router-cypress/cypress/support/component.js b/jsx-router-cypress/cypress/support/component.js
new file mode 100644
index 00000000..9b98cf0e
--- /dev/null
+++ b/jsx-router-cypress/cypress/support/component.js
@@ -0,0 +1,30 @@
+// ***********************************************************
+// This example support/component.js is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
+
+// Import global styles
+import '@/assets/main.css'
+
+import { mount } from 'cypress/vue2'
+
+Cypress.Commands.add('mount', mount)
+
+// Example use:
+// cy.mount(MyComponent)
diff --git a/router-pinia-with-tests/cypress/support/index.js b/jsx-router-cypress/cypress/support/e2e.js
similarity index 100%
rename from router-pinia-with-tests/cypress/support/index.js
rename to jsx-router-cypress/cypress/support/e2e.js
diff --git a/jsx-router-cypress/index.html b/jsx-router-cypress/index.html
new file mode 100644
index 00000000..030a6ff5
--- /dev/null
+++ b/jsx-router-cypress/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/jsx-router-cypress/package.json b/jsx-router-cypress/package.json
new file mode 100644
index 00000000..dae1f8bc
--- /dev/null
+++ b/jsx-router-cypress/package.json
@@ -0,0 +1,26 @@
+{
+ "name": "jsx-router-cypress",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview --port 4173",
+ "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
+ "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'",
+ "test:unit": "cypress open --component",
+ "test:unit:ci": "cypress run --component --quiet --reporter spec"
+ },
+ "dependencies": {
+ "vue": "^2.7.7",
+ "vue-router": "^3.5.4"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vitejs/plugin-vue2-jsx": "^1.0.2",
+ "cypress": "^10.3.0",
+ "start-server-and-test": "^1.14.0",
+ "terser": "^5.14.2",
+ "vite": "^3.0.2"
+ }
+}
diff --git a/jsx-router-cypress/public/favicon.ico b/jsx-router-cypress/public/favicon.ico
new file mode 100644
index 00000000..df36fcfb
Binary files /dev/null and b/jsx-router-cypress/public/favicon.ico differ
diff --git a/jsx-router-cypress/src/App.vue b/jsx-router-cypress/src/App.vue
new file mode 100644
index 00000000..1f84c747
--- /dev/null
+++ b/jsx-router-cypress/src/App.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+ Home
+ About
+
+
+
+
+
+
+
+
+
diff --git a/jsx-router-cypress/src/assets/base.css b/jsx-router-cypress/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/jsx-router-cypress/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/jsx-router-cypress/src/assets/logo.svg b/jsx-router-cypress/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/jsx-router-cypress/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/jsx-router-cypress/src/assets/main.css b/jsx-router-cypress/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/jsx-router-cypress/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/jsx-router-cypress/src/components/HelloWorld.vue b/jsx-router-cypress/src/components/HelloWorld.vue
new file mode 100644
index 00000000..de8b576a
--- /dev/null
+++ b/jsx-router-cypress/src/components/HelloWorld.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 .
+
+
+
+
+
diff --git a/jsx-router-cypress/src/components/TheWelcome.vue b/jsx-router-cypress/src/components/TheWelcome.vue
new file mode 100644
index 00000000..cccc38ef
--- /dev/null
+++ b/jsx-router-cypress/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/jsx-router-cypress/src/components/WelcomeItem.vue b/jsx-router-cypress/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/jsx-router-cypress/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/jsx-router-cypress/src/components/__tests__/HelloWorld.cy.js b/jsx-router-cypress/src/components/__tests__/HelloWorld.cy.js
new file mode 100644
index 00000000..0e0c065a
--- /dev/null
+++ b/jsx-router-cypress/src/components/__tests__/HelloWorld.cy.js
@@ -0,0 +1,12 @@
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('playground', () => {
+ cy.mount(HelloWorld, { propsData: { msg: 'Hello Cypress' } })
+ })
+
+ it('renders properly', () => {
+ cy.mount(HelloWorld, { propsData: { msg: 'Hello Cypress' } })
+ cy.get('h1').should('contain', 'Hello Cypress')
+ })
+})
diff --git a/jsx-router-cypress/src/components/icons/IconCommunity.vue b/jsx-router-cypress/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/jsx-router-cypress/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-router-cypress/src/components/icons/IconDocumentation.vue b/jsx-router-cypress/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/jsx-router-cypress/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-router-cypress/src/components/icons/IconEcosystem.vue b/jsx-router-cypress/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/jsx-router-cypress/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-router-cypress/src/components/icons/IconSupport.vue b/jsx-router-cypress/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/jsx-router-cypress/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-router-cypress/src/components/icons/IconTooling.vue b/jsx-router-cypress/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/jsx-router-cypress/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/jsx-router-cypress/src/main.js b/jsx-router-cypress/src/main.js
new file mode 100644
index 00000000..4919cf77
--- /dev/null
+++ b/jsx-router-cypress/src/main.js
@@ -0,0 +1,11 @@
+import Vue from 'vue'
+
+import App from './App.vue'
+import router from './router'
+
+import './assets/main.css'
+
+new Vue({
+ router,
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/jsx-router-cypress/src/router/index.js b/jsx-router-cypress/src/router/index.js
new file mode 100644
index 00000000..cf9820b0
--- /dev/null
+++ b/jsx-router-cypress/src/router/index.js
@@ -0,0 +1,27 @@
+import Vue from 'vue'
+import VueRouter from 'vue-router'
+import HomeView from '../views/HomeView.vue'
+
+Vue.use(VueRouter)
+
+const router = new VueRouter({
+ mode: 'history',
+ base: import.meta.env.BASE_URL,
+ routes: [
+ {
+ path: '/',
+ name: 'home',
+ component: HomeView
+ },
+ {
+ path: '/about',
+ name: 'about',
+ // route level code-splitting
+ // this generates a separate chunk (About.[hash].js) for this route
+ // which is lazy-loaded when the route is visited.
+ component: () => import('../views/AboutView.vue')
+ }
+ ]
+})
+
+export default router
diff --git a/jsx-router-cypress/src/views/AboutView.vue b/jsx-router-cypress/src/views/AboutView.vue
new file mode 100644
index 00000000..756ad2a1
--- /dev/null
+++ b/jsx-router-cypress/src/views/AboutView.vue
@@ -0,0 +1,15 @@
+
+
+
This is an about page
+
+
+
+
diff --git a/jsx-router-cypress/src/views/HomeView.vue b/jsx-router-cypress/src/views/HomeView.vue
new file mode 100644
index 00000000..6555a646
--- /dev/null
+++ b/jsx-router-cypress/src/views/HomeView.vue
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/jsx-router-cypress/vite.config.js b/jsx-router-cypress/vite.config.js
new file mode 100644
index 00000000..54d7440f
--- /dev/null
+++ b/jsx-router-cypress/vite.config.js
@@ -0,0 +1,23 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+import vue2Jsx from '@vitejs/plugin-vue2-jsx'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ vue2Jsx(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/jsx-router-pinia-cypress/.gitignore b/jsx-router-pinia-cypress/.gitignore
new file mode 100644
index 00000000..133da84e
--- /dev/null
+++ b/jsx-router-pinia-cypress/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/jsx-router-pinia-cypress/README.md b/jsx-router-pinia-cypress/README.md
new file mode 100644
index 00000000..2c518d60
--- /dev/null
+++ b/jsx-router-pinia-cypress/README.md
@@ -0,0 +1,42 @@
+# jsx-router-pinia-cypress
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[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).
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Headed Component Tests with [Cypress Component Testing](https://on.cypress.io/component)
+
+```sh
+pnpm test:unit # or `pnpm test:unit:ci` for headless testing
+```
+
+### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
+
+```sh
+pnpm build
+pnpm test:e2e # or `pnpm test:e2e:ci` for headless testing
+```
diff --git a/jsx-router-pinia-cypress/cypress.config.js b/jsx-router-pinia-cypress/cypress.config.js
new file mode 100644
index 00000000..c3aba743
--- /dev/null
+++ b/jsx-router-pinia-cypress/cypress.config.js
@@ -0,0 +1,15 @@
+const { defineConfig } = require('cypress')
+
+module.exports = defineConfig({
+ e2e: {
+ specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
+ baseUrl: 'http://localhost:4173/'
+ },
+ component: {
+ specPattern: 'src/**/__tests__/*.{cy,spec}.{js,ts,jsx,tsx}',
+ devServer: {
+ framework: 'vue',
+ bundler: 'vite'
+ }
+ }
+})
diff --git a/typescript-with-tests/cypress/integration/example.spec.ts b/jsx-router-pinia-cypress/cypress/e2e/example.cy.js
similarity index 100%
rename from typescript-with-tests/cypress/integration/example.spec.ts
rename to jsx-router-pinia-cypress/cypress/e2e/example.cy.js
diff --git a/jsx-router-pinia-cypress/cypress/e2e/jsconfig.json b/jsx-router-pinia-cypress/cypress/e2e/jsconfig.json
new file mode 100644
index 00000000..c790a70d
--- /dev/null
+++ b/jsx-router-pinia-cypress/cypress/e2e/jsconfig.json
@@ -0,0 +1,8 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "lib": ["es5", "dom"],
+ "types": ["cypress"]
+ },
+ "include": ["./**/*", "../support/**/*"]
+}
diff --git a/jsx-router-pinia-cypress/cypress/fixtures/example.json b/jsx-router-pinia-cypress/cypress/fixtures/example.json
new file mode 100644
index 00000000..02e42543
--- /dev/null
+++ b/jsx-router-pinia-cypress/cypress/fixtures/example.json
@@ -0,0 +1,5 @@
+{
+ "name": "Using fixtures to represent data",
+ "email": "hello@cypress.io",
+ "body": "Fixtures are a great way to mock data for responses to routes"
+}
diff --git a/jsx-router-pinia-cypress/cypress/support/commands.js b/jsx-router-pinia-cypress/cypress/support/commands.js
new file mode 100644
index 00000000..119ab03f
--- /dev/null
+++ b/jsx-router-pinia-cypress/cypress/support/commands.js
@@ -0,0 +1,25 @@
+// ***********************************************
+// This example commands.js shows you how to
+// create various custom commands and overwrite
+// existing commands.
+//
+// For more comprehensive examples of custom
+// commands please read more here:
+// https://on.cypress.io/custom-commands
+// ***********************************************
+//
+//
+// -- This is a parent command --
+// Cypress.Commands.add('login', (email, password) => { ... })
+//
+//
+// -- This is a child command --
+// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
+//
+//
+// -- This is a dual command --
+// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
+//
+//
+// -- This will overwrite an existing command --
+// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
diff --git a/jsx-router-pinia-cypress/cypress/support/component-index.html b/jsx-router-pinia-cypress/cypress/support/component-index.html
new file mode 100644
index 00000000..5f9622ae
--- /dev/null
+++ b/jsx-router-pinia-cypress/cypress/support/component-index.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+ Components App
+
+
+
+
+
diff --git a/jsx-router-pinia-cypress/cypress/support/component.js b/jsx-router-pinia-cypress/cypress/support/component.js
new file mode 100644
index 00000000..9b98cf0e
--- /dev/null
+++ b/jsx-router-pinia-cypress/cypress/support/component.js
@@ -0,0 +1,30 @@
+// ***********************************************************
+// This example support/component.js is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
+
+// Import global styles
+import '@/assets/main.css'
+
+import { mount } from 'cypress/vue2'
+
+Cypress.Commands.add('mount', mount)
+
+// Example use:
+// cy.mount(MyComponent)
diff --git a/router-with-tests/cypress/support/index.js b/jsx-router-pinia-cypress/cypress/support/e2e.js
similarity index 100%
rename from router-with-tests/cypress/support/index.js
rename to jsx-router-pinia-cypress/cypress/support/e2e.js
diff --git a/jsx-router-pinia-cypress/index.html b/jsx-router-pinia-cypress/index.html
new file mode 100644
index 00000000..030a6ff5
--- /dev/null
+++ b/jsx-router-pinia-cypress/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/jsx-router-pinia-cypress/package.json b/jsx-router-pinia-cypress/package.json
new file mode 100644
index 00000000..16ec2f6b
--- /dev/null
+++ b/jsx-router-pinia-cypress/package.json
@@ -0,0 +1,27 @@
+{
+ "name": "jsx-router-pinia-cypress",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview --port 4173",
+ "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
+ "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'",
+ "test:unit": "cypress open --component",
+ "test:unit:ci": "cypress run --component --quiet --reporter spec"
+ },
+ "dependencies": {
+ "pinia": "^2.0.16",
+ "vue": "^2.7.7",
+ "vue-router": "^3.5.4"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vitejs/plugin-vue2-jsx": "^1.0.2",
+ "cypress": "^10.3.0",
+ "start-server-and-test": "^1.14.0",
+ "terser": "^5.14.2",
+ "vite": "^3.0.2"
+ }
+}
diff --git a/jsx-router-pinia-cypress/public/favicon.ico b/jsx-router-pinia-cypress/public/favicon.ico
new file mode 100644
index 00000000..df36fcfb
Binary files /dev/null and b/jsx-router-pinia-cypress/public/favicon.ico differ
diff --git a/jsx-router-pinia-cypress/src/App.vue b/jsx-router-pinia-cypress/src/App.vue
new file mode 100644
index 00000000..1f84c747
--- /dev/null
+++ b/jsx-router-pinia-cypress/src/App.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+ Home
+ About
+
+
+
+
+
+
+
+
+
diff --git a/jsx-router-pinia-cypress/src/assets/base.css b/jsx-router-pinia-cypress/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/jsx-router-pinia-cypress/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/jsx-router-pinia-cypress/src/assets/logo.svg b/jsx-router-pinia-cypress/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/jsx-router-pinia-cypress/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/jsx-router-pinia-cypress/src/assets/main.css b/jsx-router-pinia-cypress/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/jsx-router-pinia-cypress/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/jsx-router-pinia-cypress/src/components/HelloWorld.vue b/jsx-router-pinia-cypress/src/components/HelloWorld.vue
new file mode 100644
index 00000000..de8b576a
--- /dev/null
+++ b/jsx-router-pinia-cypress/src/components/HelloWorld.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 .
+
+
+
+
+
diff --git a/jsx-router-pinia-cypress/src/components/TheWelcome.vue b/jsx-router-pinia-cypress/src/components/TheWelcome.vue
new file mode 100644
index 00000000..cccc38ef
--- /dev/null
+++ b/jsx-router-pinia-cypress/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/jsx-router-pinia-cypress/src/components/WelcomeItem.vue b/jsx-router-pinia-cypress/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/jsx-router-pinia-cypress/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/jsx-router-pinia-cypress/src/components/__tests__/HelloWorld.cy.js b/jsx-router-pinia-cypress/src/components/__tests__/HelloWorld.cy.js
new file mode 100644
index 00000000..0e0c065a
--- /dev/null
+++ b/jsx-router-pinia-cypress/src/components/__tests__/HelloWorld.cy.js
@@ -0,0 +1,12 @@
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('playground', () => {
+ cy.mount(HelloWorld, { propsData: { msg: 'Hello Cypress' } })
+ })
+
+ it('renders properly', () => {
+ cy.mount(HelloWorld, { propsData: { msg: 'Hello Cypress' } })
+ cy.get('h1').should('contain', 'Hello Cypress')
+ })
+})
diff --git a/jsx-router-pinia-cypress/src/components/icons/IconCommunity.vue b/jsx-router-pinia-cypress/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/jsx-router-pinia-cypress/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-router-pinia-cypress/src/components/icons/IconDocumentation.vue b/jsx-router-pinia-cypress/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/jsx-router-pinia-cypress/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-router-pinia-cypress/src/components/icons/IconEcosystem.vue b/jsx-router-pinia-cypress/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/jsx-router-pinia-cypress/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-router-pinia-cypress/src/components/icons/IconSupport.vue b/jsx-router-pinia-cypress/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/jsx-router-pinia-cypress/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-router-pinia-cypress/src/components/icons/IconTooling.vue b/jsx-router-pinia-cypress/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/jsx-router-pinia-cypress/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/jsx-router-pinia-cypress/src/main.js b/jsx-router-pinia-cypress/src/main.js
new file mode 100644
index 00000000..e11e78e0
--- /dev/null
+++ b/jsx-router-pinia-cypress/src/main.js
@@ -0,0 +1,15 @@
+import Vue from 'vue'
+import { createPinia, PiniaVuePlugin } from 'pinia'
+
+import App from './App.vue'
+import router from './router'
+
+import './assets/main.css'
+
+Vue.use(PiniaVuePlugin)
+
+new Vue({
+ router,
+ pinia: createPinia(),
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/jsx-router-pinia-cypress/src/router/index.js b/jsx-router-pinia-cypress/src/router/index.js
new file mode 100644
index 00000000..cf9820b0
--- /dev/null
+++ b/jsx-router-pinia-cypress/src/router/index.js
@@ -0,0 +1,27 @@
+import Vue from 'vue'
+import VueRouter from 'vue-router'
+import HomeView from '../views/HomeView.vue'
+
+Vue.use(VueRouter)
+
+const router = new VueRouter({
+ mode: 'history',
+ base: import.meta.env.BASE_URL,
+ routes: [
+ {
+ path: '/',
+ name: 'home',
+ component: HomeView
+ },
+ {
+ path: '/about',
+ name: 'about',
+ // route level code-splitting
+ // this generates a separate chunk (About.[hash].js) for this route
+ // which is lazy-loaded when the route is visited.
+ component: () => import('../views/AboutView.vue')
+ }
+ ]
+})
+
+export default router
diff --git a/jsx-router-pinia-cypress/src/stores/counter.js b/jsx-router-pinia-cypress/src/stores/counter.js
new file mode 100644
index 00000000..4a2d2427
--- /dev/null
+++ b/jsx-router-pinia-cypress/src/stores/counter.js
@@ -0,0 +1,16 @@
+import { defineStore } from 'pinia'
+
+export const useCounterStore = defineStore({
+ id: 'counter',
+ state: () => ({
+ counter: 0
+ }),
+ getters: {
+ doubleCount: (state) => state.counter * 2
+ },
+ actions: {
+ increment() {
+ this.counter++
+ }
+ }
+})
diff --git a/jsx-router-pinia-cypress/src/views/AboutView.vue b/jsx-router-pinia-cypress/src/views/AboutView.vue
new file mode 100644
index 00000000..756ad2a1
--- /dev/null
+++ b/jsx-router-pinia-cypress/src/views/AboutView.vue
@@ -0,0 +1,15 @@
+
+
+
This is an about page
+
+
+
+
diff --git a/jsx-router-pinia-cypress/src/views/HomeView.vue b/jsx-router-pinia-cypress/src/views/HomeView.vue
new file mode 100644
index 00000000..6555a646
--- /dev/null
+++ b/jsx-router-pinia-cypress/src/views/HomeView.vue
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/jsx-router-pinia-cypress/vite.config.js b/jsx-router-pinia-cypress/vite.config.js
new file mode 100644
index 00000000..54d7440f
--- /dev/null
+++ b/jsx-router-pinia-cypress/vite.config.js
@@ -0,0 +1,23 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+import vue2Jsx from '@vitejs/plugin-vue2-jsx'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ vue2Jsx(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/jsx-router-pinia-vitest-cypress/.gitignore b/jsx-router-pinia-vitest-cypress/.gitignore
new file mode 100644
index 00000000..133da84e
--- /dev/null
+++ b/jsx-router-pinia-vitest-cypress/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/jsx-router-pinia-vitest-cypress/README.md b/jsx-router-pinia-vitest-cypress/README.md
new file mode 100644
index 00000000..7a8130ad
--- /dev/null
+++ b/jsx-router-pinia-vitest-cypress/README.md
@@ -0,0 +1,42 @@
+# jsx-router-pinia-vitest-cypress
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[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).
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Unit Tests with [Vitest](https://vitest.dev/)
+
+```sh
+pnpm test:unit
+```
+
+### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
+
+```sh
+pnpm build
+pnpm test:e2e # or `pnpm test:e2e:ci` for headless testing
+```
diff --git a/jsx-router-pinia-vitest-cypress/cypress.config.js b/jsx-router-pinia-vitest-cypress/cypress.config.js
new file mode 100644
index 00000000..9cf6a199
--- /dev/null
+++ b/jsx-router-pinia-vitest-cypress/cypress.config.js
@@ -0,0 +1,8 @@
+const { defineConfig } = require('cypress')
+
+module.exports = defineConfig({
+ e2e: {
+ specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
+ baseUrl: 'http://localhost:4173/'
+ }
+})
diff --git a/with-tests/cypress/integration/example.spec.js b/jsx-router-pinia-vitest-cypress/cypress/e2e/example.cy.js
similarity index 100%
rename from with-tests/cypress/integration/example.spec.js
rename to jsx-router-pinia-vitest-cypress/cypress/e2e/example.cy.js
diff --git a/jsx-router-pinia-vitest-cypress/cypress/e2e/jsconfig.json b/jsx-router-pinia-vitest-cypress/cypress/e2e/jsconfig.json
new file mode 100644
index 00000000..c790a70d
--- /dev/null
+++ b/jsx-router-pinia-vitest-cypress/cypress/e2e/jsconfig.json
@@ -0,0 +1,8 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "lib": ["es5", "dom"],
+ "types": ["cypress"]
+ },
+ "include": ["./**/*", "../support/**/*"]
+}
diff --git a/jsx-router-pinia-vitest-cypress/cypress/fixtures/example.json b/jsx-router-pinia-vitest-cypress/cypress/fixtures/example.json
new file mode 100644
index 00000000..02e42543
--- /dev/null
+++ b/jsx-router-pinia-vitest-cypress/cypress/fixtures/example.json
@@ -0,0 +1,5 @@
+{
+ "name": "Using fixtures to represent data",
+ "email": "hello@cypress.io",
+ "body": "Fixtures are a great way to mock data for responses to routes"
+}
diff --git a/jsx-router-pinia-vitest-cypress/cypress/support/commands.js b/jsx-router-pinia-vitest-cypress/cypress/support/commands.js
new file mode 100644
index 00000000..119ab03f
--- /dev/null
+++ b/jsx-router-pinia-vitest-cypress/cypress/support/commands.js
@@ -0,0 +1,25 @@
+// ***********************************************
+// This example commands.js shows you how to
+// create various custom commands and overwrite
+// existing commands.
+//
+// For more comprehensive examples of custom
+// commands please read more here:
+// https://on.cypress.io/custom-commands
+// ***********************************************
+//
+//
+// -- This is a parent command --
+// Cypress.Commands.add('login', (email, password) => { ... })
+//
+//
+// -- This is a child command --
+// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
+//
+//
+// -- This is a dual command --
+// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
+//
+//
+// -- This will overwrite an existing command --
+// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
diff --git a/typescript-jsx-pinia-with-tests/cypress/support/index.ts b/jsx-router-pinia-vitest-cypress/cypress/support/e2e.js
similarity index 100%
rename from typescript-jsx-pinia-with-tests/cypress/support/index.ts
rename to jsx-router-pinia-vitest-cypress/cypress/support/e2e.js
diff --git a/jsx-router-pinia-vitest-cypress/index.html b/jsx-router-pinia-vitest-cypress/index.html
new file mode 100644
index 00000000..030a6ff5
--- /dev/null
+++ b/jsx-router-pinia-vitest-cypress/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/jsx-router-pinia-vitest-cypress/package.json b/jsx-router-pinia-vitest-cypress/package.json
new file mode 100644
index 00000000..d83369a4
--- /dev/null
+++ b/jsx-router-pinia-vitest-cypress/package.json
@@ -0,0 +1,30 @@
+{
+ "name": "jsx-router-pinia-vitest-cypress",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom",
+ "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
+ "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'"
+ },
+ "dependencies": {
+ "pinia": "^2.0.16",
+ "vue": "^2.7.7",
+ "vue-router": "^3.5.4"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vitejs/plugin-vue2-jsx": "^1.0.2",
+ "@vue/test-utils": "^1.3.0",
+ "cypress": "^10.3.0",
+ "jsdom": "^20.0.0",
+ "start-server-and-test": "^1.14.0",
+ "terser": "^5.14.2",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7"
+ }
+}
diff --git a/jsx-router-pinia-vitest-cypress/public/favicon.ico b/jsx-router-pinia-vitest-cypress/public/favicon.ico
new file mode 100644
index 00000000..df36fcfb
Binary files /dev/null and b/jsx-router-pinia-vitest-cypress/public/favicon.ico differ
diff --git a/jsx-router-pinia-vitest-cypress/src/App.vue b/jsx-router-pinia-vitest-cypress/src/App.vue
new file mode 100644
index 00000000..1f84c747
--- /dev/null
+++ b/jsx-router-pinia-vitest-cypress/src/App.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+ Home
+ About
+
+
+
+
+
+
+
+
+
diff --git a/jsx-router-pinia-vitest-cypress/src/assets/base.css b/jsx-router-pinia-vitest-cypress/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/jsx-router-pinia-vitest-cypress/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/jsx-router-pinia-vitest-cypress/src/assets/logo.svg b/jsx-router-pinia-vitest-cypress/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/jsx-router-pinia-vitest-cypress/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/jsx-router-pinia-vitest-cypress/src/assets/main.css b/jsx-router-pinia-vitest-cypress/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/jsx-router-pinia-vitest-cypress/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/jsx-router-pinia-vitest-cypress/src/components/HelloWorld.vue b/jsx-router-pinia-vitest-cypress/src/components/HelloWorld.vue
new file mode 100644
index 00000000..de8b576a
--- /dev/null
+++ b/jsx-router-pinia-vitest-cypress/src/components/HelloWorld.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 .
+
+
+
+
+
diff --git a/jsx-router-pinia-vitest-cypress/src/components/TheWelcome.vue b/jsx-router-pinia-vitest-cypress/src/components/TheWelcome.vue
new file mode 100644
index 00000000..cccc38ef
--- /dev/null
+++ b/jsx-router-pinia-vitest-cypress/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/jsx-router-pinia-vitest-cypress/src/components/WelcomeItem.vue b/jsx-router-pinia-vitest-cypress/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/jsx-router-pinia-vitest-cypress/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/jsx-router-pinia-vitest-cypress/src/components/__tests__/HelloWorld.spec.js b/jsx-router-pinia-vitest-cypress/src/components/__tests__/HelloWorld.spec.js
new file mode 100644
index 00000000..293bf197
--- /dev/null
+++ b/jsx-router-pinia-vitest-cypress/src/components/__tests__/HelloWorld.spec.js
@@ -0,0 +1,11 @@
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('renders properly', () => {
+ const wrapper = mount(HelloWorld, { propsData: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
+ })
+})
diff --git a/jsx-router-pinia-vitest-cypress/src/components/icons/IconCommunity.vue b/jsx-router-pinia-vitest-cypress/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/jsx-router-pinia-vitest-cypress/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-router-pinia-vitest-cypress/src/components/icons/IconDocumentation.vue b/jsx-router-pinia-vitest-cypress/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/jsx-router-pinia-vitest-cypress/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-router-pinia-vitest-cypress/src/components/icons/IconEcosystem.vue b/jsx-router-pinia-vitest-cypress/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/jsx-router-pinia-vitest-cypress/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-router-pinia-vitest-cypress/src/components/icons/IconSupport.vue b/jsx-router-pinia-vitest-cypress/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/jsx-router-pinia-vitest-cypress/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-router-pinia-vitest-cypress/src/components/icons/IconTooling.vue b/jsx-router-pinia-vitest-cypress/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/jsx-router-pinia-vitest-cypress/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/jsx-router-pinia-vitest-cypress/src/main.js b/jsx-router-pinia-vitest-cypress/src/main.js
new file mode 100644
index 00000000..e11e78e0
--- /dev/null
+++ b/jsx-router-pinia-vitest-cypress/src/main.js
@@ -0,0 +1,15 @@
+import Vue from 'vue'
+import { createPinia, PiniaVuePlugin } from 'pinia'
+
+import App from './App.vue'
+import router from './router'
+
+import './assets/main.css'
+
+Vue.use(PiniaVuePlugin)
+
+new Vue({
+ router,
+ pinia: createPinia(),
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/jsx-router-pinia-vitest-cypress/src/router/index.js b/jsx-router-pinia-vitest-cypress/src/router/index.js
new file mode 100644
index 00000000..cf9820b0
--- /dev/null
+++ b/jsx-router-pinia-vitest-cypress/src/router/index.js
@@ -0,0 +1,27 @@
+import Vue from 'vue'
+import VueRouter from 'vue-router'
+import HomeView from '../views/HomeView.vue'
+
+Vue.use(VueRouter)
+
+const router = new VueRouter({
+ mode: 'history',
+ base: import.meta.env.BASE_URL,
+ routes: [
+ {
+ path: '/',
+ name: 'home',
+ component: HomeView
+ },
+ {
+ path: '/about',
+ name: 'about',
+ // route level code-splitting
+ // this generates a separate chunk (About.[hash].js) for this route
+ // which is lazy-loaded when the route is visited.
+ component: () => import('../views/AboutView.vue')
+ }
+ ]
+})
+
+export default router
diff --git a/jsx-router-pinia-vitest-cypress/src/stores/counter.js b/jsx-router-pinia-vitest-cypress/src/stores/counter.js
new file mode 100644
index 00000000..4a2d2427
--- /dev/null
+++ b/jsx-router-pinia-vitest-cypress/src/stores/counter.js
@@ -0,0 +1,16 @@
+import { defineStore } from 'pinia'
+
+export const useCounterStore = defineStore({
+ id: 'counter',
+ state: () => ({
+ counter: 0
+ }),
+ getters: {
+ doubleCount: (state) => state.counter * 2
+ },
+ actions: {
+ increment() {
+ this.counter++
+ }
+ }
+})
diff --git a/jsx-router-pinia-vitest-cypress/src/views/AboutView.vue b/jsx-router-pinia-vitest-cypress/src/views/AboutView.vue
new file mode 100644
index 00000000..756ad2a1
--- /dev/null
+++ b/jsx-router-pinia-vitest-cypress/src/views/AboutView.vue
@@ -0,0 +1,15 @@
+
+
+
This is an about page
+
+
+
+
diff --git a/jsx-router-pinia-vitest-cypress/src/views/HomeView.vue b/jsx-router-pinia-vitest-cypress/src/views/HomeView.vue
new file mode 100644
index 00000000..6555a646
--- /dev/null
+++ b/jsx-router-pinia-vitest-cypress/src/views/HomeView.vue
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/jsx-router-pinia-vitest-cypress/vite.config.js b/jsx-router-pinia-vitest-cypress/vite.config.js
new file mode 100644
index 00000000..54d7440f
--- /dev/null
+++ b/jsx-router-pinia-vitest-cypress/vite.config.js
@@ -0,0 +1,23 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+import vue2Jsx from '@vitejs/plugin-vue2-jsx'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ vue2Jsx(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/jsx-router-pinia-vitest/.gitignore b/jsx-router-pinia-vitest/.gitignore
new file mode 100644
index 00000000..133da84e
--- /dev/null
+++ b/jsx-router-pinia-vitest/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/jsx-router-pinia-vitest/README.md b/jsx-router-pinia-vitest/README.md
new file mode 100644
index 00000000..8421cc83
--- /dev/null
+++ b/jsx-router-pinia-vitest/README.md
@@ -0,0 +1,35 @@
+# jsx-router-pinia-vitest
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[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).
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Unit Tests with [Vitest](https://vitest.dev/)
+
+```sh
+pnpm test:unit
+```
diff --git a/jsx-router-pinia-vitest/index.html b/jsx-router-pinia-vitest/index.html
new file mode 100644
index 00000000..030a6ff5
--- /dev/null
+++ b/jsx-router-pinia-vitest/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/jsx-router-pinia-vitest/package.json b/jsx-router-pinia-vitest/package.json
new file mode 100644
index 00000000..0db653c9
--- /dev/null
+++ b/jsx-router-pinia-vitest/package.json
@@ -0,0 +1,26 @@
+{
+ "name": "jsx-router-pinia-vitest",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom"
+ },
+ "dependencies": {
+ "pinia": "^2.0.16",
+ "vue": "^2.7.7",
+ "vue-router": "^3.5.4"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vitejs/plugin-vue2-jsx": "^1.0.2",
+ "@vue/test-utils": "^1.3.0",
+ "jsdom": "^20.0.0",
+ "terser": "^5.14.2",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7"
+ }
+}
diff --git a/jsx-router-pinia-vitest/public/favicon.ico b/jsx-router-pinia-vitest/public/favicon.ico
new file mode 100644
index 00000000..df36fcfb
Binary files /dev/null and b/jsx-router-pinia-vitest/public/favicon.ico differ
diff --git a/jsx-router-pinia-vitest/src/App.vue b/jsx-router-pinia-vitest/src/App.vue
new file mode 100644
index 00000000..1f84c747
--- /dev/null
+++ b/jsx-router-pinia-vitest/src/App.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+ Home
+ About
+
+
+
+
+
+
+
+
+
diff --git a/jsx-router-pinia-vitest/src/assets/base.css b/jsx-router-pinia-vitest/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/jsx-router-pinia-vitest/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/jsx-router-pinia-vitest/src/assets/logo.svg b/jsx-router-pinia-vitest/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/jsx-router-pinia-vitest/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/jsx-router-pinia-vitest/src/assets/main.css b/jsx-router-pinia-vitest/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/jsx-router-pinia-vitest/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/jsx-router-pinia-vitest/src/components/HelloWorld.vue b/jsx-router-pinia-vitest/src/components/HelloWorld.vue
new file mode 100644
index 00000000..de8b576a
--- /dev/null
+++ b/jsx-router-pinia-vitest/src/components/HelloWorld.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 .
+
+
+
+
+
diff --git a/jsx-router-pinia-vitest/src/components/TheWelcome.vue b/jsx-router-pinia-vitest/src/components/TheWelcome.vue
new file mode 100644
index 00000000..cccc38ef
--- /dev/null
+++ b/jsx-router-pinia-vitest/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/jsx-router-pinia-vitest/src/components/WelcomeItem.vue b/jsx-router-pinia-vitest/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/jsx-router-pinia-vitest/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/jsx-router-pinia-vitest/src/components/__tests__/HelloWorld.spec.js b/jsx-router-pinia-vitest/src/components/__tests__/HelloWorld.spec.js
new file mode 100644
index 00000000..293bf197
--- /dev/null
+++ b/jsx-router-pinia-vitest/src/components/__tests__/HelloWorld.spec.js
@@ -0,0 +1,11 @@
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('renders properly', () => {
+ const wrapper = mount(HelloWorld, { propsData: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
+ })
+})
diff --git a/jsx-router-pinia-vitest/src/components/icons/IconCommunity.vue b/jsx-router-pinia-vitest/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/jsx-router-pinia-vitest/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-router-pinia-vitest/src/components/icons/IconDocumentation.vue b/jsx-router-pinia-vitest/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/jsx-router-pinia-vitest/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-router-pinia-vitest/src/components/icons/IconEcosystem.vue b/jsx-router-pinia-vitest/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/jsx-router-pinia-vitest/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-router-pinia-vitest/src/components/icons/IconSupport.vue b/jsx-router-pinia-vitest/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/jsx-router-pinia-vitest/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-router-pinia-vitest/src/components/icons/IconTooling.vue b/jsx-router-pinia-vitest/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/jsx-router-pinia-vitest/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/jsx-router-pinia-vitest/src/main.js b/jsx-router-pinia-vitest/src/main.js
new file mode 100644
index 00000000..e11e78e0
--- /dev/null
+++ b/jsx-router-pinia-vitest/src/main.js
@@ -0,0 +1,15 @@
+import Vue from 'vue'
+import { createPinia, PiniaVuePlugin } from 'pinia'
+
+import App from './App.vue'
+import router from './router'
+
+import './assets/main.css'
+
+Vue.use(PiniaVuePlugin)
+
+new Vue({
+ router,
+ pinia: createPinia(),
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/jsx-router-pinia-vitest/src/router/index.js b/jsx-router-pinia-vitest/src/router/index.js
new file mode 100644
index 00000000..cf9820b0
--- /dev/null
+++ b/jsx-router-pinia-vitest/src/router/index.js
@@ -0,0 +1,27 @@
+import Vue from 'vue'
+import VueRouter from 'vue-router'
+import HomeView from '../views/HomeView.vue'
+
+Vue.use(VueRouter)
+
+const router = new VueRouter({
+ mode: 'history',
+ base: import.meta.env.BASE_URL,
+ routes: [
+ {
+ path: '/',
+ name: 'home',
+ component: HomeView
+ },
+ {
+ path: '/about',
+ name: 'about',
+ // route level code-splitting
+ // this generates a separate chunk (About.[hash].js) for this route
+ // which is lazy-loaded when the route is visited.
+ component: () => import('../views/AboutView.vue')
+ }
+ ]
+})
+
+export default router
diff --git a/jsx-router-pinia-vitest/src/stores/counter.js b/jsx-router-pinia-vitest/src/stores/counter.js
new file mode 100644
index 00000000..4a2d2427
--- /dev/null
+++ b/jsx-router-pinia-vitest/src/stores/counter.js
@@ -0,0 +1,16 @@
+import { defineStore } from 'pinia'
+
+export const useCounterStore = defineStore({
+ id: 'counter',
+ state: () => ({
+ counter: 0
+ }),
+ getters: {
+ doubleCount: (state) => state.counter * 2
+ },
+ actions: {
+ increment() {
+ this.counter++
+ }
+ }
+})
diff --git a/jsx-router-pinia-vitest/src/views/AboutView.vue b/jsx-router-pinia-vitest/src/views/AboutView.vue
new file mode 100644
index 00000000..756ad2a1
--- /dev/null
+++ b/jsx-router-pinia-vitest/src/views/AboutView.vue
@@ -0,0 +1,15 @@
+
+
+
This is an about page
+
+
+
+
diff --git a/jsx-router-pinia-vitest/src/views/HomeView.vue b/jsx-router-pinia-vitest/src/views/HomeView.vue
new file mode 100644
index 00000000..6555a646
--- /dev/null
+++ b/jsx-router-pinia-vitest/src/views/HomeView.vue
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/jsx-router-pinia-vitest/vite.config.js b/jsx-router-pinia-vitest/vite.config.js
new file mode 100644
index 00000000..54d7440f
--- /dev/null
+++ b/jsx-router-pinia-vitest/vite.config.js
@@ -0,0 +1,23 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+import vue2Jsx from '@vitejs/plugin-vue2-jsx'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ vue2Jsx(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/jsx-router-pinia-with-tests/README.md b/jsx-router-pinia-with-tests/README.md
index 10533b71..1921e130 100644
--- a/jsx-router-pinia-with-tests/README.md
+++ b/jsx-router-pinia-with-tests/README.md
@@ -4,7 +4,7 @@ This template should help get you started developing with Vue 3 in Vite.
## Recommended IDE Setup
-[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=johnsoncodehk.volar) (and disable Vetur).
+[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).
## Customize configuration
@@ -28,10 +28,10 @@ pnpm dev
pnpm build
```
-### Run Unit Tests with [Cypress Component Testing](https://docs.cypress.io/guides/component-testing/introduction)
+### Run Unit Tests with [Vitest](https://vitest.dev/)
```sh
-pnpm test:unit # or `pnpm test:unit:ci` for headless testing
+pnpm test:unit
```
### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
diff --git a/jsx-router-pinia-with-tests/cypress.config.js b/jsx-router-pinia-with-tests/cypress.config.js
new file mode 100644
index 00000000..9cf6a199
--- /dev/null
+++ b/jsx-router-pinia-with-tests/cypress.config.js
@@ -0,0 +1,8 @@
+const { defineConfig } = require('cypress')
+
+module.exports = defineConfig({
+ e2e: {
+ specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
+ baseUrl: 'http://localhost:4173/'
+ }
+})
diff --git a/jsx-router-pinia-with-tests/cypress.json b/jsx-router-pinia-with-tests/cypress.json
deleted file mode 100644
index 3d372252..00000000
--- a/jsx-router-pinia-with-tests/cypress.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "baseUrl": "http://localhost:5050/",
- "component": {
- "componentFolder": "src",
- "testFiles": "**/__tests__/*.spec.{js,ts,jsx,tsx}"
- }
-}
diff --git a/jsx-router-pinia-with-tests/cypress/integration/example.spec.js b/jsx-router-pinia-with-tests/cypress/e2e/example.cy.js
similarity index 61%
rename from jsx-router-pinia-with-tests/cypress/integration/example.spec.js
rename to jsx-router-pinia-with-tests/cypress/e2e/example.cy.js
index 13a2922b..7a8c909f 100644
--- a/jsx-router-pinia-with-tests/cypress/integration/example.spec.js
+++ b/jsx-router-pinia-with-tests/cypress/e2e/example.cy.js
@@ -5,9 +5,4 @@ describe('My First Test', () => {
cy.visit('/')
cy.contains('h1', 'You did it!')
})
-
- it('navigates to the about page', () => {
- cy.visit('/about')
- cy.contains('h1', 'This is an about page')
- })
})
diff --git a/jsx-router-pinia-with-tests/cypress/e2e/jsconfig.json b/jsx-router-pinia-with-tests/cypress/e2e/jsconfig.json
new file mode 100644
index 00000000..c790a70d
--- /dev/null
+++ b/jsx-router-pinia-with-tests/cypress/e2e/jsconfig.json
@@ -0,0 +1,8 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "lib": ["es5", "dom"],
+ "types": ["cypress"]
+ },
+ "include": ["./**/*", "../support/**/*"]
+}
diff --git a/jsx-router-pinia-with-tests/cypress/plugins/index.js b/jsx-router-pinia-with-tests/cypress/plugins/index.js
deleted file mode 100644
index ad2e351d..00000000
--- a/jsx-router-pinia-with-tests/cypress/plugins/index.js
+++ /dev/null
@@ -1,28 +0,0 @@
-///
-// ***********************************************************
-// This example plugins/index.js can be used to load plugins
-//
-// You can change the location of this file or turn off loading
-// the plugins file with the 'pluginsFile' configuration option.
-//
-// You can read more here:
-// https://on.cypress.io/plugins-guide
-// ***********************************************************
-
-// This function is called when a project is opened or re-opened (e.g. due to
-// the project's config changing)
-
-const { startDevServer } = require('@cypress/vite-dev-server')
-
-/**
- * @type {Cypress.PluginConfig}
- */
-// eslint-disable-next-line no-unused-vars
-module.exports = (on, config) => {
- // `on` is used to hook into various events Cypress emits
- // `config` is the resolved Cypress config
- on('dev-server:start', (options) => {
- return startDevServer({ options })
- })
- return config
-}
diff --git a/typescript-jsx-router-pinia-with-tests/cypress/support/index.ts b/jsx-router-pinia-with-tests/cypress/support/e2e.js
similarity index 100%
rename from typescript-jsx-router-pinia-with-tests/cypress/support/index.ts
rename to jsx-router-pinia-with-tests/cypress/support/e2e.js
diff --git a/jsx-router-pinia-with-tests/package.json b/jsx-router-pinia-with-tests/package.json
index a6a9f686..4e2553a4 100644
--- a/jsx-router-pinia-with-tests/package.json
+++ b/jsx-router-pinia-with-tests/package.json
@@ -4,24 +4,27 @@
"scripts": {
"dev": "vite",
"build": "vite build",
- "preview": "vite preview --port 5050",
- "test:unit": "cypress open-ct",
- "test:unit:ci": "cypress run-ct --quiet --reporter spec",
- "test:e2e": "start-server-and-test preview http://127.0.0.1:5050/ 'cypress open'",
- "test:e2e:ci": "start-server-and-test preview http://127.0.0.1:5050/ 'cypress run'"
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom",
+ "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
+ "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'"
},
"dependencies": {
- "pinia": "^2.0.4",
- "vue": "^3.2.22",
- "vue-router": "^4.0.12"
+ "pinia": "^2.0.16",
+ "vue": "^2.7.7",
+ "vue-router": "^3.5.4"
},
"devDependencies": {
- "@cypress/vite-dev-server": "^2.2.1",
- "@cypress/vue": "^3.0.5",
- "@vitejs/plugin-vue": "^1.10.0",
- "@vitejs/plugin-vue-jsx": "^1.3.0",
- "cypress": "^8.7.0",
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vitejs/plugin-vue2-jsx": "^1.0.2",
+ "@vue/test-utils": "^1.3.0",
+ "cypress": "^10.3.0",
+ "jsdom": "^20.0.0",
"start-server-and-test": "^1.14.0",
- "vite": "^2.6.14"
+ "terser": "^5.14.2",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7"
}
}
diff --git a/jsx-router-pinia-with-tests/src/App.vue b/jsx-router-pinia-with-tests/src/App.vue
index 37edbaf4..1f84c747 100644
--- a/jsx-router-pinia-with-tests/src/App.vue
+++ b/jsx-router-pinia-with-tests/src/App.vue
@@ -1,35 +1,27 @@
-
-
-
-
-
-
-
- Home
- About
-
-
-
-
-
+
+
+
+
+
+
+
+
+ Home
+ About
+
+
+
+
+
+
-
diff --git a/jsx-router-vitest-cypress/src/assets/base.css b/jsx-router-vitest-cypress/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/jsx-router-vitest-cypress/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/jsx-router-vitest-cypress/src/assets/logo.svg b/jsx-router-vitest-cypress/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/jsx-router-vitest-cypress/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/jsx-router-vitest-cypress/src/assets/main.css b/jsx-router-vitest-cypress/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/jsx-router-vitest-cypress/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/jsx-router-vitest-cypress/src/components/HelloWorld.vue b/jsx-router-vitest-cypress/src/components/HelloWorld.vue
new file mode 100644
index 00000000..de8b576a
--- /dev/null
+++ b/jsx-router-vitest-cypress/src/components/HelloWorld.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 .
+
+
+
+
+
diff --git a/jsx-router-vitest-cypress/src/components/TheWelcome.vue b/jsx-router-vitest-cypress/src/components/TheWelcome.vue
new file mode 100644
index 00000000..cccc38ef
--- /dev/null
+++ b/jsx-router-vitest-cypress/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/jsx-router-vitest-cypress/src/components/WelcomeItem.vue b/jsx-router-vitest-cypress/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/jsx-router-vitest-cypress/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/jsx-router-vitest-cypress/src/components/__tests__/HelloWorld.spec.js b/jsx-router-vitest-cypress/src/components/__tests__/HelloWorld.spec.js
new file mode 100644
index 00000000..293bf197
--- /dev/null
+++ b/jsx-router-vitest-cypress/src/components/__tests__/HelloWorld.spec.js
@@ -0,0 +1,11 @@
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('renders properly', () => {
+ const wrapper = mount(HelloWorld, { propsData: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
+ })
+})
diff --git a/jsx-router-vitest-cypress/src/components/icons/IconCommunity.vue b/jsx-router-vitest-cypress/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/jsx-router-vitest-cypress/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-router-vitest-cypress/src/components/icons/IconDocumentation.vue b/jsx-router-vitest-cypress/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/jsx-router-vitest-cypress/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-router-vitest-cypress/src/components/icons/IconEcosystem.vue b/jsx-router-vitest-cypress/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/jsx-router-vitest-cypress/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-router-vitest-cypress/src/components/icons/IconSupport.vue b/jsx-router-vitest-cypress/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/jsx-router-vitest-cypress/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-router-vitest-cypress/src/components/icons/IconTooling.vue b/jsx-router-vitest-cypress/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/jsx-router-vitest-cypress/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/jsx-router-vitest-cypress/src/main.js b/jsx-router-vitest-cypress/src/main.js
new file mode 100644
index 00000000..4919cf77
--- /dev/null
+++ b/jsx-router-vitest-cypress/src/main.js
@@ -0,0 +1,11 @@
+import Vue from 'vue'
+
+import App from './App.vue'
+import router from './router'
+
+import './assets/main.css'
+
+new Vue({
+ router,
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/jsx-router-vitest-cypress/src/router/index.js b/jsx-router-vitest-cypress/src/router/index.js
new file mode 100644
index 00000000..cf9820b0
--- /dev/null
+++ b/jsx-router-vitest-cypress/src/router/index.js
@@ -0,0 +1,27 @@
+import Vue from 'vue'
+import VueRouter from 'vue-router'
+import HomeView from '../views/HomeView.vue'
+
+Vue.use(VueRouter)
+
+const router = new VueRouter({
+ mode: 'history',
+ base: import.meta.env.BASE_URL,
+ routes: [
+ {
+ path: '/',
+ name: 'home',
+ component: HomeView
+ },
+ {
+ path: '/about',
+ name: 'about',
+ // route level code-splitting
+ // this generates a separate chunk (About.[hash].js) for this route
+ // which is lazy-loaded when the route is visited.
+ component: () => import('../views/AboutView.vue')
+ }
+ ]
+})
+
+export default router
diff --git a/jsx-router-vitest-cypress/src/views/AboutView.vue b/jsx-router-vitest-cypress/src/views/AboutView.vue
new file mode 100644
index 00000000..756ad2a1
--- /dev/null
+++ b/jsx-router-vitest-cypress/src/views/AboutView.vue
@@ -0,0 +1,15 @@
+
+
+
This is an about page
+
+
+
+
diff --git a/jsx-router-vitest-cypress/src/views/HomeView.vue b/jsx-router-vitest-cypress/src/views/HomeView.vue
new file mode 100644
index 00000000..6555a646
--- /dev/null
+++ b/jsx-router-vitest-cypress/src/views/HomeView.vue
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/jsx-router-vitest-cypress/vite.config.js b/jsx-router-vitest-cypress/vite.config.js
new file mode 100644
index 00000000..54d7440f
--- /dev/null
+++ b/jsx-router-vitest-cypress/vite.config.js
@@ -0,0 +1,23 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+import vue2Jsx from '@vitejs/plugin-vue2-jsx'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ vue2Jsx(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/jsx-router-vitest/.gitignore b/jsx-router-vitest/.gitignore
new file mode 100644
index 00000000..133da84e
--- /dev/null
+++ b/jsx-router-vitest/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/jsx-router-vitest/README.md b/jsx-router-vitest/README.md
new file mode 100644
index 00000000..c2aa1a5c
--- /dev/null
+++ b/jsx-router-vitest/README.md
@@ -0,0 +1,35 @@
+# jsx-router-vitest
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[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).
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Unit Tests with [Vitest](https://vitest.dev/)
+
+```sh
+pnpm test:unit
+```
diff --git a/jsx-router-vitest/index.html b/jsx-router-vitest/index.html
new file mode 100644
index 00000000..030a6ff5
--- /dev/null
+++ b/jsx-router-vitest/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/jsx-router-vitest/package.json b/jsx-router-vitest/package.json
new file mode 100644
index 00000000..0f16c6a9
--- /dev/null
+++ b/jsx-router-vitest/package.json
@@ -0,0 +1,25 @@
+{
+ "name": "jsx-router-vitest",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom"
+ },
+ "dependencies": {
+ "vue": "^2.7.7",
+ "vue-router": "^3.5.4"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vitejs/plugin-vue2-jsx": "^1.0.2",
+ "@vue/test-utils": "^1.3.0",
+ "jsdom": "^20.0.0",
+ "terser": "^5.14.2",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7"
+ }
+}
diff --git a/jsx-router-vitest/public/favicon.ico b/jsx-router-vitest/public/favicon.ico
new file mode 100644
index 00000000..df36fcfb
Binary files /dev/null and b/jsx-router-vitest/public/favicon.ico differ
diff --git a/jsx-router-vitest/src/App.vue b/jsx-router-vitest/src/App.vue
new file mode 100644
index 00000000..1f84c747
--- /dev/null
+++ b/jsx-router-vitest/src/App.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+ Home
+ About
+
+
+
+
+
+
+
+
+
diff --git a/jsx-router-vitest/src/assets/base.css b/jsx-router-vitest/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/jsx-router-vitest/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/jsx-router-vitest/src/assets/logo.svg b/jsx-router-vitest/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/jsx-router-vitest/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/jsx-router-vitest/src/assets/main.css b/jsx-router-vitest/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/jsx-router-vitest/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/jsx-router-vitest/src/components/HelloWorld.vue b/jsx-router-vitest/src/components/HelloWorld.vue
new file mode 100644
index 00000000..de8b576a
--- /dev/null
+++ b/jsx-router-vitest/src/components/HelloWorld.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 .
+
+
+
+
+
diff --git a/jsx-router-vitest/src/components/TheWelcome.vue b/jsx-router-vitest/src/components/TheWelcome.vue
new file mode 100644
index 00000000..cccc38ef
--- /dev/null
+++ b/jsx-router-vitest/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/jsx-router-vitest/src/components/WelcomeItem.vue b/jsx-router-vitest/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/jsx-router-vitest/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/jsx-router-vitest/src/components/__tests__/HelloWorld.spec.js b/jsx-router-vitest/src/components/__tests__/HelloWorld.spec.js
new file mode 100644
index 00000000..293bf197
--- /dev/null
+++ b/jsx-router-vitest/src/components/__tests__/HelloWorld.spec.js
@@ -0,0 +1,11 @@
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('renders properly', () => {
+ const wrapper = mount(HelloWorld, { propsData: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
+ })
+})
diff --git a/jsx-router-vitest/src/components/icons/IconCommunity.vue b/jsx-router-vitest/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/jsx-router-vitest/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-router-vitest/src/components/icons/IconDocumentation.vue b/jsx-router-vitest/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/jsx-router-vitest/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-router-vitest/src/components/icons/IconEcosystem.vue b/jsx-router-vitest/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/jsx-router-vitest/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-router-vitest/src/components/icons/IconSupport.vue b/jsx-router-vitest/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/jsx-router-vitest/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-router-vitest/src/components/icons/IconTooling.vue b/jsx-router-vitest/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/jsx-router-vitest/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/jsx-router-vitest/src/main.js b/jsx-router-vitest/src/main.js
new file mode 100644
index 00000000..4919cf77
--- /dev/null
+++ b/jsx-router-vitest/src/main.js
@@ -0,0 +1,11 @@
+import Vue from 'vue'
+
+import App from './App.vue'
+import router from './router'
+
+import './assets/main.css'
+
+new Vue({
+ router,
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/jsx-router-vitest/src/router/index.js b/jsx-router-vitest/src/router/index.js
new file mode 100644
index 00000000..cf9820b0
--- /dev/null
+++ b/jsx-router-vitest/src/router/index.js
@@ -0,0 +1,27 @@
+import Vue from 'vue'
+import VueRouter from 'vue-router'
+import HomeView from '../views/HomeView.vue'
+
+Vue.use(VueRouter)
+
+const router = new VueRouter({
+ mode: 'history',
+ base: import.meta.env.BASE_URL,
+ routes: [
+ {
+ path: '/',
+ name: 'home',
+ component: HomeView
+ },
+ {
+ path: '/about',
+ name: 'about',
+ // route level code-splitting
+ // this generates a separate chunk (About.[hash].js) for this route
+ // which is lazy-loaded when the route is visited.
+ component: () => import('../views/AboutView.vue')
+ }
+ ]
+})
+
+export default router
diff --git a/jsx-router-vitest/src/views/AboutView.vue b/jsx-router-vitest/src/views/AboutView.vue
new file mode 100644
index 00000000..756ad2a1
--- /dev/null
+++ b/jsx-router-vitest/src/views/AboutView.vue
@@ -0,0 +1,15 @@
+
+
+
This is an about page
+
+
+
+
diff --git a/jsx-router-vitest/src/views/HomeView.vue b/jsx-router-vitest/src/views/HomeView.vue
new file mode 100644
index 00000000..6555a646
--- /dev/null
+++ b/jsx-router-vitest/src/views/HomeView.vue
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/jsx-router-vitest/vite.config.js b/jsx-router-vitest/vite.config.js
new file mode 100644
index 00000000..54d7440f
--- /dev/null
+++ b/jsx-router-vitest/vite.config.js
@@ -0,0 +1,23 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+import vue2Jsx from '@vitejs/plugin-vue2-jsx'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ vue2Jsx(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/jsx-router-with-tests/README.md b/jsx-router-with-tests/README.md
index 45cc392b..6ee984f5 100644
--- a/jsx-router-with-tests/README.md
+++ b/jsx-router-with-tests/README.md
@@ -4,7 +4,7 @@ This template should help get you started developing with Vue 3 in Vite.
## Recommended IDE Setup
-[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=johnsoncodehk.volar) (and disable Vetur).
+[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).
## Customize configuration
@@ -28,10 +28,10 @@ pnpm dev
pnpm build
```
-### Run Unit Tests with [Cypress Component Testing](https://docs.cypress.io/guides/component-testing/introduction)
+### Run Unit Tests with [Vitest](https://vitest.dev/)
```sh
-pnpm test:unit # or `pnpm test:unit:ci` for headless testing
+pnpm test:unit
```
### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
diff --git a/jsx-router-with-tests/cypress.config.js b/jsx-router-with-tests/cypress.config.js
new file mode 100644
index 00000000..9cf6a199
--- /dev/null
+++ b/jsx-router-with-tests/cypress.config.js
@@ -0,0 +1,8 @@
+const { defineConfig } = require('cypress')
+
+module.exports = defineConfig({
+ e2e: {
+ specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
+ baseUrl: 'http://localhost:4173/'
+ }
+})
diff --git a/jsx-router-with-tests/cypress.json b/jsx-router-with-tests/cypress.json
deleted file mode 100644
index 3d372252..00000000
--- a/jsx-router-with-tests/cypress.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "baseUrl": "http://localhost:5050/",
- "component": {
- "componentFolder": "src",
- "testFiles": "**/__tests__/*.spec.{js,ts,jsx,tsx}"
- }
-}
diff --git a/router-pinia-with-tests/cypress/integration/example.spec.js b/jsx-router-with-tests/cypress/e2e/example.cy.js
similarity index 61%
rename from router-pinia-with-tests/cypress/integration/example.spec.js
rename to jsx-router-with-tests/cypress/e2e/example.cy.js
index 13a2922b..7a8c909f 100644
--- a/router-pinia-with-tests/cypress/integration/example.spec.js
+++ b/jsx-router-with-tests/cypress/e2e/example.cy.js
@@ -5,9 +5,4 @@ describe('My First Test', () => {
cy.visit('/')
cy.contains('h1', 'You did it!')
})
-
- it('navigates to the about page', () => {
- cy.visit('/about')
- cy.contains('h1', 'This is an about page')
- })
})
diff --git a/jsx-router-with-tests/cypress/e2e/jsconfig.json b/jsx-router-with-tests/cypress/e2e/jsconfig.json
new file mode 100644
index 00000000..c790a70d
--- /dev/null
+++ b/jsx-router-with-tests/cypress/e2e/jsconfig.json
@@ -0,0 +1,8 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "lib": ["es5", "dom"],
+ "types": ["cypress"]
+ },
+ "include": ["./**/*", "../support/**/*"]
+}
diff --git a/jsx-router-with-tests/cypress/plugins/index.js b/jsx-router-with-tests/cypress/plugins/index.js
deleted file mode 100644
index ad2e351d..00000000
--- a/jsx-router-with-tests/cypress/plugins/index.js
+++ /dev/null
@@ -1,28 +0,0 @@
-///
-// ***********************************************************
-// This example plugins/index.js can be used to load plugins
-//
-// You can change the location of this file or turn off loading
-// the plugins file with the 'pluginsFile' configuration option.
-//
-// You can read more here:
-// https://on.cypress.io/plugins-guide
-// ***********************************************************
-
-// This function is called when a project is opened or re-opened (e.g. due to
-// the project's config changing)
-
-const { startDevServer } = require('@cypress/vite-dev-server')
-
-/**
- * @type {Cypress.PluginConfig}
- */
-// eslint-disable-next-line no-unused-vars
-module.exports = (on, config) => {
- // `on` is used to hook into various events Cypress emits
- // `config` is the resolved Cypress config
- on('dev-server:start', (options) => {
- return startDevServer({ options })
- })
- return config
-}
diff --git a/typescript-jsx-with-tests/cypress/support/index.ts b/jsx-router-with-tests/cypress/support/e2e.js
similarity index 100%
rename from typescript-jsx-with-tests/cypress/support/index.ts
rename to jsx-router-with-tests/cypress/support/e2e.js
diff --git a/jsx-router-with-tests/package.json b/jsx-router-with-tests/package.json
index 124dd6b4..5363ec89 100644
--- a/jsx-router-with-tests/package.json
+++ b/jsx-router-with-tests/package.json
@@ -4,23 +4,26 @@
"scripts": {
"dev": "vite",
"build": "vite build",
- "preview": "vite preview --port 5050",
- "test:unit": "cypress open-ct",
- "test:unit:ci": "cypress run-ct --quiet --reporter spec",
- "test:e2e": "start-server-and-test preview http://127.0.0.1:5050/ 'cypress open'",
- "test:e2e:ci": "start-server-and-test preview http://127.0.0.1:5050/ 'cypress run'"
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom",
+ "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
+ "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'"
},
"dependencies": {
- "vue": "^3.2.22",
- "vue-router": "^4.0.12"
+ "vue": "^2.7.7",
+ "vue-router": "^3.5.4"
},
"devDependencies": {
- "@cypress/vite-dev-server": "^2.2.1",
- "@cypress/vue": "^3.0.5",
- "@vitejs/plugin-vue": "^1.10.0",
- "@vitejs/plugin-vue-jsx": "^1.3.0",
- "cypress": "^8.7.0",
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vitejs/plugin-vue2-jsx": "^1.0.2",
+ "@vue/test-utils": "^1.3.0",
+ "cypress": "^10.3.0",
+ "jsdom": "^20.0.0",
"start-server-and-test": "^1.14.0",
- "vite": "^2.6.14"
+ "terser": "^5.14.2",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7"
}
}
diff --git a/jsx-router-with-tests/src/App.vue b/jsx-router-with-tests/src/App.vue
index 37edbaf4..1f84c747 100644
--- a/jsx-router-with-tests/src/App.vue
+++ b/jsx-router-with-tests/src/App.vue
@@ -1,35 +1,27 @@
-
-
-
-
-
-
-
- Home
- About
-
-
-
-
-
+
+
+
+
+
+
+
+
+ Home
+ About
+
+
+
+
+
+
-
diff --git a/jsx-vitest-cypress/src/assets/base.css b/jsx-vitest-cypress/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/jsx-vitest-cypress/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/jsx-vitest-cypress/src/assets/logo.svg b/jsx-vitest-cypress/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/jsx-vitest-cypress/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/jsx-vitest-cypress/src/assets/main.css b/jsx-vitest-cypress/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/jsx-vitest-cypress/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/jsx-vitest-cypress/src/components/HelloWorld.vue b/jsx-vitest-cypress/src/components/HelloWorld.vue
new file mode 100644
index 00000000..de8b576a
--- /dev/null
+++ b/jsx-vitest-cypress/src/components/HelloWorld.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 .
+
+
+
+
+
diff --git a/jsx-vitest-cypress/src/components/TheWelcome.vue b/jsx-vitest-cypress/src/components/TheWelcome.vue
new file mode 100644
index 00000000..cccc38ef
--- /dev/null
+++ b/jsx-vitest-cypress/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/jsx-vitest-cypress/src/components/WelcomeItem.vue b/jsx-vitest-cypress/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/jsx-vitest-cypress/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/jsx-vitest-cypress/src/components/__tests__/HelloWorld.spec.js b/jsx-vitest-cypress/src/components/__tests__/HelloWorld.spec.js
new file mode 100644
index 00000000..293bf197
--- /dev/null
+++ b/jsx-vitest-cypress/src/components/__tests__/HelloWorld.spec.js
@@ -0,0 +1,11 @@
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('renders properly', () => {
+ const wrapper = mount(HelloWorld, { propsData: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
+ })
+})
diff --git a/jsx-vitest-cypress/src/components/icons/IconCommunity.vue b/jsx-vitest-cypress/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/jsx-vitest-cypress/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-vitest-cypress/src/components/icons/IconDocumentation.vue b/jsx-vitest-cypress/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/jsx-vitest-cypress/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-vitest-cypress/src/components/icons/IconEcosystem.vue b/jsx-vitest-cypress/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/jsx-vitest-cypress/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-vitest-cypress/src/components/icons/IconSupport.vue b/jsx-vitest-cypress/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/jsx-vitest-cypress/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-vitest-cypress/src/components/icons/IconTooling.vue b/jsx-vitest-cypress/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/jsx-vitest-cypress/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/jsx-vitest-cypress/src/main.js b/jsx-vitest-cypress/src/main.js
new file mode 100644
index 00000000..c5da47dc
--- /dev/null
+++ b/jsx-vitest-cypress/src/main.js
@@ -0,0 +1,8 @@
+import Vue from 'vue'
+import App from './App.vue'
+
+import './assets/main.css'
+
+new Vue({
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/jsx-vitest-cypress/vite.config.js b/jsx-vitest-cypress/vite.config.js
new file mode 100644
index 00000000..54d7440f
--- /dev/null
+++ b/jsx-vitest-cypress/vite.config.js
@@ -0,0 +1,23 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+import vue2Jsx from '@vitejs/plugin-vue2-jsx'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ vue2Jsx(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/jsx-vitest/.gitignore b/jsx-vitest/.gitignore
new file mode 100644
index 00000000..133da84e
--- /dev/null
+++ b/jsx-vitest/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/jsx-vitest/README.md b/jsx-vitest/README.md
new file mode 100644
index 00000000..bb1f0cc2
--- /dev/null
+++ b/jsx-vitest/README.md
@@ -0,0 +1,35 @@
+# jsx-vitest
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[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).
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Unit Tests with [Vitest](https://vitest.dev/)
+
+```sh
+pnpm test:unit
+```
diff --git a/jsx-vitest/index.html b/jsx-vitest/index.html
new file mode 100644
index 00000000..030a6ff5
--- /dev/null
+++ b/jsx-vitest/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/jsx-vitest/package.json b/jsx-vitest/package.json
new file mode 100644
index 00000000..17d7bd2c
--- /dev/null
+++ b/jsx-vitest/package.json
@@ -0,0 +1,24 @@
+{
+ "name": "jsx-vitest",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom"
+ },
+ "dependencies": {
+ "vue": "^2.7.7"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vitejs/plugin-vue2-jsx": "^1.0.2",
+ "@vue/test-utils": "^1.3.0",
+ "jsdom": "^20.0.0",
+ "terser": "^5.14.2",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7"
+ }
+}
diff --git a/jsx-vitest/public/favicon.ico b/jsx-vitest/public/favicon.ico
new file mode 100644
index 00000000..df36fcfb
Binary files /dev/null and b/jsx-vitest/public/favicon.ico differ
diff --git a/jsx-vitest/src/App.vue b/jsx-vitest/src/App.vue
new file mode 100644
index 00000000..45fbfd94
--- /dev/null
+++ b/jsx-vitest/src/App.vue
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/jsx-vitest/src/assets/base.css b/jsx-vitest/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/jsx-vitest/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/jsx-vitest/src/assets/logo.svg b/jsx-vitest/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/jsx-vitest/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/jsx-vitest/src/assets/main.css b/jsx-vitest/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/jsx-vitest/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/jsx-vitest/src/components/HelloWorld.vue b/jsx-vitest/src/components/HelloWorld.vue
new file mode 100644
index 00000000..de8b576a
--- /dev/null
+++ b/jsx-vitest/src/components/HelloWorld.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 .
+
+
+
+
+
diff --git a/jsx-vitest/src/components/TheWelcome.vue b/jsx-vitest/src/components/TheWelcome.vue
new file mode 100644
index 00000000..cccc38ef
--- /dev/null
+++ b/jsx-vitest/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/jsx-vitest/src/components/WelcomeItem.vue b/jsx-vitest/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/jsx-vitest/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/jsx-vitest/src/components/__tests__/HelloWorld.spec.js b/jsx-vitest/src/components/__tests__/HelloWorld.spec.js
new file mode 100644
index 00000000..293bf197
--- /dev/null
+++ b/jsx-vitest/src/components/__tests__/HelloWorld.spec.js
@@ -0,0 +1,11 @@
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('renders properly', () => {
+ const wrapper = mount(HelloWorld, { propsData: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
+ })
+})
diff --git a/jsx-vitest/src/components/icons/IconCommunity.vue b/jsx-vitest/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/jsx-vitest/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-vitest/src/components/icons/IconDocumentation.vue b/jsx-vitest/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/jsx-vitest/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-vitest/src/components/icons/IconEcosystem.vue b/jsx-vitest/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/jsx-vitest/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-vitest/src/components/icons/IconSupport.vue b/jsx-vitest/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/jsx-vitest/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/jsx-vitest/src/components/icons/IconTooling.vue b/jsx-vitest/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/jsx-vitest/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/jsx-vitest/src/main.js b/jsx-vitest/src/main.js
new file mode 100644
index 00000000..c5da47dc
--- /dev/null
+++ b/jsx-vitest/src/main.js
@@ -0,0 +1,8 @@
+import Vue from 'vue'
+import App from './App.vue'
+
+import './assets/main.css'
+
+new Vue({
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/jsx-vitest/vite.config.js b/jsx-vitest/vite.config.js
new file mode 100644
index 00000000..54d7440f
--- /dev/null
+++ b/jsx-vitest/vite.config.js
@@ -0,0 +1,23 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+import vue2Jsx from '@vitejs/plugin-vue2-jsx'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ vue2Jsx(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/jsx-with-tests/README.md b/jsx-with-tests/README.md
index 336d942c..7c801cbd 100644
--- a/jsx-with-tests/README.md
+++ b/jsx-with-tests/README.md
@@ -4,7 +4,7 @@ This template should help get you started developing with Vue 3 in Vite.
## Recommended IDE Setup
-[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=johnsoncodehk.volar) (and disable Vetur).
+[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).
## Customize configuration
@@ -28,10 +28,10 @@ pnpm dev
pnpm build
```
-### Run Unit Tests with [Cypress Component Testing](https://docs.cypress.io/guides/component-testing/introduction)
+### Run Unit Tests with [Vitest](https://vitest.dev/)
```sh
-pnpm test:unit # or `pnpm test:unit:ci` for headless testing
+pnpm test:unit
```
### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
diff --git a/jsx-with-tests/cypress.config.js b/jsx-with-tests/cypress.config.js
new file mode 100644
index 00000000..9cf6a199
--- /dev/null
+++ b/jsx-with-tests/cypress.config.js
@@ -0,0 +1,8 @@
+const { defineConfig } = require('cypress')
+
+module.exports = defineConfig({
+ e2e: {
+ specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
+ baseUrl: 'http://localhost:4173/'
+ }
+})
diff --git a/jsx-with-tests/cypress.json b/jsx-with-tests/cypress.json
deleted file mode 100644
index 3d372252..00000000
--- a/jsx-with-tests/cypress.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "baseUrl": "http://localhost:5050/",
- "component": {
- "componentFolder": "src",
- "testFiles": "**/__tests__/*.spec.{js,ts,jsx,tsx}"
- }
-}
diff --git a/jsx-with-tests/cypress/e2e/example.cy.js b/jsx-with-tests/cypress/e2e/example.cy.js
new file mode 100644
index 00000000..7a8c909f
--- /dev/null
+++ b/jsx-with-tests/cypress/e2e/example.cy.js
@@ -0,0 +1,8 @@
+// https://docs.cypress.io/api/introduction/api.html
+
+describe('My First Test', () => {
+ it('visits the app root url', () => {
+ cy.visit('/')
+ cy.contains('h1', 'You did it!')
+ })
+})
diff --git a/jsx-with-tests/cypress/e2e/jsconfig.json b/jsx-with-tests/cypress/e2e/jsconfig.json
new file mode 100644
index 00000000..c790a70d
--- /dev/null
+++ b/jsx-with-tests/cypress/e2e/jsconfig.json
@@ -0,0 +1,8 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "lib": ["es5", "dom"],
+ "types": ["cypress"]
+ },
+ "include": ["./**/*", "../support/**/*"]
+}
diff --git a/jsx-with-tests/cypress/plugins/index.js b/jsx-with-tests/cypress/plugins/index.js
deleted file mode 100644
index ad2e351d..00000000
--- a/jsx-with-tests/cypress/plugins/index.js
+++ /dev/null
@@ -1,28 +0,0 @@
-///
-// ***********************************************************
-// This example plugins/index.js can be used to load plugins
-//
-// You can change the location of this file or turn off loading
-// the plugins file with the 'pluginsFile' configuration option.
-//
-// You can read more here:
-// https://on.cypress.io/plugins-guide
-// ***********************************************************
-
-// This function is called when a project is opened or re-opened (e.g. due to
-// the project's config changing)
-
-const { startDevServer } = require('@cypress/vite-dev-server')
-
-/**
- * @type {Cypress.PluginConfig}
- */
-// eslint-disable-next-line no-unused-vars
-module.exports = (on, config) => {
- // `on` is used to hook into various events Cypress emits
- // `config` is the resolved Cypress config
- on('dev-server:start', (options) => {
- return startDevServer({ options })
- })
- return config
-}
diff --git a/typescript-router-pinia-with-tests/cypress/support/index.ts b/jsx-with-tests/cypress/support/e2e.js
similarity index 100%
rename from typescript-router-pinia-with-tests/cypress/support/index.ts
rename to jsx-with-tests/cypress/support/e2e.js
diff --git a/jsx-with-tests/package.json b/jsx-with-tests/package.json
index 740b9bcb..ae5686bb 100644
--- a/jsx-with-tests/package.json
+++ b/jsx-with-tests/package.json
@@ -4,22 +4,25 @@
"scripts": {
"dev": "vite",
"build": "vite build",
- "preview": "vite preview --port 5050",
- "test:unit": "cypress open-ct",
- "test:unit:ci": "cypress run-ct --quiet --reporter spec",
- "test:e2e": "start-server-and-test preview http://127.0.0.1:5050/ 'cypress open'",
- "test:e2e:ci": "start-server-and-test preview http://127.0.0.1:5050/ 'cypress run'"
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom",
+ "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
+ "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'"
},
"dependencies": {
- "vue": "^3.2.22"
+ "vue": "^2.7.7"
},
"devDependencies": {
- "@cypress/vite-dev-server": "^2.2.1",
- "@cypress/vue": "^3.0.5",
- "@vitejs/plugin-vue": "^1.10.0",
- "@vitejs/plugin-vue-jsx": "^1.3.0",
- "cypress": "^8.7.0",
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vitejs/plugin-vue2-jsx": "^1.0.2",
+ "@vue/test-utils": "^1.3.0",
+ "cypress": "^10.3.0",
+ "jsdom": "^20.0.0",
"start-server-and-test": "^1.14.0",
- "vite": "^2.6.14"
+ "terser": "^5.14.2",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7"
}
}
diff --git a/jsx-with-tests/src/App.vue b/jsx-with-tests/src/App.vue
index b0b6901b..45fbfd94 100644
--- a/jsx-with-tests/src/App.vue
+++ b/jsx-with-tests/src/App.vue
@@ -4,30 +4,22 @@ import TheWelcome from './components/TheWelcome.vue'
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/jsx-with-tests/src/assets/main.css b/jsx-with-tests/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/jsx-with-tests/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/jsx-with-tests/src/components/HelloWorld.vue b/jsx-with-tests/src/components/HelloWorld.vue
index aa16fa1f..de8b576a 100644
--- a/jsx-with-tests/src/components/HelloWorld.vue
+++ b/jsx-with-tests/src/components/HelloWorld.vue
@@ -13,7 +13,7 @@ defineProps({
You’ve successfully created a project with
Vite +
- Vue 3 .
+ Vue 2 .
diff --git a/jsx-with-tests/src/components/TheWelcome.vue b/jsx-with-tests/src/components/TheWelcome.vue
index 1d003f86..cccc38ef 100644
--- a/jsx-with-tests/src/components/TheWelcome.vue
+++ b/jsx-with-tests/src/components/TheWelcome.vue
@@ -8,77 +8,79 @@ import SupportIcon from './icons/IconSupport.vue'
-
-
-
-
- Documentation
+
+
+
+
+
+ Documentation
- Vue’s
- official documentation
- provides you with all information you need to get started.
-
+ Vue’s
+
official documentation
+ provides you with all information you need to get started.
+
-
-
-
-
- Tooling
+
+
+
+
+ Tooling
- This project is served and bundled with
- Vite . The recommended IDE
- setup is VSCode +
- Volar . If you need to test
- your components and web pages, check out
- Cypress and
- Cypress Component Testing .
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
-
+
- More instructions are available in README.md
.
-
+ More instructions are available in README.md
.
+
-
-
-
-
- Ecosystem
+
+
+
+
+ Ecosystem
- Get official tools and libraries for your project:
- Vuex ,
- Vue Router ,
- Vue Test Utils , and
- Vue Dev Tools . If you need more
- resources, we suggest paying
- Awesome Vue
- a visit.
-
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
-
-
-
-
- Community
+
+
+
+
+ Community
- Got stuck? Ask your question on
- Vue Land , our official Discord server, or
- StackOverflow .
- You should also subscribe to
- our mailing list and follow the official
- @vuejs
- twitter account for latest news in the Vue world.
-
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
-
-
-
-
- Support Vue
+
+
+
+
+ Support Vue
- As an independent project, Vue relies on community backing for its sustainability. You can help
- us by
- becoming a sponsor .
-
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
diff --git a/jsx-with-tests/src/components/__tests__/HelloWorld.spec.js b/jsx-with-tests/src/components/__tests__/HelloWorld.spec.js
index a69f3a9d..293bf197 100644
--- a/jsx-with-tests/src/components/__tests__/HelloWorld.spec.js
+++ b/jsx-with-tests/src/components/__tests__/HelloWorld.spec.js
@@ -1,13 +1,11 @@
-import { mount } from '@cypress/vue'
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
import HelloWorld from '../HelloWorld.vue'
describe('HelloWorld', () => {
- it('playground', () => {
- mount(HelloWorld, { props: { msg: 'Hello Cypress' } })
- })
-
it('renders properly', () => {
- mount(HelloWorld, { props: { msg: 'Hello Cypress' } })
- cy.get('h1').should('contain', 'Hello Cypress')
+ const wrapper = mount(HelloWorld, { propsData: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
})
})
diff --git a/jsx-with-tests/src/components/icons/IconTooling.vue b/jsx-with-tests/src/components/icons/IconTooling.vue
index 660598d7..07dc46b0 100644
--- a/jsx-with-tests/src/components/icons/IconTooling.vue
+++ b/jsx-with-tests/src/components/icons/IconTooling.vue
@@ -2,8 +2,6 @@
h(App)
+}).$mount('#app')
diff --git a/jsx-with-tests/vite.config.js b/jsx-with-tests/vite.config.js
index f140f276..54d7440f 100644
--- a/jsx-with-tests/vite.config.js
+++ b/jsx-with-tests/vite.config.js
@@ -1,12 +1,20 @@
-import { fileURLToPath } from 'url'
+import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vite'
-import vue from '@vitejs/plugin-vue'
-import vueJsx from '@vitejs/plugin-vue-jsx'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+import vue2Jsx from '@vitejs/plugin-vue2-jsx'
// https://vitejs.dev/config/
export default defineConfig({
- plugins: [vue(), vueJsx()],
+ plugins: [
+ vue2(),
+ vue2Jsx(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
diff --git a/jsx/README.md b/jsx/README.md
index d689403f..a6df1922 100644
--- a/jsx/README.md
+++ b/jsx/README.md
@@ -4,7 +4,7 @@ This template should help get you started developing with Vue 3 in Vite.
## Recommended IDE Setup
-[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=johnsoncodehk.volar) (and disable Vetur).
+[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).
## Customize configuration
diff --git a/jsx/package.json b/jsx/package.json
index 95ca2e19..b499bc91 100644
--- a/jsx/package.json
+++ b/jsx/package.json
@@ -4,14 +4,16 @@
"scripts": {
"dev": "vite",
"build": "vite build",
- "preview": "vite preview --port 5050"
+ "preview": "vite preview --port 4173"
},
"dependencies": {
- "vue": "^3.2.22"
+ "vue": "^2.7.7"
},
"devDependencies": {
- "@vitejs/plugin-vue": "^1.10.0",
- "@vitejs/plugin-vue-jsx": "^1.3.0",
- "vite": "^2.6.14"
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vitejs/plugin-vue2-jsx": "^1.0.2",
+ "terser": "^5.14.2",
+ "vite": "^3.0.2"
}
}
diff --git a/jsx/src/App.vue b/jsx/src/App.vue
index b0b6901b..45fbfd94 100644
--- a/jsx/src/App.vue
+++ b/jsx/src/App.vue
@@ -4,30 +4,22 @@ import TheWelcome from './components/TheWelcome.vue'
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/jsx/src/assets/main.css b/jsx/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/jsx/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/jsx/src/components/HelloWorld.vue b/jsx/src/components/HelloWorld.vue
index aa16fa1f..de8b576a 100644
--- a/jsx/src/components/HelloWorld.vue
+++ b/jsx/src/components/HelloWorld.vue
@@ -13,7 +13,7 @@ defineProps({
You’ve successfully created a project with
Vite +
- Vue 3 .
+ Vue 2 .
diff --git a/jsx/src/components/TheWelcome.vue b/jsx/src/components/TheWelcome.vue
index 1d003f86..cccc38ef 100644
--- a/jsx/src/components/TheWelcome.vue
+++ b/jsx/src/components/TheWelcome.vue
@@ -8,77 +8,79 @@ import SupportIcon from './icons/IconSupport.vue'
-
-
-
-
- Documentation
+
+
+
+
+
+ Documentation
- Vue’s
- official documentation
- provides you with all information you need to get started.
-
+ Vue’s
+
official documentation
+ provides you with all information you need to get started.
+
-
-
-
-
- Tooling
+
+
+
+
+ Tooling
- This project is served and bundled with
- Vite . The recommended IDE
- setup is VSCode +
- Volar . If you need to test
- your components and web pages, check out
- Cypress and
- Cypress Component Testing .
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
-
+
- More instructions are available in README.md
.
-
+ More instructions are available in README.md
.
+
-
-
-
-
- Ecosystem
+
+
+
+
+ Ecosystem
- Get official tools and libraries for your project:
- Vuex ,
- Vue Router ,
- Vue Test Utils , and
- Vue Dev Tools . If you need more
- resources, we suggest paying
- Awesome Vue
- a visit.
-
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
-
-
-
-
- Community
+
+
+
+
+ Community
- Got stuck? Ask your question on
- Vue Land , our official Discord server, or
- StackOverflow .
- You should also subscribe to
- our mailing list and follow the official
- @vuejs
- twitter account for latest news in the Vue world.
-
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
-
-
-
-
- Support Vue
+
+
+
+
+ Support Vue
- As an independent project, Vue relies on community backing for its sustainability. You can help
- us by
- becoming a sponsor .
-
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
diff --git a/jsx/src/components/icons/IconTooling.vue b/jsx/src/components/icons/IconTooling.vue
index 660598d7..07dc46b0 100644
--- a/jsx/src/components/icons/IconTooling.vue
+++ b/jsx/src/components/icons/IconTooling.vue
@@ -2,8 +2,6 @@
h(App)
+}).$mount('#app')
diff --git a/jsx/vite.config.js b/jsx/vite.config.js
index f140f276..54d7440f 100644
--- a/jsx/vite.config.js
+++ b/jsx/vite.config.js
@@ -1,12 +1,20 @@
-import { fileURLToPath } from 'url'
+import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vite'
-import vue from '@vitejs/plugin-vue'
-import vueJsx from '@vitejs/plugin-vue-jsx'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+import vue2Jsx from '@vitejs/plugin-vue2-jsx'
// https://vitejs.dev/config/
export default defineConfig({
- plugins: [vue(), vueJsx()],
+ plugins: [
+ vue2(),
+ vue2Jsx(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
diff --git a/pinia-cypress/.gitignore b/pinia-cypress/.gitignore
new file mode 100644
index 00000000..133da84e
--- /dev/null
+++ b/pinia-cypress/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/pinia-cypress/README.md b/pinia-cypress/README.md
new file mode 100644
index 00000000..3d498038
--- /dev/null
+++ b/pinia-cypress/README.md
@@ -0,0 +1,42 @@
+# pinia-cypress
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[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).
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Headed Component Tests with [Cypress Component Testing](https://on.cypress.io/component)
+
+```sh
+pnpm test:unit # or `pnpm test:unit:ci` for headless testing
+```
+
+### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
+
+```sh
+pnpm build
+pnpm test:e2e # or `pnpm test:e2e:ci` for headless testing
+```
diff --git a/pinia-cypress/cypress.config.js b/pinia-cypress/cypress.config.js
new file mode 100644
index 00000000..c3aba743
--- /dev/null
+++ b/pinia-cypress/cypress.config.js
@@ -0,0 +1,15 @@
+const { defineConfig } = require('cypress')
+
+module.exports = defineConfig({
+ e2e: {
+ specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
+ baseUrl: 'http://localhost:4173/'
+ },
+ component: {
+ specPattern: 'src/**/__tests__/*.{cy,spec}.{js,ts,jsx,tsx}',
+ devServer: {
+ framework: 'vue',
+ bundler: 'vite'
+ }
+ }
+})
diff --git a/pinia-cypress/cypress/e2e/example.cy.js b/pinia-cypress/cypress/e2e/example.cy.js
new file mode 100644
index 00000000..7a8c909f
--- /dev/null
+++ b/pinia-cypress/cypress/e2e/example.cy.js
@@ -0,0 +1,8 @@
+// https://docs.cypress.io/api/introduction/api.html
+
+describe('My First Test', () => {
+ it('visits the app root url', () => {
+ cy.visit('/')
+ cy.contains('h1', 'You did it!')
+ })
+})
diff --git a/pinia-cypress/cypress/e2e/jsconfig.json b/pinia-cypress/cypress/e2e/jsconfig.json
new file mode 100644
index 00000000..c790a70d
--- /dev/null
+++ b/pinia-cypress/cypress/e2e/jsconfig.json
@@ -0,0 +1,8 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "lib": ["es5", "dom"],
+ "types": ["cypress"]
+ },
+ "include": ["./**/*", "../support/**/*"]
+}
diff --git a/pinia-cypress/cypress/fixtures/example.json b/pinia-cypress/cypress/fixtures/example.json
new file mode 100644
index 00000000..02e42543
--- /dev/null
+++ b/pinia-cypress/cypress/fixtures/example.json
@@ -0,0 +1,5 @@
+{
+ "name": "Using fixtures to represent data",
+ "email": "hello@cypress.io",
+ "body": "Fixtures are a great way to mock data for responses to routes"
+}
diff --git a/pinia-cypress/cypress/support/commands.js b/pinia-cypress/cypress/support/commands.js
new file mode 100644
index 00000000..119ab03f
--- /dev/null
+++ b/pinia-cypress/cypress/support/commands.js
@@ -0,0 +1,25 @@
+// ***********************************************
+// This example commands.js shows you how to
+// create various custom commands and overwrite
+// existing commands.
+//
+// For more comprehensive examples of custom
+// commands please read more here:
+// https://on.cypress.io/custom-commands
+// ***********************************************
+//
+//
+// -- This is a parent command --
+// Cypress.Commands.add('login', (email, password) => { ... })
+//
+//
+// -- This is a child command --
+// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
+//
+//
+// -- This is a dual command --
+// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
+//
+//
+// -- This will overwrite an existing command --
+// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
diff --git a/pinia-cypress/cypress/support/component-index.html b/pinia-cypress/cypress/support/component-index.html
new file mode 100644
index 00000000..5f9622ae
--- /dev/null
+++ b/pinia-cypress/cypress/support/component-index.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+ Components App
+
+
+
+
+
diff --git a/pinia-cypress/cypress/support/component.js b/pinia-cypress/cypress/support/component.js
new file mode 100644
index 00000000..9b98cf0e
--- /dev/null
+++ b/pinia-cypress/cypress/support/component.js
@@ -0,0 +1,30 @@
+// ***********************************************************
+// This example support/component.js is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
+
+// Import global styles
+import '@/assets/main.css'
+
+import { mount } from 'cypress/vue2'
+
+Cypress.Commands.add('mount', mount)
+
+// Example use:
+// cy.mount(MyComponent)
diff --git a/typescript-router-with-tests/cypress/support/index.ts b/pinia-cypress/cypress/support/e2e.js
similarity index 100%
rename from typescript-router-with-tests/cypress/support/index.ts
rename to pinia-cypress/cypress/support/e2e.js
diff --git a/pinia-cypress/index.html b/pinia-cypress/index.html
new file mode 100644
index 00000000..030a6ff5
--- /dev/null
+++ b/pinia-cypress/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/pinia-cypress/package.json b/pinia-cypress/package.json
new file mode 100644
index 00000000..065b53a6
--- /dev/null
+++ b/pinia-cypress/package.json
@@ -0,0 +1,25 @@
+{
+ "name": "pinia-cypress",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview --port 4173",
+ "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
+ "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'",
+ "test:unit": "cypress open --component",
+ "test:unit:ci": "cypress run --component --quiet --reporter spec"
+ },
+ "dependencies": {
+ "pinia": "^2.0.16",
+ "vue": "^2.7.7"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "cypress": "^10.3.0",
+ "start-server-and-test": "^1.14.0",
+ "terser": "^5.14.2",
+ "vite": "^3.0.2"
+ }
+}
diff --git a/pinia-cypress/public/favicon.ico b/pinia-cypress/public/favicon.ico
new file mode 100644
index 00000000..df36fcfb
Binary files /dev/null and b/pinia-cypress/public/favicon.ico differ
diff --git a/pinia-cypress/src/App.vue b/pinia-cypress/src/App.vue
new file mode 100644
index 00000000..45fbfd94
--- /dev/null
+++ b/pinia-cypress/src/App.vue
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pinia-cypress/src/assets/base.css b/pinia-cypress/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/pinia-cypress/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/pinia-cypress/src/assets/logo.svg b/pinia-cypress/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/pinia-cypress/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/pinia-cypress/src/assets/main.css b/pinia-cypress/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/pinia-cypress/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/pinia-cypress/src/components/HelloWorld.vue b/pinia-cypress/src/components/HelloWorld.vue
new file mode 100644
index 00000000..de8b576a
--- /dev/null
+++ b/pinia-cypress/src/components/HelloWorld.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 .
+
+
+
+
+
diff --git a/pinia-cypress/src/components/TheWelcome.vue b/pinia-cypress/src/components/TheWelcome.vue
new file mode 100644
index 00000000..cccc38ef
--- /dev/null
+++ b/pinia-cypress/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/pinia-cypress/src/components/WelcomeItem.vue b/pinia-cypress/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/pinia-cypress/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/pinia-cypress/src/components/__tests__/HelloWorld.cy.js b/pinia-cypress/src/components/__tests__/HelloWorld.cy.js
new file mode 100644
index 00000000..0e0c065a
--- /dev/null
+++ b/pinia-cypress/src/components/__tests__/HelloWorld.cy.js
@@ -0,0 +1,12 @@
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('playground', () => {
+ cy.mount(HelloWorld, { propsData: { msg: 'Hello Cypress' } })
+ })
+
+ it('renders properly', () => {
+ cy.mount(HelloWorld, { propsData: { msg: 'Hello Cypress' } })
+ cy.get('h1').should('contain', 'Hello Cypress')
+ })
+})
diff --git a/pinia-cypress/src/components/icons/IconCommunity.vue b/pinia-cypress/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/pinia-cypress/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/pinia-cypress/src/components/icons/IconDocumentation.vue b/pinia-cypress/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/pinia-cypress/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/pinia-cypress/src/components/icons/IconEcosystem.vue b/pinia-cypress/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/pinia-cypress/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/pinia-cypress/src/components/icons/IconSupport.vue b/pinia-cypress/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/pinia-cypress/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/pinia-cypress/src/components/icons/IconTooling.vue b/pinia-cypress/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/pinia-cypress/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/pinia-cypress/src/main.js b/pinia-cypress/src/main.js
new file mode 100644
index 00000000..febe0dbe
--- /dev/null
+++ b/pinia-cypress/src/main.js
@@ -0,0 +1,13 @@
+import Vue from 'vue'
+import { createPinia, PiniaVuePlugin } from 'pinia'
+
+import App from './App.vue'
+
+import './assets/main.css'
+
+Vue.use(PiniaVuePlugin)
+
+new Vue({
+ pinia: createPinia(),
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/pinia-cypress/src/stores/counter.js b/pinia-cypress/src/stores/counter.js
new file mode 100644
index 00000000..4a2d2427
--- /dev/null
+++ b/pinia-cypress/src/stores/counter.js
@@ -0,0 +1,16 @@
+import { defineStore } from 'pinia'
+
+export const useCounterStore = defineStore({
+ id: 'counter',
+ state: () => ({
+ counter: 0
+ }),
+ getters: {
+ doubleCount: (state) => state.counter * 2
+ },
+ actions: {
+ increment() {
+ this.counter++
+ }
+ }
+})
diff --git a/pinia-cypress/vite.config.js b/pinia-cypress/vite.config.js
new file mode 100644
index 00000000..d4945079
--- /dev/null
+++ b/pinia-cypress/vite.config.js
@@ -0,0 +1,21 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/pinia-vitest-cypress/.gitignore b/pinia-vitest-cypress/.gitignore
new file mode 100644
index 00000000..133da84e
--- /dev/null
+++ b/pinia-vitest-cypress/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/pinia-vitest-cypress/README.md b/pinia-vitest-cypress/README.md
new file mode 100644
index 00000000..9601475a
--- /dev/null
+++ b/pinia-vitest-cypress/README.md
@@ -0,0 +1,42 @@
+# pinia-vitest-cypress
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[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).
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Unit Tests with [Vitest](https://vitest.dev/)
+
+```sh
+pnpm test:unit
+```
+
+### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
+
+```sh
+pnpm build
+pnpm test:e2e # or `pnpm test:e2e:ci` for headless testing
+```
diff --git a/pinia-vitest-cypress/cypress.config.js b/pinia-vitest-cypress/cypress.config.js
new file mode 100644
index 00000000..9cf6a199
--- /dev/null
+++ b/pinia-vitest-cypress/cypress.config.js
@@ -0,0 +1,8 @@
+const { defineConfig } = require('cypress')
+
+module.exports = defineConfig({
+ e2e: {
+ specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
+ baseUrl: 'http://localhost:4173/'
+ }
+})
diff --git a/pinia-vitest-cypress/cypress/e2e/example.cy.js b/pinia-vitest-cypress/cypress/e2e/example.cy.js
new file mode 100644
index 00000000..7a8c909f
--- /dev/null
+++ b/pinia-vitest-cypress/cypress/e2e/example.cy.js
@@ -0,0 +1,8 @@
+// https://docs.cypress.io/api/introduction/api.html
+
+describe('My First Test', () => {
+ it('visits the app root url', () => {
+ cy.visit('/')
+ cy.contains('h1', 'You did it!')
+ })
+})
diff --git a/pinia-vitest-cypress/cypress/e2e/jsconfig.json b/pinia-vitest-cypress/cypress/e2e/jsconfig.json
new file mode 100644
index 00000000..c790a70d
--- /dev/null
+++ b/pinia-vitest-cypress/cypress/e2e/jsconfig.json
@@ -0,0 +1,8 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "lib": ["es5", "dom"],
+ "types": ["cypress"]
+ },
+ "include": ["./**/*", "../support/**/*"]
+}
diff --git a/pinia-vitest-cypress/cypress/fixtures/example.json b/pinia-vitest-cypress/cypress/fixtures/example.json
new file mode 100644
index 00000000..02e42543
--- /dev/null
+++ b/pinia-vitest-cypress/cypress/fixtures/example.json
@@ -0,0 +1,5 @@
+{
+ "name": "Using fixtures to represent data",
+ "email": "hello@cypress.io",
+ "body": "Fixtures are a great way to mock data for responses to routes"
+}
diff --git a/pinia-vitest-cypress/cypress/support/commands.js b/pinia-vitest-cypress/cypress/support/commands.js
new file mode 100644
index 00000000..119ab03f
--- /dev/null
+++ b/pinia-vitest-cypress/cypress/support/commands.js
@@ -0,0 +1,25 @@
+// ***********************************************
+// This example commands.js shows you how to
+// create various custom commands and overwrite
+// existing commands.
+//
+// For more comprehensive examples of custom
+// commands please read more here:
+// https://on.cypress.io/custom-commands
+// ***********************************************
+//
+//
+// -- This is a parent command --
+// Cypress.Commands.add('login', (email, password) => { ... })
+//
+//
+// -- This is a child command --
+// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
+//
+//
+// -- This is a dual command --
+// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
+//
+//
+// -- This will overwrite an existing command --
+// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
diff --git a/typescript-with-tests/cypress/support/index.ts b/pinia-vitest-cypress/cypress/support/e2e.js
similarity index 100%
rename from typescript-with-tests/cypress/support/index.ts
rename to pinia-vitest-cypress/cypress/support/e2e.js
diff --git a/pinia-vitest-cypress/index.html b/pinia-vitest-cypress/index.html
new file mode 100644
index 00000000..030a6ff5
--- /dev/null
+++ b/pinia-vitest-cypress/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/pinia-vitest-cypress/package.json b/pinia-vitest-cypress/package.json
new file mode 100644
index 00000000..f58dc341
--- /dev/null
+++ b/pinia-vitest-cypress/package.json
@@ -0,0 +1,28 @@
+{
+ "name": "pinia-vitest-cypress",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom",
+ "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
+ "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'"
+ },
+ "dependencies": {
+ "pinia": "^2.0.16",
+ "vue": "^2.7.7"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vue/test-utils": "^1.3.0",
+ "cypress": "^10.3.0",
+ "jsdom": "^20.0.0",
+ "start-server-and-test": "^1.14.0",
+ "terser": "^5.14.2",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7"
+ }
+}
diff --git a/pinia-vitest-cypress/public/favicon.ico b/pinia-vitest-cypress/public/favicon.ico
new file mode 100644
index 00000000..df36fcfb
Binary files /dev/null and b/pinia-vitest-cypress/public/favicon.ico differ
diff --git a/pinia-vitest-cypress/src/App.vue b/pinia-vitest-cypress/src/App.vue
new file mode 100644
index 00000000..45fbfd94
--- /dev/null
+++ b/pinia-vitest-cypress/src/App.vue
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pinia-vitest-cypress/src/assets/base.css b/pinia-vitest-cypress/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/pinia-vitest-cypress/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/pinia-vitest-cypress/src/assets/logo.svg b/pinia-vitest-cypress/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/pinia-vitest-cypress/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/pinia-vitest-cypress/src/assets/main.css b/pinia-vitest-cypress/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/pinia-vitest-cypress/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/pinia-vitest-cypress/src/components/HelloWorld.vue b/pinia-vitest-cypress/src/components/HelloWorld.vue
new file mode 100644
index 00000000..de8b576a
--- /dev/null
+++ b/pinia-vitest-cypress/src/components/HelloWorld.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 .
+
+
+
+
+
diff --git a/pinia-vitest-cypress/src/components/TheWelcome.vue b/pinia-vitest-cypress/src/components/TheWelcome.vue
new file mode 100644
index 00000000..cccc38ef
--- /dev/null
+++ b/pinia-vitest-cypress/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/pinia-vitest-cypress/src/components/WelcomeItem.vue b/pinia-vitest-cypress/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/pinia-vitest-cypress/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/pinia-vitest-cypress/src/components/__tests__/HelloWorld.spec.js b/pinia-vitest-cypress/src/components/__tests__/HelloWorld.spec.js
new file mode 100644
index 00000000..293bf197
--- /dev/null
+++ b/pinia-vitest-cypress/src/components/__tests__/HelloWorld.spec.js
@@ -0,0 +1,11 @@
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('renders properly', () => {
+ const wrapper = mount(HelloWorld, { propsData: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
+ })
+})
diff --git a/pinia-vitest-cypress/src/components/icons/IconCommunity.vue b/pinia-vitest-cypress/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/pinia-vitest-cypress/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/pinia-vitest-cypress/src/components/icons/IconDocumentation.vue b/pinia-vitest-cypress/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/pinia-vitest-cypress/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/pinia-vitest-cypress/src/components/icons/IconEcosystem.vue b/pinia-vitest-cypress/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/pinia-vitest-cypress/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/pinia-vitest-cypress/src/components/icons/IconSupport.vue b/pinia-vitest-cypress/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/pinia-vitest-cypress/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/pinia-vitest-cypress/src/components/icons/IconTooling.vue b/pinia-vitest-cypress/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/pinia-vitest-cypress/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/pinia-vitest-cypress/src/main.js b/pinia-vitest-cypress/src/main.js
new file mode 100644
index 00000000..febe0dbe
--- /dev/null
+++ b/pinia-vitest-cypress/src/main.js
@@ -0,0 +1,13 @@
+import Vue from 'vue'
+import { createPinia, PiniaVuePlugin } from 'pinia'
+
+import App from './App.vue'
+
+import './assets/main.css'
+
+Vue.use(PiniaVuePlugin)
+
+new Vue({
+ pinia: createPinia(),
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/pinia-vitest-cypress/src/stores/counter.js b/pinia-vitest-cypress/src/stores/counter.js
new file mode 100644
index 00000000..4a2d2427
--- /dev/null
+++ b/pinia-vitest-cypress/src/stores/counter.js
@@ -0,0 +1,16 @@
+import { defineStore } from 'pinia'
+
+export const useCounterStore = defineStore({
+ id: 'counter',
+ state: () => ({
+ counter: 0
+ }),
+ getters: {
+ doubleCount: (state) => state.counter * 2
+ },
+ actions: {
+ increment() {
+ this.counter++
+ }
+ }
+})
diff --git a/pinia-vitest-cypress/vite.config.js b/pinia-vitest-cypress/vite.config.js
new file mode 100644
index 00000000..d4945079
--- /dev/null
+++ b/pinia-vitest-cypress/vite.config.js
@@ -0,0 +1,21 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/pinia-vitest/.gitignore b/pinia-vitest/.gitignore
new file mode 100644
index 00000000..133da84e
--- /dev/null
+++ b/pinia-vitest/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/pinia-vitest/README.md b/pinia-vitest/README.md
new file mode 100644
index 00000000..366e7cd1
--- /dev/null
+++ b/pinia-vitest/README.md
@@ -0,0 +1,35 @@
+# pinia-vitest
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[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).
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Unit Tests with [Vitest](https://vitest.dev/)
+
+```sh
+pnpm test:unit
+```
diff --git a/pinia-vitest/index.html b/pinia-vitest/index.html
new file mode 100644
index 00000000..030a6ff5
--- /dev/null
+++ b/pinia-vitest/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/pinia-vitest/package.json b/pinia-vitest/package.json
new file mode 100644
index 00000000..ad4aa4ab
--- /dev/null
+++ b/pinia-vitest/package.json
@@ -0,0 +1,24 @@
+{
+ "name": "pinia-vitest",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom"
+ },
+ "dependencies": {
+ "pinia": "^2.0.16",
+ "vue": "^2.7.7"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vue/test-utils": "^1.3.0",
+ "jsdom": "^20.0.0",
+ "terser": "^5.14.2",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7"
+ }
+}
diff --git a/pinia-vitest/public/favicon.ico b/pinia-vitest/public/favicon.ico
new file mode 100644
index 00000000..df36fcfb
Binary files /dev/null and b/pinia-vitest/public/favicon.ico differ
diff --git a/pinia-vitest/src/App.vue b/pinia-vitest/src/App.vue
new file mode 100644
index 00000000..45fbfd94
--- /dev/null
+++ b/pinia-vitest/src/App.vue
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pinia-vitest/src/assets/base.css b/pinia-vitest/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/pinia-vitest/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/pinia-vitest/src/assets/logo.svg b/pinia-vitest/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/pinia-vitest/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/pinia-vitest/src/assets/main.css b/pinia-vitest/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/pinia-vitest/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/pinia-vitest/src/components/HelloWorld.vue b/pinia-vitest/src/components/HelloWorld.vue
new file mode 100644
index 00000000..de8b576a
--- /dev/null
+++ b/pinia-vitest/src/components/HelloWorld.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 .
+
+
+
+
+
diff --git a/pinia-vitest/src/components/TheWelcome.vue b/pinia-vitest/src/components/TheWelcome.vue
new file mode 100644
index 00000000..cccc38ef
--- /dev/null
+++ b/pinia-vitest/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/pinia-vitest/src/components/WelcomeItem.vue b/pinia-vitest/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/pinia-vitest/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/pinia-vitest/src/components/__tests__/HelloWorld.spec.js b/pinia-vitest/src/components/__tests__/HelloWorld.spec.js
new file mode 100644
index 00000000..293bf197
--- /dev/null
+++ b/pinia-vitest/src/components/__tests__/HelloWorld.spec.js
@@ -0,0 +1,11 @@
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('renders properly', () => {
+ const wrapper = mount(HelloWorld, { propsData: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
+ })
+})
diff --git a/pinia-vitest/src/components/icons/IconCommunity.vue b/pinia-vitest/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/pinia-vitest/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/pinia-vitest/src/components/icons/IconDocumentation.vue b/pinia-vitest/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/pinia-vitest/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/pinia-vitest/src/components/icons/IconEcosystem.vue b/pinia-vitest/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/pinia-vitest/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/pinia-vitest/src/components/icons/IconSupport.vue b/pinia-vitest/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/pinia-vitest/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/pinia-vitest/src/components/icons/IconTooling.vue b/pinia-vitest/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/pinia-vitest/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/pinia-vitest/src/main.js b/pinia-vitest/src/main.js
new file mode 100644
index 00000000..febe0dbe
--- /dev/null
+++ b/pinia-vitest/src/main.js
@@ -0,0 +1,13 @@
+import Vue from 'vue'
+import { createPinia, PiniaVuePlugin } from 'pinia'
+
+import App from './App.vue'
+
+import './assets/main.css'
+
+Vue.use(PiniaVuePlugin)
+
+new Vue({
+ pinia: createPinia(),
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/pinia-vitest/src/stores/counter.js b/pinia-vitest/src/stores/counter.js
new file mode 100644
index 00000000..4a2d2427
--- /dev/null
+++ b/pinia-vitest/src/stores/counter.js
@@ -0,0 +1,16 @@
+import { defineStore } from 'pinia'
+
+export const useCounterStore = defineStore({
+ id: 'counter',
+ state: () => ({
+ counter: 0
+ }),
+ getters: {
+ doubleCount: (state) => state.counter * 2
+ },
+ actions: {
+ increment() {
+ this.counter++
+ }
+ }
+})
diff --git a/pinia-vitest/vite.config.js b/pinia-vitest/vite.config.js
new file mode 100644
index 00000000..d4945079
--- /dev/null
+++ b/pinia-vitest/vite.config.js
@@ -0,0 +1,21 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/pinia-with-tests/README.md b/pinia-with-tests/README.md
index ce0f774d..6e06c101 100644
--- a/pinia-with-tests/README.md
+++ b/pinia-with-tests/README.md
@@ -4,7 +4,7 @@ This template should help get you started developing with Vue 3 in Vite.
## Recommended IDE Setup
-[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=johnsoncodehk.volar) (and disable Vetur).
+[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).
## Customize configuration
@@ -28,10 +28,10 @@ pnpm dev
pnpm build
```
-### Run Unit Tests with [Cypress Component Testing](https://docs.cypress.io/guides/component-testing/introduction)
+### Run Unit Tests with [Vitest](https://vitest.dev/)
```sh
-pnpm test:unit # or `pnpm test:unit:ci` for headless testing
+pnpm test:unit
```
### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
diff --git a/pinia-with-tests/cypress.config.js b/pinia-with-tests/cypress.config.js
new file mode 100644
index 00000000..9cf6a199
--- /dev/null
+++ b/pinia-with-tests/cypress.config.js
@@ -0,0 +1,8 @@
+const { defineConfig } = require('cypress')
+
+module.exports = defineConfig({
+ e2e: {
+ specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
+ baseUrl: 'http://localhost:4173/'
+ }
+})
diff --git a/pinia-with-tests/cypress.json b/pinia-with-tests/cypress.json
deleted file mode 100644
index 3d372252..00000000
--- a/pinia-with-tests/cypress.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "baseUrl": "http://localhost:5050/",
- "component": {
- "componentFolder": "src",
- "testFiles": "**/__tests__/*.spec.{js,ts,jsx,tsx}"
- }
-}
diff --git a/pinia-with-tests/cypress/e2e/example.cy.js b/pinia-with-tests/cypress/e2e/example.cy.js
new file mode 100644
index 00000000..7a8c909f
--- /dev/null
+++ b/pinia-with-tests/cypress/e2e/example.cy.js
@@ -0,0 +1,8 @@
+// https://docs.cypress.io/api/introduction/api.html
+
+describe('My First Test', () => {
+ it('visits the app root url', () => {
+ cy.visit('/')
+ cy.contains('h1', 'You did it!')
+ })
+})
diff --git a/pinia-with-tests/cypress/e2e/jsconfig.json b/pinia-with-tests/cypress/e2e/jsconfig.json
new file mode 100644
index 00000000..c790a70d
--- /dev/null
+++ b/pinia-with-tests/cypress/e2e/jsconfig.json
@@ -0,0 +1,8 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "lib": ["es5", "dom"],
+ "types": ["cypress"]
+ },
+ "include": ["./**/*", "../support/**/*"]
+}
diff --git a/pinia-with-tests/cypress/jsconfig.json b/pinia-with-tests/cypress/jsconfig.json
deleted file mode 100644
index b5b2f972..00000000
--- a/pinia-with-tests/cypress/jsconfig.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "compilerOptions": {
- "target": "es5",
- "lib": ["es5", "dom"],
- "types": ["cypress"]
- },
- "include": ["./**/*"]
-}
diff --git a/pinia-with-tests/cypress/plugins/index.js b/pinia-with-tests/cypress/plugins/index.js
deleted file mode 100644
index ad2e351d..00000000
--- a/pinia-with-tests/cypress/plugins/index.js
+++ /dev/null
@@ -1,28 +0,0 @@
-///
-// ***********************************************************
-// This example plugins/index.js can be used to load plugins
-//
-// You can change the location of this file or turn off loading
-// the plugins file with the 'pluginsFile' configuration option.
-//
-// You can read more here:
-// https://on.cypress.io/plugins-guide
-// ***********************************************************
-
-// This function is called when a project is opened or re-opened (e.g. due to
-// the project's config changing)
-
-const { startDevServer } = require('@cypress/vite-dev-server')
-
-/**
- * @type {Cypress.PluginConfig}
- */
-// eslint-disable-next-line no-unused-vars
-module.exports = (on, config) => {
- // `on` is used to hook into various events Cypress emits
- // `config` is the resolved Cypress config
- on('dev-server:start', (options) => {
- return startDevServer({ options })
- })
- return config
-}
diff --git a/with-tests/cypress/support/index.js b/pinia-with-tests/cypress/support/e2e.js
similarity index 100%
rename from with-tests/cypress/support/index.js
rename to pinia-with-tests/cypress/support/e2e.js
diff --git a/pinia-with-tests/package.json b/pinia-with-tests/package.json
index a7a70523..05d12a30 100644
--- a/pinia-with-tests/package.json
+++ b/pinia-with-tests/package.json
@@ -4,22 +4,25 @@
"scripts": {
"dev": "vite",
"build": "vite build",
- "preview": "vite preview --port 5050",
- "test:unit": "cypress open-ct",
- "test:unit:ci": "cypress run-ct --quiet --reporter spec",
- "test:e2e": "start-server-and-test preview http://127.0.0.1:5050/ 'cypress open'",
- "test:e2e:ci": "start-server-and-test preview http://127.0.0.1:5050/ 'cypress run'"
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom",
+ "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
+ "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'"
},
"dependencies": {
- "pinia": "^2.0.4",
- "vue": "^3.2.22"
+ "pinia": "^2.0.16",
+ "vue": "^2.7.7"
},
"devDependencies": {
- "@cypress/vite-dev-server": "^2.2.1",
- "@cypress/vue": "^3.0.5",
- "@vitejs/plugin-vue": "^1.10.0",
- "cypress": "^8.7.0",
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vue/test-utils": "^1.3.0",
+ "cypress": "^10.3.0",
+ "jsdom": "^20.0.0",
"start-server-and-test": "^1.14.0",
- "vite": "^2.6.14"
+ "terser": "^5.14.2",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7"
}
}
diff --git a/pinia-with-tests/src/App.vue b/pinia-with-tests/src/App.vue
index b0b6901b..45fbfd94 100644
--- a/pinia-with-tests/src/App.vue
+++ b/pinia-with-tests/src/App.vue
@@ -4,30 +4,22 @@ import TheWelcome from './components/TheWelcome.vue'
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/pinia-with-tests/src/assets/main.css b/pinia-with-tests/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/pinia-with-tests/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/pinia-with-tests/src/components/HelloWorld.vue b/pinia-with-tests/src/components/HelloWorld.vue
index aa16fa1f..de8b576a 100644
--- a/pinia-with-tests/src/components/HelloWorld.vue
+++ b/pinia-with-tests/src/components/HelloWorld.vue
@@ -13,7 +13,7 @@ defineProps({
You’ve successfully created a project with
Vite +
- Vue 3 .
+ Vue 2 .
diff --git a/pinia-with-tests/src/components/TheWelcome.vue b/pinia-with-tests/src/components/TheWelcome.vue
index 1d003f86..cccc38ef 100644
--- a/pinia-with-tests/src/components/TheWelcome.vue
+++ b/pinia-with-tests/src/components/TheWelcome.vue
@@ -8,77 +8,79 @@ import SupportIcon from './icons/IconSupport.vue'
-
-
-
-
- Documentation
+
+
+
+
+
+ Documentation
- Vue’s
- official documentation
- provides you with all information you need to get started.
-
+ Vue’s
+
official documentation
+ provides you with all information you need to get started.
+
-
-
-
-
- Tooling
+
+
+
+
+ Tooling
- This project is served and bundled with
- Vite . The recommended IDE
- setup is VSCode +
- Volar . If you need to test
- your components and web pages, check out
- Cypress and
- Cypress Component Testing .
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
-
+
- More instructions are available in README.md
.
-
+ More instructions are available in README.md
.
+
-
-
-
-
- Ecosystem
+
+
+
+
+ Ecosystem
- Get official tools and libraries for your project:
- Vuex ,
- Vue Router ,
- Vue Test Utils , and
- Vue Dev Tools . If you need more
- resources, we suggest paying
- Awesome Vue
- a visit.
-
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
-
-
-
-
- Community
+
+
+
+
+ Community
- Got stuck? Ask your question on
- Vue Land , our official Discord server, or
- StackOverflow .
- You should also subscribe to
- our mailing list and follow the official
- @vuejs
- twitter account for latest news in the Vue world.
-
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
-
-
-
-
- Support Vue
+
+
+
+
+ Support Vue
- As an independent project, Vue relies on community backing for its sustainability. You can help
- us by
- becoming a sponsor .
-
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
diff --git a/pinia-with-tests/src/components/__tests__/HelloWorld.spec.js b/pinia-with-tests/src/components/__tests__/HelloWorld.spec.js
index a69f3a9d..293bf197 100644
--- a/pinia-with-tests/src/components/__tests__/HelloWorld.spec.js
+++ b/pinia-with-tests/src/components/__tests__/HelloWorld.spec.js
@@ -1,13 +1,11 @@
-import { mount } from '@cypress/vue'
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
import HelloWorld from '../HelloWorld.vue'
describe('HelloWorld', () => {
- it('playground', () => {
- mount(HelloWorld, { props: { msg: 'Hello Cypress' } })
- })
-
it('renders properly', () => {
- mount(HelloWorld, { props: { msg: 'Hello Cypress' } })
- cy.get('h1').should('contain', 'Hello Cypress')
+ const wrapper = mount(HelloWorld, { propsData: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
})
})
diff --git a/pinia-with-tests/src/components/icons/IconTooling.vue b/pinia-with-tests/src/components/icons/IconTooling.vue
index 660598d7..07dc46b0 100644
--- a/pinia-with-tests/src/components/icons/IconTooling.vue
+++ b/pinia-with-tests/src/components/icons/IconTooling.vue
@@ -2,8 +2,6 @@
h(App)
+}).$mount('#app')
diff --git a/pinia-with-tests/vite.config.js b/pinia-with-tests/vite.config.js
index 5cd06c63..d4945079 100644
--- a/pinia-with-tests/vite.config.js
+++ b/pinia-with-tests/vite.config.js
@@ -1,11 +1,18 @@
-import { fileURLToPath } from 'url'
+import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vite'
-import vue from '@vitejs/plugin-vue'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
// https://vitejs.dev/config/
export default defineConfig({
- plugins: [vue()],
+ plugins: [
+ vue2(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
diff --git a/pinia/README.md b/pinia/README.md
index d1d32134..f9e2c8ef 100644
--- a/pinia/README.md
+++ b/pinia/README.md
@@ -4,7 +4,7 @@ This template should help get you started developing with Vue 3 in Vite.
## Recommended IDE Setup
-[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=johnsoncodehk.volar) (and disable Vetur).
+[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).
## Customize configuration
diff --git a/pinia/package.json b/pinia/package.json
index e29a8bf4..28636c91 100644
--- a/pinia/package.json
+++ b/pinia/package.json
@@ -4,14 +4,16 @@
"scripts": {
"dev": "vite",
"build": "vite build",
- "preview": "vite preview --port 5050"
+ "preview": "vite preview --port 4173"
},
"dependencies": {
- "pinia": "^2.0.4",
- "vue": "^3.2.22"
+ "pinia": "^2.0.16",
+ "vue": "^2.7.7"
},
"devDependencies": {
- "@vitejs/plugin-vue": "^1.10.0",
- "vite": "^2.6.14"
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "terser": "^5.14.2",
+ "vite": "^3.0.2"
}
}
diff --git a/pinia/src/App.vue b/pinia/src/App.vue
index b0b6901b..45fbfd94 100644
--- a/pinia/src/App.vue
+++ b/pinia/src/App.vue
@@ -4,30 +4,22 @@ import TheWelcome from './components/TheWelcome.vue'
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/pinia/src/assets/main.css b/pinia/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/pinia/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/pinia/src/components/HelloWorld.vue b/pinia/src/components/HelloWorld.vue
index aa16fa1f..de8b576a 100644
--- a/pinia/src/components/HelloWorld.vue
+++ b/pinia/src/components/HelloWorld.vue
@@ -13,7 +13,7 @@ defineProps({
You’ve successfully created a project with
Vite +
- Vue 3 .
+ Vue 2 .
diff --git a/pinia/src/components/TheWelcome.vue b/pinia/src/components/TheWelcome.vue
index 1d003f86..cccc38ef 100644
--- a/pinia/src/components/TheWelcome.vue
+++ b/pinia/src/components/TheWelcome.vue
@@ -8,77 +8,79 @@ import SupportIcon from './icons/IconSupport.vue'
-
-
-
-
- Documentation
+
+
+
+
+
+ Documentation
- Vue’s
- official documentation
- provides you with all information you need to get started.
-
+ Vue’s
+
official documentation
+ provides you with all information you need to get started.
+
-
-
-
-
- Tooling
+
+
+
+
+ Tooling
- This project is served and bundled with
- Vite . The recommended IDE
- setup is VSCode +
- Volar . If you need to test
- your components and web pages, check out
- Cypress and
- Cypress Component Testing .
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
-
+
- More instructions are available in README.md
.
-
+ More instructions are available in README.md
.
+
-
-
-
-
- Ecosystem
+
+
+
+
+ Ecosystem
- Get official tools and libraries for your project:
- Vuex ,
- Vue Router ,
- Vue Test Utils , and
- Vue Dev Tools . If you need more
- resources, we suggest paying
- Awesome Vue
- a visit.
-
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
-
-
-
-
- Community
+
+
+
+
+ Community
- Got stuck? Ask your question on
- Vue Land , our official Discord server, or
- StackOverflow .
- You should also subscribe to
- our mailing list and follow the official
- @vuejs
- twitter account for latest news in the Vue world.
-
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
-
-
-
-
- Support Vue
+
+
+
+
+ Support Vue
- As an independent project, Vue relies on community backing for its sustainability. You can help
- us by
- becoming a sponsor .
-
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
diff --git a/pinia/src/components/icons/IconTooling.vue b/pinia/src/components/icons/IconTooling.vue
index 660598d7..07dc46b0 100644
--- a/pinia/src/components/icons/IconTooling.vue
+++ b/pinia/src/components/icons/IconTooling.vue
@@ -2,8 +2,6 @@
h(App)
+}).$mount('#app')
diff --git a/pinia/vite.config.js b/pinia/vite.config.js
index 5cd06c63..d4945079 100644
--- a/pinia/vite.config.js
+++ b/pinia/vite.config.js
@@ -1,11 +1,18 @@
-import { fileURLToPath } from 'url'
+import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vite'
-import vue from '@vitejs/plugin-vue'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
// https://vitejs.dev/config/
export default defineConfig({
- plugins: [vue()],
+ plugins: [
+ vue2(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
new file mode 100644
index 00000000..b963f7cb
--- /dev/null
+++ b/pnpm-workspace.yaml
@@ -0,0 +1,2 @@
+packages:
+ - '*'
diff --git a/router-cypress/.gitignore b/router-cypress/.gitignore
new file mode 100644
index 00000000..133da84e
--- /dev/null
+++ b/router-cypress/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/router-cypress/README.md b/router-cypress/README.md
new file mode 100644
index 00000000..ed53dfb7
--- /dev/null
+++ b/router-cypress/README.md
@@ -0,0 +1,42 @@
+# router-cypress
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[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).
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Headed Component Tests with [Cypress Component Testing](https://on.cypress.io/component)
+
+```sh
+pnpm test:unit # or `pnpm test:unit:ci` for headless testing
+```
+
+### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
+
+```sh
+pnpm build
+pnpm test:e2e # or `pnpm test:e2e:ci` for headless testing
+```
diff --git a/router-cypress/cypress.config.js b/router-cypress/cypress.config.js
new file mode 100644
index 00000000..c3aba743
--- /dev/null
+++ b/router-cypress/cypress.config.js
@@ -0,0 +1,15 @@
+const { defineConfig } = require('cypress')
+
+module.exports = defineConfig({
+ e2e: {
+ specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
+ baseUrl: 'http://localhost:4173/'
+ },
+ component: {
+ specPattern: 'src/**/__tests__/*.{cy,spec}.{js,ts,jsx,tsx}',
+ devServer: {
+ framework: 'vue',
+ bundler: 'vite'
+ }
+ }
+})
diff --git a/router-cypress/cypress/e2e/example.cy.js b/router-cypress/cypress/e2e/example.cy.js
new file mode 100644
index 00000000..7a8c909f
--- /dev/null
+++ b/router-cypress/cypress/e2e/example.cy.js
@@ -0,0 +1,8 @@
+// https://docs.cypress.io/api/introduction/api.html
+
+describe('My First Test', () => {
+ it('visits the app root url', () => {
+ cy.visit('/')
+ cy.contains('h1', 'You did it!')
+ })
+})
diff --git a/router-cypress/cypress/e2e/jsconfig.json b/router-cypress/cypress/e2e/jsconfig.json
new file mode 100644
index 00000000..c790a70d
--- /dev/null
+++ b/router-cypress/cypress/e2e/jsconfig.json
@@ -0,0 +1,8 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "lib": ["es5", "dom"],
+ "types": ["cypress"]
+ },
+ "include": ["./**/*", "../support/**/*"]
+}
diff --git a/router-cypress/cypress/fixtures/example.json b/router-cypress/cypress/fixtures/example.json
new file mode 100644
index 00000000..02e42543
--- /dev/null
+++ b/router-cypress/cypress/fixtures/example.json
@@ -0,0 +1,5 @@
+{
+ "name": "Using fixtures to represent data",
+ "email": "hello@cypress.io",
+ "body": "Fixtures are a great way to mock data for responses to routes"
+}
diff --git a/router-cypress/cypress/support/commands.js b/router-cypress/cypress/support/commands.js
new file mode 100644
index 00000000..119ab03f
--- /dev/null
+++ b/router-cypress/cypress/support/commands.js
@@ -0,0 +1,25 @@
+// ***********************************************
+// This example commands.js shows you how to
+// create various custom commands and overwrite
+// existing commands.
+//
+// For more comprehensive examples of custom
+// commands please read more here:
+// https://on.cypress.io/custom-commands
+// ***********************************************
+//
+//
+// -- This is a parent command --
+// Cypress.Commands.add('login', (email, password) => { ... })
+//
+//
+// -- This is a child command --
+// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
+//
+//
+// -- This is a dual command --
+// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
+//
+//
+// -- This will overwrite an existing command --
+// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
diff --git a/router-cypress/cypress/support/component-index.html b/router-cypress/cypress/support/component-index.html
new file mode 100644
index 00000000..5f9622ae
--- /dev/null
+++ b/router-cypress/cypress/support/component-index.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+ Components App
+
+
+
+
+
diff --git a/router-cypress/cypress/support/component.js b/router-cypress/cypress/support/component.js
new file mode 100644
index 00000000..9b98cf0e
--- /dev/null
+++ b/router-cypress/cypress/support/component.js
@@ -0,0 +1,30 @@
+// ***********************************************************
+// This example support/component.js is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
+
+// Import global styles
+import '@/assets/main.css'
+
+import { mount } from 'cypress/vue2'
+
+Cypress.Commands.add('mount', mount)
+
+// Example use:
+// cy.mount(MyComponent)
diff --git a/router-cypress/cypress/support/e2e.js b/router-cypress/cypress/support/e2e.js
new file mode 100644
index 00000000..d68db96d
--- /dev/null
+++ b/router-cypress/cypress/support/e2e.js
@@ -0,0 +1,20 @@
+// ***********************************************************
+// This example support/index.js is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
diff --git a/router-cypress/index.html b/router-cypress/index.html
new file mode 100644
index 00000000..030a6ff5
--- /dev/null
+++ b/router-cypress/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/router-cypress/package.json b/router-cypress/package.json
new file mode 100644
index 00000000..6c354651
--- /dev/null
+++ b/router-cypress/package.json
@@ -0,0 +1,25 @@
+{
+ "name": "router-cypress",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview --port 4173",
+ "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
+ "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'",
+ "test:unit": "cypress open --component",
+ "test:unit:ci": "cypress run --component --quiet --reporter spec"
+ },
+ "dependencies": {
+ "vue": "^2.7.7",
+ "vue-router": "^3.5.4"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "cypress": "^10.3.0",
+ "start-server-and-test": "^1.14.0",
+ "terser": "^5.14.2",
+ "vite": "^3.0.2"
+ }
+}
diff --git a/router-cypress/public/favicon.ico b/router-cypress/public/favicon.ico
new file mode 100644
index 00000000..df36fcfb
Binary files /dev/null and b/router-cypress/public/favicon.ico differ
diff --git a/router-cypress/src/App.vue b/router-cypress/src/App.vue
new file mode 100644
index 00000000..1f84c747
--- /dev/null
+++ b/router-cypress/src/App.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+ Home
+ About
+
+
+
+
+
+
+
+
+
diff --git a/router-cypress/src/assets/base.css b/router-cypress/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/router-cypress/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/router-cypress/src/assets/logo.svg b/router-cypress/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/router-cypress/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/router-cypress/src/assets/main.css b/router-cypress/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/router-cypress/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/router-cypress/src/components/HelloWorld.vue b/router-cypress/src/components/HelloWorld.vue
new file mode 100644
index 00000000..de8b576a
--- /dev/null
+++ b/router-cypress/src/components/HelloWorld.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 .
+
+
+
+
+
diff --git a/router-cypress/src/components/TheWelcome.vue b/router-cypress/src/components/TheWelcome.vue
new file mode 100644
index 00000000..cccc38ef
--- /dev/null
+++ b/router-cypress/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/router-cypress/src/components/WelcomeItem.vue b/router-cypress/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/router-cypress/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/router-cypress/src/components/__tests__/HelloWorld.cy.js b/router-cypress/src/components/__tests__/HelloWorld.cy.js
new file mode 100644
index 00000000..0e0c065a
--- /dev/null
+++ b/router-cypress/src/components/__tests__/HelloWorld.cy.js
@@ -0,0 +1,12 @@
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('playground', () => {
+ cy.mount(HelloWorld, { propsData: { msg: 'Hello Cypress' } })
+ })
+
+ it('renders properly', () => {
+ cy.mount(HelloWorld, { propsData: { msg: 'Hello Cypress' } })
+ cy.get('h1').should('contain', 'Hello Cypress')
+ })
+})
diff --git a/router-cypress/src/components/icons/IconCommunity.vue b/router-cypress/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/router-cypress/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/router-cypress/src/components/icons/IconDocumentation.vue b/router-cypress/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/router-cypress/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/router-cypress/src/components/icons/IconEcosystem.vue b/router-cypress/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/router-cypress/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/router-cypress/src/components/icons/IconSupport.vue b/router-cypress/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/router-cypress/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/router-cypress/src/components/icons/IconTooling.vue b/router-cypress/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/router-cypress/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/router-cypress/src/main.js b/router-cypress/src/main.js
new file mode 100644
index 00000000..4919cf77
--- /dev/null
+++ b/router-cypress/src/main.js
@@ -0,0 +1,11 @@
+import Vue from 'vue'
+
+import App from './App.vue'
+import router from './router'
+
+import './assets/main.css'
+
+new Vue({
+ router,
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/router-cypress/src/router/index.js b/router-cypress/src/router/index.js
new file mode 100644
index 00000000..cf9820b0
--- /dev/null
+++ b/router-cypress/src/router/index.js
@@ -0,0 +1,27 @@
+import Vue from 'vue'
+import VueRouter from 'vue-router'
+import HomeView from '../views/HomeView.vue'
+
+Vue.use(VueRouter)
+
+const router = new VueRouter({
+ mode: 'history',
+ base: import.meta.env.BASE_URL,
+ routes: [
+ {
+ path: '/',
+ name: 'home',
+ component: HomeView
+ },
+ {
+ path: '/about',
+ name: 'about',
+ // route level code-splitting
+ // this generates a separate chunk (About.[hash].js) for this route
+ // which is lazy-loaded when the route is visited.
+ component: () => import('../views/AboutView.vue')
+ }
+ ]
+})
+
+export default router
diff --git a/router-cypress/src/views/AboutView.vue b/router-cypress/src/views/AboutView.vue
new file mode 100644
index 00000000..756ad2a1
--- /dev/null
+++ b/router-cypress/src/views/AboutView.vue
@@ -0,0 +1,15 @@
+
+
+
This is an about page
+
+
+
+
diff --git a/router-cypress/src/views/HomeView.vue b/router-cypress/src/views/HomeView.vue
new file mode 100644
index 00000000..6555a646
--- /dev/null
+++ b/router-cypress/src/views/HomeView.vue
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/router-cypress/vite.config.js b/router-cypress/vite.config.js
new file mode 100644
index 00000000..d4945079
--- /dev/null
+++ b/router-cypress/vite.config.js
@@ -0,0 +1,21 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/router-pinia-cypress/.gitignore b/router-pinia-cypress/.gitignore
new file mode 100644
index 00000000..133da84e
--- /dev/null
+++ b/router-pinia-cypress/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/router-pinia-cypress/README.md b/router-pinia-cypress/README.md
new file mode 100644
index 00000000..f92db849
--- /dev/null
+++ b/router-pinia-cypress/README.md
@@ -0,0 +1,42 @@
+# router-pinia-cypress
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[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).
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Headed Component Tests with [Cypress Component Testing](https://on.cypress.io/component)
+
+```sh
+pnpm test:unit # or `pnpm test:unit:ci` for headless testing
+```
+
+### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
+
+```sh
+pnpm build
+pnpm test:e2e # or `pnpm test:e2e:ci` for headless testing
+```
diff --git a/router-pinia-cypress/cypress.config.js b/router-pinia-cypress/cypress.config.js
new file mode 100644
index 00000000..c3aba743
--- /dev/null
+++ b/router-pinia-cypress/cypress.config.js
@@ -0,0 +1,15 @@
+const { defineConfig } = require('cypress')
+
+module.exports = defineConfig({
+ e2e: {
+ specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
+ baseUrl: 'http://localhost:4173/'
+ },
+ component: {
+ specPattern: 'src/**/__tests__/*.{cy,spec}.{js,ts,jsx,tsx}',
+ devServer: {
+ framework: 'vue',
+ bundler: 'vite'
+ }
+ }
+})
diff --git a/router-pinia-cypress/cypress/e2e/example.cy.js b/router-pinia-cypress/cypress/e2e/example.cy.js
new file mode 100644
index 00000000..7a8c909f
--- /dev/null
+++ b/router-pinia-cypress/cypress/e2e/example.cy.js
@@ -0,0 +1,8 @@
+// https://docs.cypress.io/api/introduction/api.html
+
+describe('My First Test', () => {
+ it('visits the app root url', () => {
+ cy.visit('/')
+ cy.contains('h1', 'You did it!')
+ })
+})
diff --git a/router-pinia-cypress/cypress/e2e/jsconfig.json b/router-pinia-cypress/cypress/e2e/jsconfig.json
new file mode 100644
index 00000000..c790a70d
--- /dev/null
+++ b/router-pinia-cypress/cypress/e2e/jsconfig.json
@@ -0,0 +1,8 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "lib": ["es5", "dom"],
+ "types": ["cypress"]
+ },
+ "include": ["./**/*", "../support/**/*"]
+}
diff --git a/router-pinia-cypress/cypress/fixtures/example.json b/router-pinia-cypress/cypress/fixtures/example.json
new file mode 100644
index 00000000..02e42543
--- /dev/null
+++ b/router-pinia-cypress/cypress/fixtures/example.json
@@ -0,0 +1,5 @@
+{
+ "name": "Using fixtures to represent data",
+ "email": "hello@cypress.io",
+ "body": "Fixtures are a great way to mock data for responses to routes"
+}
diff --git a/router-pinia-cypress/cypress/support/commands.js b/router-pinia-cypress/cypress/support/commands.js
new file mode 100644
index 00000000..119ab03f
--- /dev/null
+++ b/router-pinia-cypress/cypress/support/commands.js
@@ -0,0 +1,25 @@
+// ***********************************************
+// This example commands.js shows you how to
+// create various custom commands and overwrite
+// existing commands.
+//
+// For more comprehensive examples of custom
+// commands please read more here:
+// https://on.cypress.io/custom-commands
+// ***********************************************
+//
+//
+// -- This is a parent command --
+// Cypress.Commands.add('login', (email, password) => { ... })
+//
+//
+// -- This is a child command --
+// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
+//
+//
+// -- This is a dual command --
+// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
+//
+//
+// -- This will overwrite an existing command --
+// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
diff --git a/router-pinia-cypress/cypress/support/component-index.html b/router-pinia-cypress/cypress/support/component-index.html
new file mode 100644
index 00000000..5f9622ae
--- /dev/null
+++ b/router-pinia-cypress/cypress/support/component-index.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+ Components App
+
+
+
+
+
diff --git a/router-pinia-cypress/cypress/support/component.js b/router-pinia-cypress/cypress/support/component.js
new file mode 100644
index 00000000..9b98cf0e
--- /dev/null
+++ b/router-pinia-cypress/cypress/support/component.js
@@ -0,0 +1,30 @@
+// ***********************************************************
+// This example support/component.js is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
+
+// Import global styles
+import '@/assets/main.css'
+
+import { mount } from 'cypress/vue2'
+
+Cypress.Commands.add('mount', mount)
+
+// Example use:
+// cy.mount(MyComponent)
diff --git a/router-pinia-cypress/cypress/support/e2e.js b/router-pinia-cypress/cypress/support/e2e.js
new file mode 100644
index 00000000..d68db96d
--- /dev/null
+++ b/router-pinia-cypress/cypress/support/e2e.js
@@ -0,0 +1,20 @@
+// ***********************************************************
+// This example support/index.js is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
diff --git a/router-pinia-cypress/index.html b/router-pinia-cypress/index.html
new file mode 100644
index 00000000..030a6ff5
--- /dev/null
+++ b/router-pinia-cypress/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/router-pinia-cypress/package.json b/router-pinia-cypress/package.json
new file mode 100644
index 00000000..3f942e7c
--- /dev/null
+++ b/router-pinia-cypress/package.json
@@ -0,0 +1,26 @@
+{
+ "name": "router-pinia-cypress",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview --port 4173",
+ "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
+ "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'",
+ "test:unit": "cypress open --component",
+ "test:unit:ci": "cypress run --component --quiet --reporter spec"
+ },
+ "dependencies": {
+ "pinia": "^2.0.16",
+ "vue": "^2.7.7",
+ "vue-router": "^3.5.4"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "cypress": "^10.3.0",
+ "start-server-and-test": "^1.14.0",
+ "terser": "^5.14.2",
+ "vite": "^3.0.2"
+ }
+}
diff --git a/router-pinia-cypress/public/favicon.ico b/router-pinia-cypress/public/favicon.ico
new file mode 100644
index 00000000..df36fcfb
Binary files /dev/null and b/router-pinia-cypress/public/favicon.ico differ
diff --git a/router-pinia-cypress/src/App.vue b/router-pinia-cypress/src/App.vue
new file mode 100644
index 00000000..1f84c747
--- /dev/null
+++ b/router-pinia-cypress/src/App.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+ Home
+ About
+
+
+
+
+
+
+
+
+
diff --git a/router-pinia-cypress/src/assets/base.css b/router-pinia-cypress/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/router-pinia-cypress/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/router-pinia-cypress/src/assets/logo.svg b/router-pinia-cypress/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/router-pinia-cypress/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/router-pinia-cypress/src/assets/main.css b/router-pinia-cypress/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/router-pinia-cypress/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/router-pinia-cypress/src/components/HelloWorld.vue b/router-pinia-cypress/src/components/HelloWorld.vue
new file mode 100644
index 00000000..de8b576a
--- /dev/null
+++ b/router-pinia-cypress/src/components/HelloWorld.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 .
+
+
+
+
+
diff --git a/router-pinia-cypress/src/components/TheWelcome.vue b/router-pinia-cypress/src/components/TheWelcome.vue
new file mode 100644
index 00000000..cccc38ef
--- /dev/null
+++ b/router-pinia-cypress/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/router-pinia-cypress/src/components/WelcomeItem.vue b/router-pinia-cypress/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/router-pinia-cypress/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/router-pinia-cypress/src/components/__tests__/HelloWorld.cy.js b/router-pinia-cypress/src/components/__tests__/HelloWorld.cy.js
new file mode 100644
index 00000000..0e0c065a
--- /dev/null
+++ b/router-pinia-cypress/src/components/__tests__/HelloWorld.cy.js
@@ -0,0 +1,12 @@
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('playground', () => {
+ cy.mount(HelloWorld, { propsData: { msg: 'Hello Cypress' } })
+ })
+
+ it('renders properly', () => {
+ cy.mount(HelloWorld, { propsData: { msg: 'Hello Cypress' } })
+ cy.get('h1').should('contain', 'Hello Cypress')
+ })
+})
diff --git a/router-pinia-cypress/src/components/icons/IconCommunity.vue b/router-pinia-cypress/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/router-pinia-cypress/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/router-pinia-cypress/src/components/icons/IconDocumentation.vue b/router-pinia-cypress/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/router-pinia-cypress/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/router-pinia-cypress/src/components/icons/IconEcosystem.vue b/router-pinia-cypress/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/router-pinia-cypress/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/router-pinia-cypress/src/components/icons/IconSupport.vue b/router-pinia-cypress/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/router-pinia-cypress/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/router-pinia-cypress/src/components/icons/IconTooling.vue b/router-pinia-cypress/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/router-pinia-cypress/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/router-pinia-cypress/src/main.js b/router-pinia-cypress/src/main.js
new file mode 100644
index 00000000..e11e78e0
--- /dev/null
+++ b/router-pinia-cypress/src/main.js
@@ -0,0 +1,15 @@
+import Vue from 'vue'
+import { createPinia, PiniaVuePlugin } from 'pinia'
+
+import App from './App.vue'
+import router from './router'
+
+import './assets/main.css'
+
+Vue.use(PiniaVuePlugin)
+
+new Vue({
+ router,
+ pinia: createPinia(),
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/router-pinia-cypress/src/router/index.js b/router-pinia-cypress/src/router/index.js
new file mode 100644
index 00000000..cf9820b0
--- /dev/null
+++ b/router-pinia-cypress/src/router/index.js
@@ -0,0 +1,27 @@
+import Vue from 'vue'
+import VueRouter from 'vue-router'
+import HomeView from '../views/HomeView.vue'
+
+Vue.use(VueRouter)
+
+const router = new VueRouter({
+ mode: 'history',
+ base: import.meta.env.BASE_URL,
+ routes: [
+ {
+ path: '/',
+ name: 'home',
+ component: HomeView
+ },
+ {
+ path: '/about',
+ name: 'about',
+ // route level code-splitting
+ // this generates a separate chunk (About.[hash].js) for this route
+ // which is lazy-loaded when the route is visited.
+ component: () => import('../views/AboutView.vue')
+ }
+ ]
+})
+
+export default router
diff --git a/router-pinia-cypress/src/stores/counter.js b/router-pinia-cypress/src/stores/counter.js
new file mode 100644
index 00000000..4a2d2427
--- /dev/null
+++ b/router-pinia-cypress/src/stores/counter.js
@@ -0,0 +1,16 @@
+import { defineStore } from 'pinia'
+
+export const useCounterStore = defineStore({
+ id: 'counter',
+ state: () => ({
+ counter: 0
+ }),
+ getters: {
+ doubleCount: (state) => state.counter * 2
+ },
+ actions: {
+ increment() {
+ this.counter++
+ }
+ }
+})
diff --git a/router-pinia-cypress/src/views/AboutView.vue b/router-pinia-cypress/src/views/AboutView.vue
new file mode 100644
index 00000000..756ad2a1
--- /dev/null
+++ b/router-pinia-cypress/src/views/AboutView.vue
@@ -0,0 +1,15 @@
+
+
+
This is an about page
+
+
+
+
diff --git a/router-pinia-cypress/src/views/HomeView.vue b/router-pinia-cypress/src/views/HomeView.vue
new file mode 100644
index 00000000..6555a646
--- /dev/null
+++ b/router-pinia-cypress/src/views/HomeView.vue
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/router-pinia-cypress/vite.config.js b/router-pinia-cypress/vite.config.js
new file mode 100644
index 00000000..d4945079
--- /dev/null
+++ b/router-pinia-cypress/vite.config.js
@@ -0,0 +1,21 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/router-pinia-vitest-cypress/.gitignore b/router-pinia-vitest-cypress/.gitignore
new file mode 100644
index 00000000..133da84e
--- /dev/null
+++ b/router-pinia-vitest-cypress/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/router-pinia-vitest-cypress/README.md b/router-pinia-vitest-cypress/README.md
new file mode 100644
index 00000000..71f01420
--- /dev/null
+++ b/router-pinia-vitest-cypress/README.md
@@ -0,0 +1,42 @@
+# router-pinia-vitest-cypress
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[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).
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Unit Tests with [Vitest](https://vitest.dev/)
+
+```sh
+pnpm test:unit
+```
+
+### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
+
+```sh
+pnpm build
+pnpm test:e2e # or `pnpm test:e2e:ci` for headless testing
+```
diff --git a/router-pinia-vitest-cypress/cypress.config.js b/router-pinia-vitest-cypress/cypress.config.js
new file mode 100644
index 00000000..9cf6a199
--- /dev/null
+++ b/router-pinia-vitest-cypress/cypress.config.js
@@ -0,0 +1,8 @@
+const { defineConfig } = require('cypress')
+
+module.exports = defineConfig({
+ e2e: {
+ specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
+ baseUrl: 'http://localhost:4173/'
+ }
+})
diff --git a/router-pinia-vitest-cypress/cypress/e2e/example.cy.js b/router-pinia-vitest-cypress/cypress/e2e/example.cy.js
new file mode 100644
index 00000000..7a8c909f
--- /dev/null
+++ b/router-pinia-vitest-cypress/cypress/e2e/example.cy.js
@@ -0,0 +1,8 @@
+// https://docs.cypress.io/api/introduction/api.html
+
+describe('My First Test', () => {
+ it('visits the app root url', () => {
+ cy.visit('/')
+ cy.contains('h1', 'You did it!')
+ })
+})
diff --git a/router-pinia-vitest-cypress/cypress/e2e/jsconfig.json b/router-pinia-vitest-cypress/cypress/e2e/jsconfig.json
new file mode 100644
index 00000000..c790a70d
--- /dev/null
+++ b/router-pinia-vitest-cypress/cypress/e2e/jsconfig.json
@@ -0,0 +1,8 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "lib": ["es5", "dom"],
+ "types": ["cypress"]
+ },
+ "include": ["./**/*", "../support/**/*"]
+}
diff --git a/router-pinia-vitest-cypress/cypress/fixtures/example.json b/router-pinia-vitest-cypress/cypress/fixtures/example.json
new file mode 100644
index 00000000..02e42543
--- /dev/null
+++ b/router-pinia-vitest-cypress/cypress/fixtures/example.json
@@ -0,0 +1,5 @@
+{
+ "name": "Using fixtures to represent data",
+ "email": "hello@cypress.io",
+ "body": "Fixtures are a great way to mock data for responses to routes"
+}
diff --git a/router-pinia-vitest-cypress/cypress/support/commands.js b/router-pinia-vitest-cypress/cypress/support/commands.js
new file mode 100644
index 00000000..119ab03f
--- /dev/null
+++ b/router-pinia-vitest-cypress/cypress/support/commands.js
@@ -0,0 +1,25 @@
+// ***********************************************
+// This example commands.js shows you how to
+// create various custom commands and overwrite
+// existing commands.
+//
+// For more comprehensive examples of custom
+// commands please read more here:
+// https://on.cypress.io/custom-commands
+// ***********************************************
+//
+//
+// -- This is a parent command --
+// Cypress.Commands.add('login', (email, password) => { ... })
+//
+//
+// -- This is a child command --
+// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
+//
+//
+// -- This is a dual command --
+// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
+//
+//
+// -- This will overwrite an existing command --
+// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
diff --git a/router-pinia-vitest-cypress/cypress/support/e2e.js b/router-pinia-vitest-cypress/cypress/support/e2e.js
new file mode 100644
index 00000000..d68db96d
--- /dev/null
+++ b/router-pinia-vitest-cypress/cypress/support/e2e.js
@@ -0,0 +1,20 @@
+// ***********************************************************
+// This example support/index.js is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
diff --git a/router-pinia-vitest-cypress/index.html b/router-pinia-vitest-cypress/index.html
new file mode 100644
index 00000000..030a6ff5
--- /dev/null
+++ b/router-pinia-vitest-cypress/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/router-pinia-vitest-cypress/package.json b/router-pinia-vitest-cypress/package.json
new file mode 100644
index 00000000..784da2f5
--- /dev/null
+++ b/router-pinia-vitest-cypress/package.json
@@ -0,0 +1,29 @@
+{
+ "name": "router-pinia-vitest-cypress",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom",
+ "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
+ "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'"
+ },
+ "dependencies": {
+ "pinia": "^2.0.16",
+ "vue": "^2.7.7",
+ "vue-router": "^3.5.4"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vue/test-utils": "^1.3.0",
+ "cypress": "^10.3.0",
+ "jsdom": "^20.0.0",
+ "start-server-and-test": "^1.14.0",
+ "terser": "^5.14.2",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7"
+ }
+}
diff --git a/router-pinia-vitest-cypress/public/favicon.ico b/router-pinia-vitest-cypress/public/favicon.ico
new file mode 100644
index 00000000..df36fcfb
Binary files /dev/null and b/router-pinia-vitest-cypress/public/favicon.ico differ
diff --git a/router-pinia-vitest-cypress/src/App.vue b/router-pinia-vitest-cypress/src/App.vue
new file mode 100644
index 00000000..1f84c747
--- /dev/null
+++ b/router-pinia-vitest-cypress/src/App.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+ Home
+ About
+
+
+
+
+
+
+
+
+
diff --git a/router-pinia-vitest-cypress/src/assets/base.css b/router-pinia-vitest-cypress/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/router-pinia-vitest-cypress/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/router-pinia-vitest-cypress/src/assets/logo.svg b/router-pinia-vitest-cypress/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/router-pinia-vitest-cypress/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/router-pinia-vitest-cypress/src/assets/main.css b/router-pinia-vitest-cypress/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/router-pinia-vitest-cypress/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/router-pinia-vitest-cypress/src/components/HelloWorld.vue b/router-pinia-vitest-cypress/src/components/HelloWorld.vue
new file mode 100644
index 00000000..de8b576a
--- /dev/null
+++ b/router-pinia-vitest-cypress/src/components/HelloWorld.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 .
+
+
+
+
+
diff --git a/router-pinia-vitest-cypress/src/components/TheWelcome.vue b/router-pinia-vitest-cypress/src/components/TheWelcome.vue
new file mode 100644
index 00000000..cccc38ef
--- /dev/null
+++ b/router-pinia-vitest-cypress/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/router-pinia-vitest-cypress/src/components/WelcomeItem.vue b/router-pinia-vitest-cypress/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/router-pinia-vitest-cypress/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/router-pinia-vitest-cypress/src/components/__tests__/HelloWorld.spec.js b/router-pinia-vitest-cypress/src/components/__tests__/HelloWorld.spec.js
new file mode 100644
index 00000000..293bf197
--- /dev/null
+++ b/router-pinia-vitest-cypress/src/components/__tests__/HelloWorld.spec.js
@@ -0,0 +1,11 @@
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('renders properly', () => {
+ const wrapper = mount(HelloWorld, { propsData: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
+ })
+})
diff --git a/router-pinia-vitest-cypress/src/components/icons/IconCommunity.vue b/router-pinia-vitest-cypress/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/router-pinia-vitest-cypress/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/router-pinia-vitest-cypress/src/components/icons/IconDocumentation.vue b/router-pinia-vitest-cypress/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/router-pinia-vitest-cypress/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/router-pinia-vitest-cypress/src/components/icons/IconEcosystem.vue b/router-pinia-vitest-cypress/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/router-pinia-vitest-cypress/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/router-pinia-vitest-cypress/src/components/icons/IconSupport.vue b/router-pinia-vitest-cypress/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/router-pinia-vitest-cypress/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/router-pinia-vitest-cypress/src/components/icons/IconTooling.vue b/router-pinia-vitest-cypress/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/router-pinia-vitest-cypress/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/router-pinia-vitest-cypress/src/main.js b/router-pinia-vitest-cypress/src/main.js
new file mode 100644
index 00000000..e11e78e0
--- /dev/null
+++ b/router-pinia-vitest-cypress/src/main.js
@@ -0,0 +1,15 @@
+import Vue from 'vue'
+import { createPinia, PiniaVuePlugin } from 'pinia'
+
+import App from './App.vue'
+import router from './router'
+
+import './assets/main.css'
+
+Vue.use(PiniaVuePlugin)
+
+new Vue({
+ router,
+ pinia: createPinia(),
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/router-pinia-vitest-cypress/src/router/index.js b/router-pinia-vitest-cypress/src/router/index.js
new file mode 100644
index 00000000..cf9820b0
--- /dev/null
+++ b/router-pinia-vitest-cypress/src/router/index.js
@@ -0,0 +1,27 @@
+import Vue from 'vue'
+import VueRouter from 'vue-router'
+import HomeView from '../views/HomeView.vue'
+
+Vue.use(VueRouter)
+
+const router = new VueRouter({
+ mode: 'history',
+ base: import.meta.env.BASE_URL,
+ routes: [
+ {
+ path: '/',
+ name: 'home',
+ component: HomeView
+ },
+ {
+ path: '/about',
+ name: 'about',
+ // route level code-splitting
+ // this generates a separate chunk (About.[hash].js) for this route
+ // which is lazy-loaded when the route is visited.
+ component: () => import('../views/AboutView.vue')
+ }
+ ]
+})
+
+export default router
diff --git a/router-pinia-vitest-cypress/src/stores/counter.js b/router-pinia-vitest-cypress/src/stores/counter.js
new file mode 100644
index 00000000..4a2d2427
--- /dev/null
+++ b/router-pinia-vitest-cypress/src/stores/counter.js
@@ -0,0 +1,16 @@
+import { defineStore } from 'pinia'
+
+export const useCounterStore = defineStore({
+ id: 'counter',
+ state: () => ({
+ counter: 0
+ }),
+ getters: {
+ doubleCount: (state) => state.counter * 2
+ },
+ actions: {
+ increment() {
+ this.counter++
+ }
+ }
+})
diff --git a/router-pinia-vitest-cypress/src/views/AboutView.vue b/router-pinia-vitest-cypress/src/views/AboutView.vue
new file mode 100644
index 00000000..756ad2a1
--- /dev/null
+++ b/router-pinia-vitest-cypress/src/views/AboutView.vue
@@ -0,0 +1,15 @@
+
+
+
This is an about page
+
+
+
+
diff --git a/router-pinia-vitest-cypress/src/views/HomeView.vue b/router-pinia-vitest-cypress/src/views/HomeView.vue
new file mode 100644
index 00000000..6555a646
--- /dev/null
+++ b/router-pinia-vitest-cypress/src/views/HomeView.vue
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/router-pinia-vitest-cypress/vite.config.js b/router-pinia-vitest-cypress/vite.config.js
new file mode 100644
index 00000000..d4945079
--- /dev/null
+++ b/router-pinia-vitest-cypress/vite.config.js
@@ -0,0 +1,21 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/router-pinia-vitest/.gitignore b/router-pinia-vitest/.gitignore
new file mode 100644
index 00000000..133da84e
--- /dev/null
+++ b/router-pinia-vitest/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/router-pinia-vitest/README.md b/router-pinia-vitest/README.md
new file mode 100644
index 00000000..471aea4b
--- /dev/null
+++ b/router-pinia-vitest/README.md
@@ -0,0 +1,35 @@
+# router-pinia-vitest
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[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).
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Unit Tests with [Vitest](https://vitest.dev/)
+
+```sh
+pnpm test:unit
+```
diff --git a/router-pinia-vitest/index.html b/router-pinia-vitest/index.html
new file mode 100644
index 00000000..030a6ff5
--- /dev/null
+++ b/router-pinia-vitest/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/router-pinia-vitest/package.json b/router-pinia-vitest/package.json
new file mode 100644
index 00000000..8af7f317
--- /dev/null
+++ b/router-pinia-vitest/package.json
@@ -0,0 +1,25 @@
+{
+ "name": "router-pinia-vitest",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom"
+ },
+ "dependencies": {
+ "pinia": "^2.0.16",
+ "vue": "^2.7.7",
+ "vue-router": "^3.5.4"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vue/test-utils": "^1.3.0",
+ "jsdom": "^20.0.0",
+ "terser": "^5.14.2",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7"
+ }
+}
diff --git a/router-pinia-vitest/public/favicon.ico b/router-pinia-vitest/public/favicon.ico
new file mode 100644
index 00000000..df36fcfb
Binary files /dev/null and b/router-pinia-vitest/public/favicon.ico differ
diff --git a/router-pinia-vitest/src/App.vue b/router-pinia-vitest/src/App.vue
new file mode 100644
index 00000000..1f84c747
--- /dev/null
+++ b/router-pinia-vitest/src/App.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+ Home
+ About
+
+
+
+
+
+
+
+
+
diff --git a/router-pinia-vitest/src/assets/base.css b/router-pinia-vitest/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/router-pinia-vitest/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/router-pinia-vitest/src/assets/logo.svg b/router-pinia-vitest/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/router-pinia-vitest/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/router-pinia-vitest/src/assets/main.css b/router-pinia-vitest/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/router-pinia-vitest/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/router-pinia-vitest/src/components/HelloWorld.vue b/router-pinia-vitest/src/components/HelloWorld.vue
new file mode 100644
index 00000000..de8b576a
--- /dev/null
+++ b/router-pinia-vitest/src/components/HelloWorld.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 .
+
+
+
+
+
diff --git a/router-pinia-vitest/src/components/TheWelcome.vue b/router-pinia-vitest/src/components/TheWelcome.vue
new file mode 100644
index 00000000..cccc38ef
--- /dev/null
+++ b/router-pinia-vitest/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/router-pinia-vitest/src/components/WelcomeItem.vue b/router-pinia-vitest/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/router-pinia-vitest/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/router-pinia-vitest/src/components/__tests__/HelloWorld.spec.js b/router-pinia-vitest/src/components/__tests__/HelloWorld.spec.js
new file mode 100644
index 00000000..293bf197
--- /dev/null
+++ b/router-pinia-vitest/src/components/__tests__/HelloWorld.spec.js
@@ -0,0 +1,11 @@
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('renders properly', () => {
+ const wrapper = mount(HelloWorld, { propsData: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
+ })
+})
diff --git a/router-pinia-vitest/src/components/icons/IconCommunity.vue b/router-pinia-vitest/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/router-pinia-vitest/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/router-pinia-vitest/src/components/icons/IconDocumentation.vue b/router-pinia-vitest/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/router-pinia-vitest/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/router-pinia-vitest/src/components/icons/IconEcosystem.vue b/router-pinia-vitest/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/router-pinia-vitest/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/router-pinia-vitest/src/components/icons/IconSupport.vue b/router-pinia-vitest/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/router-pinia-vitest/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/router-pinia-vitest/src/components/icons/IconTooling.vue b/router-pinia-vitest/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/router-pinia-vitest/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/router-pinia-vitest/src/main.js b/router-pinia-vitest/src/main.js
new file mode 100644
index 00000000..e11e78e0
--- /dev/null
+++ b/router-pinia-vitest/src/main.js
@@ -0,0 +1,15 @@
+import Vue from 'vue'
+import { createPinia, PiniaVuePlugin } from 'pinia'
+
+import App from './App.vue'
+import router from './router'
+
+import './assets/main.css'
+
+Vue.use(PiniaVuePlugin)
+
+new Vue({
+ router,
+ pinia: createPinia(),
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/router-pinia-vitest/src/router/index.js b/router-pinia-vitest/src/router/index.js
new file mode 100644
index 00000000..cf9820b0
--- /dev/null
+++ b/router-pinia-vitest/src/router/index.js
@@ -0,0 +1,27 @@
+import Vue from 'vue'
+import VueRouter from 'vue-router'
+import HomeView from '../views/HomeView.vue'
+
+Vue.use(VueRouter)
+
+const router = new VueRouter({
+ mode: 'history',
+ base: import.meta.env.BASE_URL,
+ routes: [
+ {
+ path: '/',
+ name: 'home',
+ component: HomeView
+ },
+ {
+ path: '/about',
+ name: 'about',
+ // route level code-splitting
+ // this generates a separate chunk (About.[hash].js) for this route
+ // which is lazy-loaded when the route is visited.
+ component: () => import('../views/AboutView.vue')
+ }
+ ]
+})
+
+export default router
diff --git a/router-pinia-vitest/src/stores/counter.js b/router-pinia-vitest/src/stores/counter.js
new file mode 100644
index 00000000..4a2d2427
--- /dev/null
+++ b/router-pinia-vitest/src/stores/counter.js
@@ -0,0 +1,16 @@
+import { defineStore } from 'pinia'
+
+export const useCounterStore = defineStore({
+ id: 'counter',
+ state: () => ({
+ counter: 0
+ }),
+ getters: {
+ doubleCount: (state) => state.counter * 2
+ },
+ actions: {
+ increment() {
+ this.counter++
+ }
+ }
+})
diff --git a/router-pinia-vitest/src/views/AboutView.vue b/router-pinia-vitest/src/views/AboutView.vue
new file mode 100644
index 00000000..756ad2a1
--- /dev/null
+++ b/router-pinia-vitest/src/views/AboutView.vue
@@ -0,0 +1,15 @@
+
+
+
This is an about page
+
+
+
+
diff --git a/router-pinia-vitest/src/views/HomeView.vue b/router-pinia-vitest/src/views/HomeView.vue
new file mode 100644
index 00000000..6555a646
--- /dev/null
+++ b/router-pinia-vitest/src/views/HomeView.vue
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/router-pinia-vitest/vite.config.js b/router-pinia-vitest/vite.config.js
new file mode 100644
index 00000000..d4945079
--- /dev/null
+++ b/router-pinia-vitest/vite.config.js
@@ -0,0 +1,21 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/router-pinia-with-tests/README.md b/router-pinia-with-tests/README.md
index 84468dc1..fd1dfcfb 100644
--- a/router-pinia-with-tests/README.md
+++ b/router-pinia-with-tests/README.md
@@ -4,7 +4,7 @@ This template should help get you started developing with Vue 3 in Vite.
## Recommended IDE Setup
-[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=johnsoncodehk.volar) (and disable Vetur).
+[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).
## Customize configuration
@@ -28,10 +28,10 @@ pnpm dev
pnpm build
```
-### Run Unit Tests with [Cypress Component Testing](https://docs.cypress.io/guides/component-testing/introduction)
+### Run Unit Tests with [Vitest](https://vitest.dev/)
```sh
-pnpm test:unit # or `pnpm test:unit:ci` for headless testing
+pnpm test:unit
```
### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
diff --git a/router-pinia-with-tests/cypress.config.js b/router-pinia-with-tests/cypress.config.js
new file mode 100644
index 00000000..9cf6a199
--- /dev/null
+++ b/router-pinia-with-tests/cypress.config.js
@@ -0,0 +1,8 @@
+const { defineConfig } = require('cypress')
+
+module.exports = defineConfig({
+ e2e: {
+ specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
+ baseUrl: 'http://localhost:4173/'
+ }
+})
diff --git a/router-pinia-with-tests/cypress.json b/router-pinia-with-tests/cypress.json
deleted file mode 100644
index 3d372252..00000000
--- a/router-pinia-with-tests/cypress.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "baseUrl": "http://localhost:5050/",
- "component": {
- "componentFolder": "src",
- "testFiles": "**/__tests__/*.spec.{js,ts,jsx,tsx}"
- }
-}
diff --git a/router-pinia-with-tests/cypress/e2e/example.cy.js b/router-pinia-with-tests/cypress/e2e/example.cy.js
new file mode 100644
index 00000000..7a8c909f
--- /dev/null
+++ b/router-pinia-with-tests/cypress/e2e/example.cy.js
@@ -0,0 +1,8 @@
+// https://docs.cypress.io/api/introduction/api.html
+
+describe('My First Test', () => {
+ it('visits the app root url', () => {
+ cy.visit('/')
+ cy.contains('h1', 'You did it!')
+ })
+})
diff --git a/router-pinia-with-tests/cypress/e2e/jsconfig.json b/router-pinia-with-tests/cypress/e2e/jsconfig.json
new file mode 100644
index 00000000..c790a70d
--- /dev/null
+++ b/router-pinia-with-tests/cypress/e2e/jsconfig.json
@@ -0,0 +1,8 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "lib": ["es5", "dom"],
+ "types": ["cypress"]
+ },
+ "include": ["./**/*", "../support/**/*"]
+}
diff --git a/router-pinia-with-tests/cypress/jsconfig.json b/router-pinia-with-tests/cypress/jsconfig.json
deleted file mode 100644
index b5b2f972..00000000
--- a/router-pinia-with-tests/cypress/jsconfig.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "compilerOptions": {
- "target": "es5",
- "lib": ["es5", "dom"],
- "types": ["cypress"]
- },
- "include": ["./**/*"]
-}
diff --git a/router-pinia-with-tests/cypress/plugins/index.js b/router-pinia-with-tests/cypress/plugins/index.js
deleted file mode 100644
index ad2e351d..00000000
--- a/router-pinia-with-tests/cypress/plugins/index.js
+++ /dev/null
@@ -1,28 +0,0 @@
-///
-// ***********************************************************
-// This example plugins/index.js can be used to load plugins
-//
-// You can change the location of this file or turn off loading
-// the plugins file with the 'pluginsFile' configuration option.
-//
-// You can read more here:
-// https://on.cypress.io/plugins-guide
-// ***********************************************************
-
-// This function is called when a project is opened or re-opened (e.g. due to
-// the project's config changing)
-
-const { startDevServer } = require('@cypress/vite-dev-server')
-
-/**
- * @type {Cypress.PluginConfig}
- */
-// eslint-disable-next-line no-unused-vars
-module.exports = (on, config) => {
- // `on` is used to hook into various events Cypress emits
- // `config` is the resolved Cypress config
- on('dev-server:start', (options) => {
- return startDevServer({ options })
- })
- return config
-}
diff --git a/router-pinia-with-tests/cypress/support/e2e.js b/router-pinia-with-tests/cypress/support/e2e.js
new file mode 100644
index 00000000..d68db96d
--- /dev/null
+++ b/router-pinia-with-tests/cypress/support/e2e.js
@@ -0,0 +1,20 @@
+// ***********************************************************
+// This example support/index.js is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
diff --git a/router-pinia-with-tests/package.json b/router-pinia-with-tests/package.json
index d6b4980e..fe56bae3 100644
--- a/router-pinia-with-tests/package.json
+++ b/router-pinia-with-tests/package.json
@@ -4,23 +4,26 @@
"scripts": {
"dev": "vite",
"build": "vite build",
- "preview": "vite preview --port 5050",
- "test:unit": "cypress open-ct",
- "test:unit:ci": "cypress run-ct --quiet --reporter spec",
- "test:e2e": "start-server-and-test preview http://127.0.0.1:5050/ 'cypress open'",
- "test:e2e:ci": "start-server-and-test preview http://127.0.0.1:5050/ 'cypress run'"
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom",
+ "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
+ "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'"
},
"dependencies": {
- "pinia": "^2.0.4",
- "vue": "^3.2.22",
- "vue-router": "^4.0.12"
+ "pinia": "^2.0.16",
+ "vue": "^2.7.7",
+ "vue-router": "^3.5.4"
},
"devDependencies": {
- "@cypress/vite-dev-server": "^2.2.1",
- "@cypress/vue": "^3.0.5",
- "@vitejs/plugin-vue": "^1.10.0",
- "cypress": "^8.7.0",
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vue/test-utils": "^1.3.0",
+ "cypress": "^10.3.0",
+ "jsdom": "^20.0.0",
"start-server-and-test": "^1.14.0",
- "vite": "^2.6.14"
+ "terser": "^5.14.2",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7"
}
}
diff --git a/router-pinia-with-tests/src/App.vue b/router-pinia-with-tests/src/App.vue
index 37edbaf4..1f84c747 100644
--- a/router-pinia-with-tests/src/App.vue
+++ b/router-pinia-with-tests/src/App.vue
@@ -1,35 +1,27 @@
-
-
-
-
-
-
-
- Home
- About
-
-
-
-
-
+
+
+
+
+
+
+
+
+ Home
+ About
+
+
+
+
+
+
-
diff --git a/router-vitest-cypress/src/assets/base.css b/router-vitest-cypress/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/router-vitest-cypress/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/router-vitest-cypress/src/assets/logo.svg b/router-vitest-cypress/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/router-vitest-cypress/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/router-vitest-cypress/src/assets/main.css b/router-vitest-cypress/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/router-vitest-cypress/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/router-vitest-cypress/src/components/HelloWorld.vue b/router-vitest-cypress/src/components/HelloWorld.vue
new file mode 100644
index 00000000..de8b576a
--- /dev/null
+++ b/router-vitest-cypress/src/components/HelloWorld.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 .
+
+
+
+
+
diff --git a/router-vitest-cypress/src/components/TheWelcome.vue b/router-vitest-cypress/src/components/TheWelcome.vue
new file mode 100644
index 00000000..cccc38ef
--- /dev/null
+++ b/router-vitest-cypress/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/router-vitest-cypress/src/components/WelcomeItem.vue b/router-vitest-cypress/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/router-vitest-cypress/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/router-vitest-cypress/src/components/__tests__/HelloWorld.spec.js b/router-vitest-cypress/src/components/__tests__/HelloWorld.spec.js
new file mode 100644
index 00000000..293bf197
--- /dev/null
+++ b/router-vitest-cypress/src/components/__tests__/HelloWorld.spec.js
@@ -0,0 +1,11 @@
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('renders properly', () => {
+ const wrapper = mount(HelloWorld, { propsData: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
+ })
+})
diff --git a/router-vitest-cypress/src/components/icons/IconCommunity.vue b/router-vitest-cypress/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/router-vitest-cypress/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/router-vitest-cypress/src/components/icons/IconDocumentation.vue b/router-vitest-cypress/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/router-vitest-cypress/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/router-vitest-cypress/src/components/icons/IconEcosystem.vue b/router-vitest-cypress/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/router-vitest-cypress/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/router-vitest-cypress/src/components/icons/IconSupport.vue b/router-vitest-cypress/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/router-vitest-cypress/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/router-vitest-cypress/src/components/icons/IconTooling.vue b/router-vitest-cypress/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/router-vitest-cypress/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/router-vitest-cypress/src/main.js b/router-vitest-cypress/src/main.js
new file mode 100644
index 00000000..4919cf77
--- /dev/null
+++ b/router-vitest-cypress/src/main.js
@@ -0,0 +1,11 @@
+import Vue from 'vue'
+
+import App from './App.vue'
+import router from './router'
+
+import './assets/main.css'
+
+new Vue({
+ router,
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/router-vitest-cypress/src/router/index.js b/router-vitest-cypress/src/router/index.js
new file mode 100644
index 00000000..cf9820b0
--- /dev/null
+++ b/router-vitest-cypress/src/router/index.js
@@ -0,0 +1,27 @@
+import Vue from 'vue'
+import VueRouter from 'vue-router'
+import HomeView from '../views/HomeView.vue'
+
+Vue.use(VueRouter)
+
+const router = new VueRouter({
+ mode: 'history',
+ base: import.meta.env.BASE_URL,
+ routes: [
+ {
+ path: '/',
+ name: 'home',
+ component: HomeView
+ },
+ {
+ path: '/about',
+ name: 'about',
+ // route level code-splitting
+ // this generates a separate chunk (About.[hash].js) for this route
+ // which is lazy-loaded when the route is visited.
+ component: () => import('../views/AboutView.vue')
+ }
+ ]
+})
+
+export default router
diff --git a/router-vitest-cypress/src/views/AboutView.vue b/router-vitest-cypress/src/views/AboutView.vue
new file mode 100644
index 00000000..756ad2a1
--- /dev/null
+++ b/router-vitest-cypress/src/views/AboutView.vue
@@ -0,0 +1,15 @@
+
+
+
This is an about page
+
+
+
+
diff --git a/router-vitest-cypress/src/views/HomeView.vue b/router-vitest-cypress/src/views/HomeView.vue
new file mode 100644
index 00000000..6555a646
--- /dev/null
+++ b/router-vitest-cypress/src/views/HomeView.vue
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/router-vitest-cypress/vite.config.js b/router-vitest-cypress/vite.config.js
new file mode 100644
index 00000000..d4945079
--- /dev/null
+++ b/router-vitest-cypress/vite.config.js
@@ -0,0 +1,21 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/router-vitest/.gitignore b/router-vitest/.gitignore
new file mode 100644
index 00000000..133da84e
--- /dev/null
+++ b/router-vitest/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/router-vitest/README.md b/router-vitest/README.md
new file mode 100644
index 00000000..25e8bcb7
--- /dev/null
+++ b/router-vitest/README.md
@@ -0,0 +1,35 @@
+# router-vitest
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[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).
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Unit Tests with [Vitest](https://vitest.dev/)
+
+```sh
+pnpm test:unit
+```
diff --git a/router-vitest/index.html b/router-vitest/index.html
new file mode 100644
index 00000000..030a6ff5
--- /dev/null
+++ b/router-vitest/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/router-vitest/package.json b/router-vitest/package.json
new file mode 100644
index 00000000..f505bec3
--- /dev/null
+++ b/router-vitest/package.json
@@ -0,0 +1,24 @@
+{
+ "name": "router-vitest",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom"
+ },
+ "dependencies": {
+ "vue": "^2.7.7",
+ "vue-router": "^3.5.4"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vue/test-utils": "^1.3.0",
+ "jsdom": "^20.0.0",
+ "terser": "^5.14.2",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7"
+ }
+}
diff --git a/router-vitest/public/favicon.ico b/router-vitest/public/favicon.ico
new file mode 100644
index 00000000..df36fcfb
Binary files /dev/null and b/router-vitest/public/favicon.ico differ
diff --git a/router-vitest/src/App.vue b/router-vitest/src/App.vue
new file mode 100644
index 00000000..1f84c747
--- /dev/null
+++ b/router-vitest/src/App.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+ Home
+ About
+
+
+
+
+
+
+
+
+
diff --git a/router-vitest/src/assets/base.css b/router-vitest/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/router-vitest/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/router-vitest/src/assets/logo.svg b/router-vitest/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/router-vitest/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/router-vitest/src/assets/main.css b/router-vitest/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/router-vitest/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/router-vitest/src/components/HelloWorld.vue b/router-vitest/src/components/HelloWorld.vue
new file mode 100644
index 00000000..de8b576a
--- /dev/null
+++ b/router-vitest/src/components/HelloWorld.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 .
+
+
+
+
+
diff --git a/router-vitest/src/components/TheWelcome.vue b/router-vitest/src/components/TheWelcome.vue
new file mode 100644
index 00000000..cccc38ef
--- /dev/null
+++ b/router-vitest/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/router-vitest/src/components/WelcomeItem.vue b/router-vitest/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/router-vitest/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/router-vitest/src/components/__tests__/HelloWorld.spec.js b/router-vitest/src/components/__tests__/HelloWorld.spec.js
new file mode 100644
index 00000000..293bf197
--- /dev/null
+++ b/router-vitest/src/components/__tests__/HelloWorld.spec.js
@@ -0,0 +1,11 @@
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('renders properly', () => {
+ const wrapper = mount(HelloWorld, { propsData: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
+ })
+})
diff --git a/router-vitest/src/components/icons/IconCommunity.vue b/router-vitest/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/router-vitest/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/router-vitest/src/components/icons/IconDocumentation.vue b/router-vitest/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/router-vitest/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/router-vitest/src/components/icons/IconEcosystem.vue b/router-vitest/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/router-vitest/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/router-vitest/src/components/icons/IconSupport.vue b/router-vitest/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/router-vitest/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/router-vitest/src/components/icons/IconTooling.vue b/router-vitest/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/router-vitest/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/router-vitest/src/main.js b/router-vitest/src/main.js
new file mode 100644
index 00000000..4919cf77
--- /dev/null
+++ b/router-vitest/src/main.js
@@ -0,0 +1,11 @@
+import Vue from 'vue'
+
+import App from './App.vue'
+import router from './router'
+
+import './assets/main.css'
+
+new Vue({
+ router,
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/router-vitest/src/router/index.js b/router-vitest/src/router/index.js
new file mode 100644
index 00000000..cf9820b0
--- /dev/null
+++ b/router-vitest/src/router/index.js
@@ -0,0 +1,27 @@
+import Vue from 'vue'
+import VueRouter from 'vue-router'
+import HomeView from '../views/HomeView.vue'
+
+Vue.use(VueRouter)
+
+const router = new VueRouter({
+ mode: 'history',
+ base: import.meta.env.BASE_URL,
+ routes: [
+ {
+ path: '/',
+ name: 'home',
+ component: HomeView
+ },
+ {
+ path: '/about',
+ name: 'about',
+ // route level code-splitting
+ // this generates a separate chunk (About.[hash].js) for this route
+ // which is lazy-loaded when the route is visited.
+ component: () => import('../views/AboutView.vue')
+ }
+ ]
+})
+
+export default router
diff --git a/router-vitest/src/views/AboutView.vue b/router-vitest/src/views/AboutView.vue
new file mode 100644
index 00000000..756ad2a1
--- /dev/null
+++ b/router-vitest/src/views/AboutView.vue
@@ -0,0 +1,15 @@
+
+
+
This is an about page
+
+
+
+
diff --git a/router-vitest/src/views/HomeView.vue b/router-vitest/src/views/HomeView.vue
new file mode 100644
index 00000000..6555a646
--- /dev/null
+++ b/router-vitest/src/views/HomeView.vue
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/router-vitest/vite.config.js b/router-vitest/vite.config.js
new file mode 100644
index 00000000..d4945079
--- /dev/null
+++ b/router-vitest/vite.config.js
@@ -0,0 +1,21 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/router-with-tests/README.md b/router-with-tests/README.md
index 4a91f41f..df90e7f1 100644
--- a/router-with-tests/README.md
+++ b/router-with-tests/README.md
@@ -4,7 +4,7 @@ This template should help get you started developing with Vue 3 in Vite.
## Recommended IDE Setup
-[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=johnsoncodehk.volar) (and disable Vetur).
+[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).
## Customize configuration
@@ -28,10 +28,10 @@ pnpm dev
pnpm build
```
-### Run Unit Tests with [Cypress Component Testing](https://docs.cypress.io/guides/component-testing/introduction)
+### Run Unit Tests with [Vitest](https://vitest.dev/)
```sh
-pnpm test:unit # or `pnpm test:unit:ci` for headless testing
+pnpm test:unit
```
### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
diff --git a/router-with-tests/cypress.config.js b/router-with-tests/cypress.config.js
new file mode 100644
index 00000000..9cf6a199
--- /dev/null
+++ b/router-with-tests/cypress.config.js
@@ -0,0 +1,8 @@
+const { defineConfig } = require('cypress')
+
+module.exports = defineConfig({
+ e2e: {
+ specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
+ baseUrl: 'http://localhost:4173/'
+ }
+})
diff --git a/router-with-tests/cypress.json b/router-with-tests/cypress.json
deleted file mode 100644
index 3d372252..00000000
--- a/router-with-tests/cypress.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "baseUrl": "http://localhost:5050/",
- "component": {
- "componentFolder": "src",
- "testFiles": "**/__tests__/*.spec.{js,ts,jsx,tsx}"
- }
-}
diff --git a/router-with-tests/cypress/e2e/example.cy.js b/router-with-tests/cypress/e2e/example.cy.js
new file mode 100644
index 00000000..7a8c909f
--- /dev/null
+++ b/router-with-tests/cypress/e2e/example.cy.js
@@ -0,0 +1,8 @@
+// https://docs.cypress.io/api/introduction/api.html
+
+describe('My First Test', () => {
+ it('visits the app root url', () => {
+ cy.visit('/')
+ cy.contains('h1', 'You did it!')
+ })
+})
diff --git a/router-with-tests/cypress/e2e/jsconfig.json b/router-with-tests/cypress/e2e/jsconfig.json
new file mode 100644
index 00000000..c790a70d
--- /dev/null
+++ b/router-with-tests/cypress/e2e/jsconfig.json
@@ -0,0 +1,8 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "lib": ["es5", "dom"],
+ "types": ["cypress"]
+ },
+ "include": ["./**/*", "../support/**/*"]
+}
diff --git a/router-with-tests/cypress/jsconfig.json b/router-with-tests/cypress/jsconfig.json
deleted file mode 100644
index b5b2f972..00000000
--- a/router-with-tests/cypress/jsconfig.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "compilerOptions": {
- "target": "es5",
- "lib": ["es5", "dom"],
- "types": ["cypress"]
- },
- "include": ["./**/*"]
-}
diff --git a/router-with-tests/cypress/plugins/index.js b/router-with-tests/cypress/plugins/index.js
deleted file mode 100644
index ad2e351d..00000000
--- a/router-with-tests/cypress/plugins/index.js
+++ /dev/null
@@ -1,28 +0,0 @@
-///
-// ***********************************************************
-// This example plugins/index.js can be used to load plugins
-//
-// You can change the location of this file or turn off loading
-// the plugins file with the 'pluginsFile' configuration option.
-//
-// You can read more here:
-// https://on.cypress.io/plugins-guide
-// ***********************************************************
-
-// This function is called when a project is opened or re-opened (e.g. due to
-// the project's config changing)
-
-const { startDevServer } = require('@cypress/vite-dev-server')
-
-/**
- * @type {Cypress.PluginConfig}
- */
-// eslint-disable-next-line no-unused-vars
-module.exports = (on, config) => {
- // `on` is used to hook into various events Cypress emits
- // `config` is the resolved Cypress config
- on('dev-server:start', (options) => {
- return startDevServer({ options })
- })
- return config
-}
diff --git a/router-with-tests/cypress/support/e2e.js b/router-with-tests/cypress/support/e2e.js
new file mode 100644
index 00000000..d68db96d
--- /dev/null
+++ b/router-with-tests/cypress/support/e2e.js
@@ -0,0 +1,20 @@
+// ***********************************************************
+// This example support/index.js is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
diff --git a/router-with-tests/package.json b/router-with-tests/package.json
index a09b5385..92d3df30 100644
--- a/router-with-tests/package.json
+++ b/router-with-tests/package.json
@@ -4,22 +4,25 @@
"scripts": {
"dev": "vite",
"build": "vite build",
- "preview": "vite preview --port 5050",
- "test:unit": "cypress open-ct",
- "test:unit:ci": "cypress run-ct --quiet --reporter spec",
- "test:e2e": "start-server-and-test preview http://127.0.0.1:5050/ 'cypress open'",
- "test:e2e:ci": "start-server-and-test preview http://127.0.0.1:5050/ 'cypress run'"
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom",
+ "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
+ "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'"
},
"dependencies": {
- "vue": "^3.2.22",
- "vue-router": "^4.0.12"
+ "vue": "^2.7.7",
+ "vue-router": "^3.5.4"
},
"devDependencies": {
- "@cypress/vite-dev-server": "^2.2.1",
- "@cypress/vue": "^3.0.5",
- "@vitejs/plugin-vue": "^1.10.0",
- "cypress": "^8.7.0",
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vue/test-utils": "^1.3.0",
+ "cypress": "^10.3.0",
+ "jsdom": "^20.0.0",
"start-server-and-test": "^1.14.0",
- "vite": "^2.6.14"
+ "terser": "^5.14.2",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7"
}
}
diff --git a/router-with-tests/src/App.vue b/router-with-tests/src/App.vue
index 37edbaf4..1f84c747 100644
--- a/router-with-tests/src/App.vue
+++ b/router-with-tests/src/App.vue
@@ -1,35 +1,27 @@
-
-
-
-
-
-
-
- Home
- About
-
-
-
-
-
+
+
+
+
+
+
+
+
+ Home
+ About
+
+
+
+
+
+
-
diff --git a/typescript-cypress/src/assets/base.css b/typescript-cypress/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/typescript-cypress/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/typescript-cypress/src/assets/logo.svg b/typescript-cypress/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/typescript-cypress/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/typescript-cypress/src/assets/main.css b/typescript-cypress/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/typescript-cypress/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/typescript-cypress/src/components/HelloWorld.vue b/typescript-cypress/src/components/HelloWorld.vue
new file mode 100644
index 00000000..624fb3e0
--- /dev/null
+++ b/typescript-cypress/src/components/HelloWorld.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 .
+
+
+
+
+
diff --git a/typescript-cypress/src/components/TheWelcome.vue b/typescript-cypress/src/components/TheWelcome.vue
new file mode 100644
index 00000000..51d12392
--- /dev/null
+++ b/typescript-cypress/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/typescript-cypress/src/components/WelcomeItem.vue b/typescript-cypress/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/typescript-cypress/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/typescript-cypress/src/components/__tests__/HelloWorld.cy.ts b/typescript-cypress/src/components/__tests__/HelloWorld.cy.ts
new file mode 100644
index 00000000..0e0c065a
--- /dev/null
+++ b/typescript-cypress/src/components/__tests__/HelloWorld.cy.ts
@@ -0,0 +1,12 @@
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('playground', () => {
+ cy.mount(HelloWorld, { propsData: { msg: 'Hello Cypress' } })
+ })
+
+ it('renders properly', () => {
+ cy.mount(HelloWorld, { propsData: { msg: 'Hello Cypress' } })
+ cy.get('h1').should('contain', 'Hello Cypress')
+ })
+})
diff --git a/typescript-cypress/src/components/icons/IconCommunity.vue b/typescript-cypress/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/typescript-cypress/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-cypress/src/components/icons/IconDocumentation.vue b/typescript-cypress/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/typescript-cypress/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-cypress/src/components/icons/IconEcosystem.vue b/typescript-cypress/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/typescript-cypress/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-cypress/src/components/icons/IconSupport.vue b/typescript-cypress/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/typescript-cypress/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-cypress/src/components/icons/IconTooling.vue b/typescript-cypress/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/typescript-cypress/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/typescript-cypress/src/main.ts b/typescript-cypress/src/main.ts
new file mode 100644
index 00000000..c5da47dc
--- /dev/null
+++ b/typescript-cypress/src/main.ts
@@ -0,0 +1,8 @@
+import Vue from 'vue'
+import App from './App.vue'
+
+import './assets/main.css'
+
+new Vue({
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/typescript-cypress/tsconfig.app.json b/typescript-cypress/tsconfig.app.json
new file mode 100644
index 00000000..cdbea1d7
--- /dev/null
+++ b/typescript-cypress/tsconfig.app.json
@@ -0,0 +1,12 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
+ "exclude": ["src/**/__tests__/*"],
+ "compilerOptions": {
+ "composite": true,
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ }
+}
diff --git a/typescript-cypress/tsconfig.config.json b/typescript-cypress/tsconfig.config.json
new file mode 100644
index 00000000..c2d3a309
--- /dev/null
+++ b/typescript-cypress/tsconfig.config.json
@@ -0,0 +1,8 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.node.json",
+ "include": ["vite.config.*", "vitest.config.*", "cypress.config.*"],
+ "compilerOptions": {
+ "composite": true,
+ "types": ["node"]
+ }
+}
diff --git a/typescript-cypress/tsconfig.cypress-ct.json b/typescript-cypress/tsconfig.cypress-ct.json
new file mode 100644
index 00000000..29cbaa47
--- /dev/null
+++ b/typescript-cypress/tsconfig.cypress-ct.json
@@ -0,0 +1,8 @@
+{
+ "extends": "./tsconfig.app.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue", "cypress/support/component.*"],
+ "exclude": [],
+ "compilerOptions": {
+ "composite": true
+ }
+}
diff --git a/typescript-cypress/tsconfig.json b/typescript-cypress/tsconfig.json
new file mode 100644
index 00000000..040665bb
--- /dev/null
+++ b/typescript-cypress/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "files": [],
+ "references": [
+ {
+ "path": "./tsconfig.config.json"
+ },
+ {
+ "path": "./tsconfig.app.json"
+ },
+ {
+ "path": "./tsconfig.cypress-ct.json"
+ }
+ ]
+}
diff --git a/typescript-cypress/vite.config.ts b/typescript-cypress/vite.config.ts
new file mode 100644
index 00000000..d4945079
--- /dev/null
+++ b/typescript-cypress/vite.config.ts
@@ -0,0 +1,21 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/typescript-jsx-cypress/.gitignore b/typescript-jsx-cypress/.gitignore
new file mode 100644
index 00000000..133da84e
--- /dev/null
+++ b/typescript-jsx-cypress/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/typescript-jsx-cypress/README.md b/typescript-jsx-cypress/README.md
new file mode 100644
index 00000000..00562935
--- /dev/null
+++ b/typescript-jsx-cypress/README.md
@@ -0,0 +1,53 @@
+# typescript-jsx-cypress
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[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).
+
+## Type Support for `.vue` Imports in TS
+
+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.
+
+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:
+
+1. Disable the built-in TypeScript Extension
+ 1) Run `Extensions: Show Built-in Extensions` from VSCode's command palette
+ 2) Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)`
+2. Reload the VSCode window by running `Developer: Reload Window` from the command palette.
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Type-Check, Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Headed Component Tests with [Cypress Component Testing](https://on.cypress.io/component)
+
+```sh
+pnpm test:unit # or `pnpm test:unit:ci` for headless testing
+```
+
+### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
+
+```sh
+pnpm build
+pnpm test:e2e # or `pnpm test:e2e:ci` for headless testing
+```
diff --git a/typescript-jsx-cypress/cypress.config.ts b/typescript-jsx-cypress/cypress.config.ts
new file mode 100644
index 00000000..c8fac129
--- /dev/null
+++ b/typescript-jsx-cypress/cypress.config.ts
@@ -0,0 +1,15 @@
+import { defineConfig } from 'cypress'
+
+export default defineConfig({
+ e2e: {
+ specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
+ baseUrl: 'http://localhost:4173/'
+ },
+ component: {
+ specPattern: 'src/**/__tests__/*.{cy,spec}.{js,ts,jsx,tsx}',
+ devServer: {
+ framework: 'vue',
+ bundler: 'vite'
+ }
+ }
+})
diff --git a/typescript-jsx-cypress/cypress/e2e/example.cy.ts b/typescript-jsx-cypress/cypress/e2e/example.cy.ts
new file mode 100644
index 00000000..7a8c909f
--- /dev/null
+++ b/typescript-jsx-cypress/cypress/e2e/example.cy.ts
@@ -0,0 +1,8 @@
+// https://docs.cypress.io/api/introduction/api.html
+
+describe('My First Test', () => {
+ it('visits the app root url', () => {
+ cy.visit('/')
+ cy.contains('h1', 'You did it!')
+ })
+})
diff --git a/typescript-jsx-cypress/cypress/e2e/tsconfig.json b/typescript-jsx-cypress/cypress/e2e/tsconfig.json
new file mode 100644
index 00000000..be213aef
--- /dev/null
+++ b/typescript-jsx-cypress/cypress/e2e/tsconfig.json
@@ -0,0 +1,10 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["./**/*", "../support/**/*"],
+ "compilerOptions": {
+ "isolatedModules": false,
+ "target": "es5",
+ "lib": ["es5", "dom"],
+ "types": ["cypress"]
+ }
+}
diff --git a/typescript-jsx-cypress/cypress/fixtures/example.json b/typescript-jsx-cypress/cypress/fixtures/example.json
new file mode 100644
index 00000000..02e42543
--- /dev/null
+++ b/typescript-jsx-cypress/cypress/fixtures/example.json
@@ -0,0 +1,5 @@
+{
+ "name": "Using fixtures to represent data",
+ "email": "hello@cypress.io",
+ "body": "Fixtures are a great way to mock data for responses to routes"
+}
diff --git a/typescript-jsx-cypress/cypress/support/commands.ts b/typescript-jsx-cypress/cypress/support/commands.ts
new file mode 100644
index 00000000..95857aea
--- /dev/null
+++ b/typescript-jsx-cypress/cypress/support/commands.ts
@@ -0,0 +1,37 @@
+///
+// ***********************************************
+// This example commands.ts shows you how to
+// create various custom commands and overwrite
+// existing commands.
+//
+// For more comprehensive examples of custom
+// commands please read more here:
+// https://on.cypress.io/custom-commands
+// ***********************************************
+//
+//
+// -- This is a parent command --
+// Cypress.Commands.add('login', (email, password) => { ... })
+//
+//
+// -- This is a child command --
+// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
+//
+//
+// -- This is a dual command --
+// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
+//
+//
+// -- This will overwrite an existing command --
+// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
+//
+// declare global {
+// namespace Cypress {
+// interface Chainable {
+// login(email: string, password: string): Chainable
+// drag(subject: string, options?: Partial): Chainable
+// dismiss(subject: string, options?: Partial): Chainable
+// visit(originalFn: CommandOriginalFn, url: string, options: Partial): Chainable
+// }
+// }
+// }
diff --git a/typescript-jsx-cypress/cypress/support/component-index.html b/typescript-jsx-cypress/cypress/support/component-index.html
new file mode 100644
index 00000000..5f9622ae
--- /dev/null
+++ b/typescript-jsx-cypress/cypress/support/component-index.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+ Components App
+
+
+
+
+
diff --git a/typescript-jsx-cypress/cypress/support/component.ts b/typescript-jsx-cypress/cypress/support/component.ts
new file mode 100644
index 00000000..f3d667e0
--- /dev/null
+++ b/typescript-jsx-cypress/cypress/support/component.ts
@@ -0,0 +1,42 @@
+// ***********************************************************
+// This example support/component.ts is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
+
+// Import global styles
+import '@/assets/main.css'
+
+import { mount } from 'cypress/vue2'
+
+// Augment the Cypress namespace to include type definitions for
+// your custom command.
+// Alternatively, can be defined in cypress/support/component.d.ts
+// with a at the top of your spec.
+declare global {
+ namespace Cypress {
+ interface Chainable {
+ mount: typeof mount
+ }
+ }
+}
+
+Cypress.Commands.add('mount', mount)
+
+// Example use:
+// cy.mount(MyComponent)
diff --git a/typescript-jsx-cypress/cypress/support/e2e.ts b/typescript-jsx-cypress/cypress/support/e2e.ts
new file mode 100644
index 00000000..d68db96d
--- /dev/null
+++ b/typescript-jsx-cypress/cypress/support/e2e.ts
@@ -0,0 +1,20 @@
+// ***********************************************************
+// This example support/index.js is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
diff --git a/typescript-jsx-cypress/env.d.ts b/typescript-jsx-cypress/env.d.ts
new file mode 100644
index 00000000..11f02fe2
--- /dev/null
+++ b/typescript-jsx-cypress/env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/typescript-jsx-cypress/index.html b/typescript-jsx-cypress/index.html
new file mode 100644
index 00000000..11603f87
--- /dev/null
+++ b/typescript-jsx-cypress/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/typescript-jsx-cypress/package.json b/typescript-jsx-cypress/package.json
new file mode 100644
index 00000000..cd47e31c
--- /dev/null
+++ b/typescript-jsx-cypress/package.json
@@ -0,0 +1,32 @@
+{
+ "name": "typescript-jsx-cypress",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "run-p type-check build-only",
+ "preview": "vite preview --port 4173",
+ "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
+ "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'",
+ "test:unit": "cypress open --component",
+ "test:unit:ci": "cypress run --component --quiet --reporter spec",
+ "build-only": "vite build",
+ "type-check": "vue-tsc --noEmit"
+ },
+ "dependencies": {
+ "vue": "^2.7.7"
+ },
+ "devDependencies": {
+ "@types/node": "^16.11.45",
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vitejs/plugin-vue2-jsx": "^1.0.2",
+ "@vue/tsconfig": "^0.1.3",
+ "cypress": "^10.3.0",
+ "npm-run-all": "^4.1.5",
+ "start-server-and-test": "^1.14.0",
+ "terser": "^5.14.2",
+ "typescript": "~4.7.4",
+ "vite": "^3.0.2",
+ "vue-tsc": "^0.38.8"
+ }
+}
diff --git a/typescript-jsx-cypress/public/favicon.ico b/typescript-jsx-cypress/public/favicon.ico
new file mode 100644
index 00000000..df36fcfb
Binary files /dev/null and b/typescript-jsx-cypress/public/favicon.ico differ
diff --git a/typescript-jsx-cypress/src/App.vue b/typescript-jsx-cypress/src/App.vue
new file mode 100644
index 00000000..70c911b5
--- /dev/null
+++ b/typescript-jsx-cypress/src/App.vue
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/typescript-jsx-cypress/src/assets/base.css b/typescript-jsx-cypress/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/typescript-jsx-cypress/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/typescript-jsx-cypress/src/assets/logo.svg b/typescript-jsx-cypress/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/typescript-jsx-cypress/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/typescript-jsx-cypress/src/assets/main.css b/typescript-jsx-cypress/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/typescript-jsx-cypress/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/typescript-jsx-cypress/src/components/HelloWorld.vue b/typescript-jsx-cypress/src/components/HelloWorld.vue
new file mode 100644
index 00000000..624fb3e0
--- /dev/null
+++ b/typescript-jsx-cypress/src/components/HelloWorld.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 .
+
+
+
+
+
diff --git a/typescript-jsx-cypress/src/components/TheWelcome.vue b/typescript-jsx-cypress/src/components/TheWelcome.vue
new file mode 100644
index 00000000..51d12392
--- /dev/null
+++ b/typescript-jsx-cypress/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/typescript-jsx-cypress/src/components/WelcomeItem.vue b/typescript-jsx-cypress/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/typescript-jsx-cypress/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/typescript-jsx-cypress/src/components/__tests__/HelloWorld.cy.ts b/typescript-jsx-cypress/src/components/__tests__/HelloWorld.cy.ts
new file mode 100644
index 00000000..0e0c065a
--- /dev/null
+++ b/typescript-jsx-cypress/src/components/__tests__/HelloWorld.cy.ts
@@ -0,0 +1,12 @@
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('playground', () => {
+ cy.mount(HelloWorld, { propsData: { msg: 'Hello Cypress' } })
+ })
+
+ it('renders properly', () => {
+ cy.mount(HelloWorld, { propsData: { msg: 'Hello Cypress' } })
+ cy.get('h1').should('contain', 'Hello Cypress')
+ })
+})
diff --git a/typescript-jsx-cypress/src/components/icons/IconCommunity.vue b/typescript-jsx-cypress/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/typescript-jsx-cypress/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-cypress/src/components/icons/IconDocumentation.vue b/typescript-jsx-cypress/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/typescript-jsx-cypress/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-cypress/src/components/icons/IconEcosystem.vue b/typescript-jsx-cypress/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/typescript-jsx-cypress/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-cypress/src/components/icons/IconSupport.vue b/typescript-jsx-cypress/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/typescript-jsx-cypress/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-cypress/src/components/icons/IconTooling.vue b/typescript-jsx-cypress/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/typescript-jsx-cypress/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/typescript-jsx-cypress/src/main.ts b/typescript-jsx-cypress/src/main.ts
new file mode 100644
index 00000000..c5da47dc
--- /dev/null
+++ b/typescript-jsx-cypress/src/main.ts
@@ -0,0 +1,8 @@
+import Vue from 'vue'
+import App from './App.vue'
+
+import './assets/main.css'
+
+new Vue({
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/typescript-jsx-cypress/tsconfig.app.json b/typescript-jsx-cypress/tsconfig.app.json
new file mode 100644
index 00000000..cdbea1d7
--- /dev/null
+++ b/typescript-jsx-cypress/tsconfig.app.json
@@ -0,0 +1,12 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
+ "exclude": ["src/**/__tests__/*"],
+ "compilerOptions": {
+ "composite": true,
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ }
+}
diff --git a/typescript-jsx-cypress/tsconfig.config.json b/typescript-jsx-cypress/tsconfig.config.json
new file mode 100644
index 00000000..c2d3a309
--- /dev/null
+++ b/typescript-jsx-cypress/tsconfig.config.json
@@ -0,0 +1,8 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.node.json",
+ "include": ["vite.config.*", "vitest.config.*", "cypress.config.*"],
+ "compilerOptions": {
+ "composite": true,
+ "types": ["node"]
+ }
+}
diff --git a/typescript-jsx-cypress/tsconfig.cypress-ct.json b/typescript-jsx-cypress/tsconfig.cypress-ct.json
new file mode 100644
index 00000000..29cbaa47
--- /dev/null
+++ b/typescript-jsx-cypress/tsconfig.cypress-ct.json
@@ -0,0 +1,8 @@
+{
+ "extends": "./tsconfig.app.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue", "cypress/support/component.*"],
+ "exclude": [],
+ "compilerOptions": {
+ "composite": true
+ }
+}
diff --git a/typescript-jsx-cypress/tsconfig.json b/typescript-jsx-cypress/tsconfig.json
new file mode 100644
index 00000000..040665bb
--- /dev/null
+++ b/typescript-jsx-cypress/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "files": [],
+ "references": [
+ {
+ "path": "./tsconfig.config.json"
+ },
+ {
+ "path": "./tsconfig.app.json"
+ },
+ {
+ "path": "./tsconfig.cypress-ct.json"
+ }
+ ]
+}
diff --git a/typescript-jsx-cypress/vite.config.ts b/typescript-jsx-cypress/vite.config.ts
new file mode 100644
index 00000000..54d7440f
--- /dev/null
+++ b/typescript-jsx-cypress/vite.config.ts
@@ -0,0 +1,23 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+import vue2Jsx from '@vitejs/plugin-vue2-jsx'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ vue2Jsx(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/typescript-jsx-pinia-cypress/.gitignore b/typescript-jsx-pinia-cypress/.gitignore
new file mode 100644
index 00000000..133da84e
--- /dev/null
+++ b/typescript-jsx-pinia-cypress/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/typescript-jsx-pinia-cypress/README.md b/typescript-jsx-pinia-cypress/README.md
new file mode 100644
index 00000000..8c2e630c
--- /dev/null
+++ b/typescript-jsx-pinia-cypress/README.md
@@ -0,0 +1,53 @@
+# typescript-jsx-pinia-cypress
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[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).
+
+## Type Support for `.vue` Imports in TS
+
+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.
+
+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:
+
+1. Disable the built-in TypeScript Extension
+ 1) Run `Extensions: Show Built-in Extensions` from VSCode's command palette
+ 2) Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)`
+2. Reload the VSCode window by running `Developer: Reload Window` from the command palette.
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Type-Check, Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Headed Component Tests with [Cypress Component Testing](https://on.cypress.io/component)
+
+```sh
+pnpm test:unit # or `pnpm test:unit:ci` for headless testing
+```
+
+### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
+
+```sh
+pnpm build
+pnpm test:e2e # or `pnpm test:e2e:ci` for headless testing
+```
diff --git a/typescript-jsx-pinia-cypress/cypress.config.ts b/typescript-jsx-pinia-cypress/cypress.config.ts
new file mode 100644
index 00000000..c8fac129
--- /dev/null
+++ b/typescript-jsx-pinia-cypress/cypress.config.ts
@@ -0,0 +1,15 @@
+import { defineConfig } from 'cypress'
+
+export default defineConfig({
+ e2e: {
+ specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
+ baseUrl: 'http://localhost:4173/'
+ },
+ component: {
+ specPattern: 'src/**/__tests__/*.{cy,spec}.{js,ts,jsx,tsx}',
+ devServer: {
+ framework: 'vue',
+ bundler: 'vite'
+ }
+ }
+})
diff --git a/typescript-jsx-pinia-cypress/cypress/e2e/example.cy.ts b/typescript-jsx-pinia-cypress/cypress/e2e/example.cy.ts
new file mode 100644
index 00000000..7a8c909f
--- /dev/null
+++ b/typescript-jsx-pinia-cypress/cypress/e2e/example.cy.ts
@@ -0,0 +1,8 @@
+// https://docs.cypress.io/api/introduction/api.html
+
+describe('My First Test', () => {
+ it('visits the app root url', () => {
+ cy.visit('/')
+ cy.contains('h1', 'You did it!')
+ })
+})
diff --git a/typescript-jsx-pinia-cypress/cypress/e2e/tsconfig.json b/typescript-jsx-pinia-cypress/cypress/e2e/tsconfig.json
new file mode 100644
index 00000000..be213aef
--- /dev/null
+++ b/typescript-jsx-pinia-cypress/cypress/e2e/tsconfig.json
@@ -0,0 +1,10 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["./**/*", "../support/**/*"],
+ "compilerOptions": {
+ "isolatedModules": false,
+ "target": "es5",
+ "lib": ["es5", "dom"],
+ "types": ["cypress"]
+ }
+}
diff --git a/typescript-jsx-pinia-cypress/cypress/fixtures/example.json b/typescript-jsx-pinia-cypress/cypress/fixtures/example.json
new file mode 100644
index 00000000..02e42543
--- /dev/null
+++ b/typescript-jsx-pinia-cypress/cypress/fixtures/example.json
@@ -0,0 +1,5 @@
+{
+ "name": "Using fixtures to represent data",
+ "email": "hello@cypress.io",
+ "body": "Fixtures are a great way to mock data for responses to routes"
+}
diff --git a/typescript-jsx-pinia-cypress/cypress/support/commands.ts b/typescript-jsx-pinia-cypress/cypress/support/commands.ts
new file mode 100644
index 00000000..95857aea
--- /dev/null
+++ b/typescript-jsx-pinia-cypress/cypress/support/commands.ts
@@ -0,0 +1,37 @@
+///
+// ***********************************************
+// This example commands.ts shows you how to
+// create various custom commands and overwrite
+// existing commands.
+//
+// For more comprehensive examples of custom
+// commands please read more here:
+// https://on.cypress.io/custom-commands
+// ***********************************************
+//
+//
+// -- This is a parent command --
+// Cypress.Commands.add('login', (email, password) => { ... })
+//
+//
+// -- This is a child command --
+// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
+//
+//
+// -- This is a dual command --
+// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
+//
+//
+// -- This will overwrite an existing command --
+// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
+//
+// declare global {
+// namespace Cypress {
+// interface Chainable {
+// login(email: string, password: string): Chainable
+// drag(subject: string, options?: Partial): Chainable
+// dismiss(subject: string, options?: Partial): Chainable
+// visit(originalFn: CommandOriginalFn, url: string, options: Partial): Chainable
+// }
+// }
+// }
diff --git a/typescript-jsx-pinia-cypress/cypress/support/component-index.html b/typescript-jsx-pinia-cypress/cypress/support/component-index.html
new file mode 100644
index 00000000..5f9622ae
--- /dev/null
+++ b/typescript-jsx-pinia-cypress/cypress/support/component-index.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+ Components App
+
+
+
+
+
diff --git a/typescript-jsx-pinia-cypress/cypress/support/component.ts b/typescript-jsx-pinia-cypress/cypress/support/component.ts
new file mode 100644
index 00000000..f3d667e0
--- /dev/null
+++ b/typescript-jsx-pinia-cypress/cypress/support/component.ts
@@ -0,0 +1,42 @@
+// ***********************************************************
+// This example support/component.ts is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
+
+// Import global styles
+import '@/assets/main.css'
+
+import { mount } from 'cypress/vue2'
+
+// Augment the Cypress namespace to include type definitions for
+// your custom command.
+// Alternatively, can be defined in cypress/support/component.d.ts
+// with a at the top of your spec.
+declare global {
+ namespace Cypress {
+ interface Chainable {
+ mount: typeof mount
+ }
+ }
+}
+
+Cypress.Commands.add('mount', mount)
+
+// Example use:
+// cy.mount(MyComponent)
diff --git a/typescript-jsx-pinia-cypress/cypress/support/e2e.ts b/typescript-jsx-pinia-cypress/cypress/support/e2e.ts
new file mode 100644
index 00000000..d68db96d
--- /dev/null
+++ b/typescript-jsx-pinia-cypress/cypress/support/e2e.ts
@@ -0,0 +1,20 @@
+// ***********************************************************
+// This example support/index.js is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
diff --git a/typescript-jsx-pinia-cypress/env.d.ts b/typescript-jsx-pinia-cypress/env.d.ts
new file mode 100644
index 00000000..11f02fe2
--- /dev/null
+++ b/typescript-jsx-pinia-cypress/env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/typescript-jsx-pinia-cypress/index.html b/typescript-jsx-pinia-cypress/index.html
new file mode 100644
index 00000000..11603f87
--- /dev/null
+++ b/typescript-jsx-pinia-cypress/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/typescript-jsx-pinia-cypress/package.json b/typescript-jsx-pinia-cypress/package.json
new file mode 100644
index 00000000..a4349161
--- /dev/null
+++ b/typescript-jsx-pinia-cypress/package.json
@@ -0,0 +1,33 @@
+{
+ "name": "typescript-jsx-pinia-cypress",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "run-p type-check build-only",
+ "preview": "vite preview --port 4173",
+ "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
+ "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'",
+ "test:unit": "cypress open --component",
+ "test:unit:ci": "cypress run --component --quiet --reporter spec",
+ "build-only": "vite build",
+ "type-check": "vue-tsc --noEmit"
+ },
+ "dependencies": {
+ "pinia": "^2.0.16",
+ "vue": "^2.7.7"
+ },
+ "devDependencies": {
+ "@types/node": "^16.11.45",
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vitejs/plugin-vue2-jsx": "^1.0.2",
+ "@vue/tsconfig": "^0.1.3",
+ "cypress": "^10.3.0",
+ "npm-run-all": "^4.1.5",
+ "start-server-and-test": "^1.14.0",
+ "terser": "^5.14.2",
+ "typescript": "~4.7.4",
+ "vite": "^3.0.2",
+ "vue-tsc": "^0.38.8"
+ }
+}
diff --git a/typescript-jsx-pinia-cypress/public/favicon.ico b/typescript-jsx-pinia-cypress/public/favicon.ico
new file mode 100644
index 00000000..df36fcfb
Binary files /dev/null and b/typescript-jsx-pinia-cypress/public/favicon.ico differ
diff --git a/typescript-jsx-pinia-cypress/src/App.vue b/typescript-jsx-pinia-cypress/src/App.vue
new file mode 100644
index 00000000..70c911b5
--- /dev/null
+++ b/typescript-jsx-pinia-cypress/src/App.vue
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/typescript-jsx-pinia-cypress/src/assets/base.css b/typescript-jsx-pinia-cypress/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/typescript-jsx-pinia-cypress/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/typescript-jsx-pinia-cypress/src/assets/logo.svg b/typescript-jsx-pinia-cypress/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/typescript-jsx-pinia-cypress/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/typescript-jsx-pinia-cypress/src/assets/main.css b/typescript-jsx-pinia-cypress/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/typescript-jsx-pinia-cypress/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/typescript-jsx-pinia-cypress/src/components/HelloWorld.vue b/typescript-jsx-pinia-cypress/src/components/HelloWorld.vue
new file mode 100644
index 00000000..624fb3e0
--- /dev/null
+++ b/typescript-jsx-pinia-cypress/src/components/HelloWorld.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 .
+
+
+
+
+
diff --git a/typescript-jsx-pinia-cypress/src/components/TheWelcome.vue b/typescript-jsx-pinia-cypress/src/components/TheWelcome.vue
new file mode 100644
index 00000000..51d12392
--- /dev/null
+++ b/typescript-jsx-pinia-cypress/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/typescript-jsx-pinia-cypress/src/components/WelcomeItem.vue b/typescript-jsx-pinia-cypress/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/typescript-jsx-pinia-cypress/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/typescript-jsx-pinia-cypress/src/components/__tests__/HelloWorld.cy.ts b/typescript-jsx-pinia-cypress/src/components/__tests__/HelloWorld.cy.ts
new file mode 100644
index 00000000..0e0c065a
--- /dev/null
+++ b/typescript-jsx-pinia-cypress/src/components/__tests__/HelloWorld.cy.ts
@@ -0,0 +1,12 @@
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('playground', () => {
+ cy.mount(HelloWorld, { propsData: { msg: 'Hello Cypress' } })
+ })
+
+ it('renders properly', () => {
+ cy.mount(HelloWorld, { propsData: { msg: 'Hello Cypress' } })
+ cy.get('h1').should('contain', 'Hello Cypress')
+ })
+})
diff --git a/typescript-jsx-pinia-cypress/src/components/icons/IconCommunity.vue b/typescript-jsx-pinia-cypress/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/typescript-jsx-pinia-cypress/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-pinia-cypress/src/components/icons/IconDocumentation.vue b/typescript-jsx-pinia-cypress/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/typescript-jsx-pinia-cypress/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-pinia-cypress/src/components/icons/IconEcosystem.vue b/typescript-jsx-pinia-cypress/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/typescript-jsx-pinia-cypress/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-pinia-cypress/src/components/icons/IconSupport.vue b/typescript-jsx-pinia-cypress/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/typescript-jsx-pinia-cypress/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-pinia-cypress/src/components/icons/IconTooling.vue b/typescript-jsx-pinia-cypress/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/typescript-jsx-pinia-cypress/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/typescript-jsx-pinia-cypress/src/main.ts b/typescript-jsx-pinia-cypress/src/main.ts
new file mode 100644
index 00000000..febe0dbe
--- /dev/null
+++ b/typescript-jsx-pinia-cypress/src/main.ts
@@ -0,0 +1,13 @@
+import Vue from 'vue'
+import { createPinia, PiniaVuePlugin } from 'pinia'
+
+import App from './App.vue'
+
+import './assets/main.css'
+
+Vue.use(PiniaVuePlugin)
+
+new Vue({
+ pinia: createPinia(),
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/typescript-jsx-pinia-cypress/src/stores/counter.ts b/typescript-jsx-pinia-cypress/src/stores/counter.ts
new file mode 100644
index 00000000..4a2d2427
--- /dev/null
+++ b/typescript-jsx-pinia-cypress/src/stores/counter.ts
@@ -0,0 +1,16 @@
+import { defineStore } from 'pinia'
+
+export const useCounterStore = defineStore({
+ id: 'counter',
+ state: () => ({
+ counter: 0
+ }),
+ getters: {
+ doubleCount: (state) => state.counter * 2
+ },
+ actions: {
+ increment() {
+ this.counter++
+ }
+ }
+})
diff --git a/typescript-jsx-pinia-cypress/tsconfig.app.json b/typescript-jsx-pinia-cypress/tsconfig.app.json
new file mode 100644
index 00000000..cdbea1d7
--- /dev/null
+++ b/typescript-jsx-pinia-cypress/tsconfig.app.json
@@ -0,0 +1,12 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
+ "exclude": ["src/**/__tests__/*"],
+ "compilerOptions": {
+ "composite": true,
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ }
+}
diff --git a/typescript-jsx-pinia-cypress/tsconfig.config.json b/typescript-jsx-pinia-cypress/tsconfig.config.json
new file mode 100644
index 00000000..c2d3a309
--- /dev/null
+++ b/typescript-jsx-pinia-cypress/tsconfig.config.json
@@ -0,0 +1,8 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.node.json",
+ "include": ["vite.config.*", "vitest.config.*", "cypress.config.*"],
+ "compilerOptions": {
+ "composite": true,
+ "types": ["node"]
+ }
+}
diff --git a/typescript-jsx-pinia-cypress/tsconfig.cypress-ct.json b/typescript-jsx-pinia-cypress/tsconfig.cypress-ct.json
new file mode 100644
index 00000000..29cbaa47
--- /dev/null
+++ b/typescript-jsx-pinia-cypress/tsconfig.cypress-ct.json
@@ -0,0 +1,8 @@
+{
+ "extends": "./tsconfig.app.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue", "cypress/support/component.*"],
+ "exclude": [],
+ "compilerOptions": {
+ "composite": true
+ }
+}
diff --git a/typescript-jsx-pinia-cypress/tsconfig.json b/typescript-jsx-pinia-cypress/tsconfig.json
new file mode 100644
index 00000000..040665bb
--- /dev/null
+++ b/typescript-jsx-pinia-cypress/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "files": [],
+ "references": [
+ {
+ "path": "./tsconfig.config.json"
+ },
+ {
+ "path": "./tsconfig.app.json"
+ },
+ {
+ "path": "./tsconfig.cypress-ct.json"
+ }
+ ]
+}
diff --git a/typescript-jsx-pinia-cypress/vite.config.ts b/typescript-jsx-pinia-cypress/vite.config.ts
new file mode 100644
index 00000000..54d7440f
--- /dev/null
+++ b/typescript-jsx-pinia-cypress/vite.config.ts
@@ -0,0 +1,23 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+import vue2Jsx from '@vitejs/plugin-vue2-jsx'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ vue2Jsx(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/typescript-jsx-pinia-vitest-cypress/.gitignore b/typescript-jsx-pinia-vitest-cypress/.gitignore
new file mode 100644
index 00000000..133da84e
--- /dev/null
+++ b/typescript-jsx-pinia-vitest-cypress/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/typescript-jsx-pinia-vitest-cypress/README.md b/typescript-jsx-pinia-vitest-cypress/README.md
new file mode 100644
index 00000000..52e3107d
--- /dev/null
+++ b/typescript-jsx-pinia-vitest-cypress/README.md
@@ -0,0 +1,53 @@
+# typescript-jsx-pinia-vitest-cypress
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[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).
+
+## Type Support for `.vue` Imports in TS
+
+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.
+
+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:
+
+1. Disable the built-in TypeScript Extension
+ 1) Run `Extensions: Show Built-in Extensions` from VSCode's command palette
+ 2) Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)`
+2. Reload the VSCode window by running `Developer: Reload Window` from the command palette.
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Type-Check, Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Unit Tests with [Vitest](https://vitest.dev/)
+
+```sh
+pnpm test:unit
+```
+
+### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
+
+```sh
+pnpm build
+pnpm test:e2e # or `pnpm test:e2e:ci` for headless testing
+```
diff --git a/typescript-jsx-pinia-vitest-cypress/cypress.config.ts b/typescript-jsx-pinia-vitest-cypress/cypress.config.ts
new file mode 100644
index 00000000..0f66080f
--- /dev/null
+++ b/typescript-jsx-pinia-vitest-cypress/cypress.config.ts
@@ -0,0 +1,8 @@
+import { defineConfig } from 'cypress'
+
+export default defineConfig({
+ e2e: {
+ specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
+ baseUrl: 'http://localhost:4173/'
+ }
+})
diff --git a/typescript-jsx-pinia-vitest-cypress/cypress/e2e/example.cy.ts b/typescript-jsx-pinia-vitest-cypress/cypress/e2e/example.cy.ts
new file mode 100644
index 00000000..7a8c909f
--- /dev/null
+++ b/typescript-jsx-pinia-vitest-cypress/cypress/e2e/example.cy.ts
@@ -0,0 +1,8 @@
+// https://docs.cypress.io/api/introduction/api.html
+
+describe('My First Test', () => {
+ it('visits the app root url', () => {
+ cy.visit('/')
+ cy.contains('h1', 'You did it!')
+ })
+})
diff --git a/typescript-jsx-pinia-vitest-cypress/cypress/e2e/tsconfig.json b/typescript-jsx-pinia-vitest-cypress/cypress/e2e/tsconfig.json
new file mode 100644
index 00000000..be213aef
--- /dev/null
+++ b/typescript-jsx-pinia-vitest-cypress/cypress/e2e/tsconfig.json
@@ -0,0 +1,10 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["./**/*", "../support/**/*"],
+ "compilerOptions": {
+ "isolatedModules": false,
+ "target": "es5",
+ "lib": ["es5", "dom"],
+ "types": ["cypress"]
+ }
+}
diff --git a/typescript-jsx-pinia-vitest-cypress/cypress/fixtures/example.json b/typescript-jsx-pinia-vitest-cypress/cypress/fixtures/example.json
new file mode 100644
index 00000000..02e42543
--- /dev/null
+++ b/typescript-jsx-pinia-vitest-cypress/cypress/fixtures/example.json
@@ -0,0 +1,5 @@
+{
+ "name": "Using fixtures to represent data",
+ "email": "hello@cypress.io",
+ "body": "Fixtures are a great way to mock data for responses to routes"
+}
diff --git a/typescript-jsx-pinia-vitest-cypress/cypress/support/commands.ts b/typescript-jsx-pinia-vitest-cypress/cypress/support/commands.ts
new file mode 100644
index 00000000..95857aea
--- /dev/null
+++ b/typescript-jsx-pinia-vitest-cypress/cypress/support/commands.ts
@@ -0,0 +1,37 @@
+///
+// ***********************************************
+// This example commands.ts shows you how to
+// create various custom commands and overwrite
+// existing commands.
+//
+// For more comprehensive examples of custom
+// commands please read more here:
+// https://on.cypress.io/custom-commands
+// ***********************************************
+//
+//
+// -- This is a parent command --
+// Cypress.Commands.add('login', (email, password) => { ... })
+//
+//
+// -- This is a child command --
+// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
+//
+//
+// -- This is a dual command --
+// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
+//
+//
+// -- This will overwrite an existing command --
+// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
+//
+// declare global {
+// namespace Cypress {
+// interface Chainable {
+// login(email: string, password: string): Chainable
+// drag(subject: string, options?: Partial): Chainable
+// dismiss(subject: string, options?: Partial): Chainable
+// visit(originalFn: CommandOriginalFn, url: string, options: Partial): Chainable
+// }
+// }
+// }
diff --git a/typescript-jsx-pinia-vitest-cypress/cypress/support/e2e.ts b/typescript-jsx-pinia-vitest-cypress/cypress/support/e2e.ts
new file mode 100644
index 00000000..d68db96d
--- /dev/null
+++ b/typescript-jsx-pinia-vitest-cypress/cypress/support/e2e.ts
@@ -0,0 +1,20 @@
+// ***********************************************************
+// This example support/index.js is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
diff --git a/typescript-jsx-pinia-vitest-cypress/env.d.ts b/typescript-jsx-pinia-vitest-cypress/env.d.ts
new file mode 100644
index 00000000..11f02fe2
--- /dev/null
+++ b/typescript-jsx-pinia-vitest-cypress/env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/typescript-jsx-pinia-vitest-cypress/index.html b/typescript-jsx-pinia-vitest-cypress/index.html
new file mode 100644
index 00000000..11603f87
--- /dev/null
+++ b/typescript-jsx-pinia-vitest-cypress/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/typescript-jsx-pinia-vitest-cypress/package.json b/typescript-jsx-pinia-vitest-cypress/package.json
new file mode 100644
index 00000000..134ce2a1
--- /dev/null
+++ b/typescript-jsx-pinia-vitest-cypress/package.json
@@ -0,0 +1,37 @@
+{
+ "name": "typescript-jsx-pinia-vitest-cypress",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "run-p type-check build-only",
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom",
+ "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
+ "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'",
+ "build-only": "vite build",
+ "type-check": "vue-tsc --noEmit -p tsconfig.vitest.json --composite false"
+ },
+ "dependencies": {
+ "pinia": "^2.0.16",
+ "vue": "^2.7.7"
+ },
+ "devDependencies": {
+ "@types/jsdom": "^16.2.14",
+ "@types/node": "^16.11.45",
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vitejs/plugin-vue2-jsx": "^1.0.2",
+ "@vue/test-utils": "^1.3.0",
+ "@vue/tsconfig": "^0.1.3",
+ "cypress": "^10.3.0",
+ "jsdom": "^20.0.0",
+ "npm-run-all": "^4.1.5",
+ "start-server-and-test": "^1.14.0",
+ "terser": "^5.14.2",
+ "typescript": "~4.7.4",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7",
+ "vue-tsc": "^0.38.8"
+ }
+}
diff --git a/typescript-jsx-pinia-vitest-cypress/public/favicon.ico b/typescript-jsx-pinia-vitest-cypress/public/favicon.ico
new file mode 100644
index 00000000..df36fcfb
Binary files /dev/null and b/typescript-jsx-pinia-vitest-cypress/public/favicon.ico differ
diff --git a/typescript-jsx-pinia-vitest-cypress/src/App.vue b/typescript-jsx-pinia-vitest-cypress/src/App.vue
new file mode 100644
index 00000000..70c911b5
--- /dev/null
+++ b/typescript-jsx-pinia-vitest-cypress/src/App.vue
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/typescript-jsx-pinia-vitest-cypress/src/assets/base.css b/typescript-jsx-pinia-vitest-cypress/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/typescript-jsx-pinia-vitest-cypress/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/typescript-jsx-pinia-vitest-cypress/src/assets/logo.svg b/typescript-jsx-pinia-vitest-cypress/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/typescript-jsx-pinia-vitest-cypress/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/typescript-jsx-pinia-vitest-cypress/src/assets/main.css b/typescript-jsx-pinia-vitest-cypress/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/typescript-jsx-pinia-vitest-cypress/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/typescript-jsx-pinia-vitest-cypress/src/components/HelloWorld.vue b/typescript-jsx-pinia-vitest-cypress/src/components/HelloWorld.vue
new file mode 100644
index 00000000..624fb3e0
--- /dev/null
+++ b/typescript-jsx-pinia-vitest-cypress/src/components/HelloWorld.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 .
+
+
+
+
+
diff --git a/typescript-jsx-pinia-vitest-cypress/src/components/TheWelcome.vue b/typescript-jsx-pinia-vitest-cypress/src/components/TheWelcome.vue
new file mode 100644
index 00000000..51d12392
--- /dev/null
+++ b/typescript-jsx-pinia-vitest-cypress/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/typescript-jsx-pinia-vitest-cypress/src/components/WelcomeItem.vue b/typescript-jsx-pinia-vitest-cypress/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/typescript-jsx-pinia-vitest-cypress/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/typescript-jsx-pinia-vitest-cypress/src/components/__tests__/HelloWorld.spec.ts b/typescript-jsx-pinia-vitest-cypress/src/components/__tests__/HelloWorld.spec.ts
new file mode 100644
index 00000000..293bf197
--- /dev/null
+++ b/typescript-jsx-pinia-vitest-cypress/src/components/__tests__/HelloWorld.spec.ts
@@ -0,0 +1,11 @@
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('renders properly', () => {
+ const wrapper = mount(HelloWorld, { propsData: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
+ })
+})
diff --git a/typescript-jsx-pinia-vitest-cypress/src/components/icons/IconCommunity.vue b/typescript-jsx-pinia-vitest-cypress/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/typescript-jsx-pinia-vitest-cypress/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-pinia-vitest-cypress/src/components/icons/IconDocumentation.vue b/typescript-jsx-pinia-vitest-cypress/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/typescript-jsx-pinia-vitest-cypress/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-pinia-vitest-cypress/src/components/icons/IconEcosystem.vue b/typescript-jsx-pinia-vitest-cypress/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/typescript-jsx-pinia-vitest-cypress/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-pinia-vitest-cypress/src/components/icons/IconSupport.vue b/typescript-jsx-pinia-vitest-cypress/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/typescript-jsx-pinia-vitest-cypress/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-pinia-vitest-cypress/src/components/icons/IconTooling.vue b/typescript-jsx-pinia-vitest-cypress/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/typescript-jsx-pinia-vitest-cypress/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/typescript-jsx-pinia-vitest-cypress/src/main.ts b/typescript-jsx-pinia-vitest-cypress/src/main.ts
new file mode 100644
index 00000000..febe0dbe
--- /dev/null
+++ b/typescript-jsx-pinia-vitest-cypress/src/main.ts
@@ -0,0 +1,13 @@
+import Vue from 'vue'
+import { createPinia, PiniaVuePlugin } from 'pinia'
+
+import App from './App.vue'
+
+import './assets/main.css'
+
+Vue.use(PiniaVuePlugin)
+
+new Vue({
+ pinia: createPinia(),
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/typescript-jsx-pinia-vitest-cypress/src/stores/counter.ts b/typescript-jsx-pinia-vitest-cypress/src/stores/counter.ts
new file mode 100644
index 00000000..4a2d2427
--- /dev/null
+++ b/typescript-jsx-pinia-vitest-cypress/src/stores/counter.ts
@@ -0,0 +1,16 @@
+import { defineStore } from 'pinia'
+
+export const useCounterStore = defineStore({
+ id: 'counter',
+ state: () => ({
+ counter: 0
+ }),
+ getters: {
+ doubleCount: (state) => state.counter * 2
+ },
+ actions: {
+ increment() {
+ this.counter++
+ }
+ }
+})
diff --git a/typescript-jsx-pinia-vitest-cypress/tsconfig.app.json b/typescript-jsx-pinia-vitest-cypress/tsconfig.app.json
new file mode 100644
index 00000000..cdbea1d7
--- /dev/null
+++ b/typescript-jsx-pinia-vitest-cypress/tsconfig.app.json
@@ -0,0 +1,12 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
+ "exclude": ["src/**/__tests__/*"],
+ "compilerOptions": {
+ "composite": true,
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ }
+}
diff --git a/typescript-jsx-pinia-vitest-cypress/tsconfig.config.json b/typescript-jsx-pinia-vitest-cypress/tsconfig.config.json
new file mode 100644
index 00000000..c2d3a309
--- /dev/null
+++ b/typescript-jsx-pinia-vitest-cypress/tsconfig.config.json
@@ -0,0 +1,8 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.node.json",
+ "include": ["vite.config.*", "vitest.config.*", "cypress.config.*"],
+ "compilerOptions": {
+ "composite": true,
+ "types": ["node"]
+ }
+}
diff --git a/typescript-jsx-pinia-vitest-cypress/tsconfig.json b/typescript-jsx-pinia-vitest-cypress/tsconfig.json
new file mode 100644
index 00000000..31f90037
--- /dev/null
+++ b/typescript-jsx-pinia-vitest-cypress/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "files": [],
+ "references": [
+ {
+ "path": "./tsconfig.config.json"
+ },
+ {
+ "path": "./tsconfig.app.json"
+ },
+ {
+ "path": "./tsconfig.vitest.json"
+ }
+ ]
+}
diff --git a/typescript-jsx-pinia-vitest-cypress/tsconfig.vitest.json b/typescript-jsx-pinia-vitest-cypress/tsconfig.vitest.json
new file mode 100644
index 00000000..d080d611
--- /dev/null
+++ b/typescript-jsx-pinia-vitest-cypress/tsconfig.vitest.json
@@ -0,0 +1,9 @@
+{
+ "extends": "./tsconfig.app.json",
+ "exclude": [],
+ "compilerOptions": {
+ "composite": true,
+ "lib": [],
+ "types": ["node", "jsdom"]
+ }
+}
diff --git a/typescript-jsx-pinia-vitest-cypress/vite.config.ts b/typescript-jsx-pinia-vitest-cypress/vite.config.ts
new file mode 100644
index 00000000..54d7440f
--- /dev/null
+++ b/typescript-jsx-pinia-vitest-cypress/vite.config.ts
@@ -0,0 +1,23 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+import vue2Jsx from '@vitejs/plugin-vue2-jsx'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ vue2Jsx(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/typescript-jsx-pinia-vitest/.gitignore b/typescript-jsx-pinia-vitest/.gitignore
new file mode 100644
index 00000000..133da84e
--- /dev/null
+++ b/typescript-jsx-pinia-vitest/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/typescript-jsx-pinia-vitest/README.md b/typescript-jsx-pinia-vitest/README.md
new file mode 100644
index 00000000..016c52b6
--- /dev/null
+++ b/typescript-jsx-pinia-vitest/README.md
@@ -0,0 +1,46 @@
+# typescript-jsx-pinia-vitest
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[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).
+
+## Type Support for `.vue` Imports in TS
+
+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.
+
+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:
+
+1. Disable the built-in TypeScript Extension
+ 1) Run `Extensions: Show Built-in Extensions` from VSCode's command palette
+ 2) Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)`
+2. Reload the VSCode window by running `Developer: Reload Window` from the command palette.
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Type-Check, Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Unit Tests with [Vitest](https://vitest.dev/)
+
+```sh
+pnpm test:unit
+```
diff --git a/typescript-jsx-pinia-vitest/env.d.ts b/typescript-jsx-pinia-vitest/env.d.ts
new file mode 100644
index 00000000..11f02fe2
--- /dev/null
+++ b/typescript-jsx-pinia-vitest/env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/typescript-jsx-pinia-vitest/index.html b/typescript-jsx-pinia-vitest/index.html
new file mode 100644
index 00000000..11603f87
--- /dev/null
+++ b/typescript-jsx-pinia-vitest/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/typescript-jsx-pinia-vitest/package.json b/typescript-jsx-pinia-vitest/package.json
new file mode 100644
index 00000000..e69b9968
--- /dev/null
+++ b/typescript-jsx-pinia-vitest/package.json
@@ -0,0 +1,33 @@
+{
+ "name": "typescript-jsx-pinia-vitest",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "run-p type-check build-only",
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom",
+ "build-only": "vite build",
+ "type-check": "vue-tsc --noEmit -p tsconfig.vitest.json --composite false"
+ },
+ "dependencies": {
+ "pinia": "^2.0.16",
+ "vue": "^2.7.7"
+ },
+ "devDependencies": {
+ "@types/jsdom": "^16.2.14",
+ "@types/node": "^16.11.45",
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vitejs/plugin-vue2-jsx": "^1.0.2",
+ "@vue/test-utils": "^1.3.0",
+ "@vue/tsconfig": "^0.1.3",
+ "jsdom": "^20.0.0",
+ "npm-run-all": "^4.1.5",
+ "terser": "^5.14.2",
+ "typescript": "~4.7.4",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7",
+ "vue-tsc": "^0.38.8"
+ }
+}
diff --git a/typescript-jsx-pinia-vitest/public/favicon.ico b/typescript-jsx-pinia-vitest/public/favicon.ico
new file mode 100644
index 00000000..df36fcfb
Binary files /dev/null and b/typescript-jsx-pinia-vitest/public/favicon.ico differ
diff --git a/typescript-jsx-pinia-vitest/src/App.vue b/typescript-jsx-pinia-vitest/src/App.vue
new file mode 100644
index 00000000..70c911b5
--- /dev/null
+++ b/typescript-jsx-pinia-vitest/src/App.vue
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/typescript-jsx-pinia-vitest/src/assets/base.css b/typescript-jsx-pinia-vitest/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/typescript-jsx-pinia-vitest/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/typescript-jsx-pinia-vitest/src/assets/logo.svg b/typescript-jsx-pinia-vitest/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/typescript-jsx-pinia-vitest/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/typescript-jsx-pinia-vitest/src/assets/main.css b/typescript-jsx-pinia-vitest/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/typescript-jsx-pinia-vitest/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/typescript-jsx-pinia-vitest/src/components/HelloWorld.vue b/typescript-jsx-pinia-vitest/src/components/HelloWorld.vue
new file mode 100644
index 00000000..624fb3e0
--- /dev/null
+++ b/typescript-jsx-pinia-vitest/src/components/HelloWorld.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 .
+
+
+
+
+
diff --git a/typescript-jsx-pinia-vitest/src/components/TheWelcome.vue b/typescript-jsx-pinia-vitest/src/components/TheWelcome.vue
new file mode 100644
index 00000000..51d12392
--- /dev/null
+++ b/typescript-jsx-pinia-vitest/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/typescript-jsx-pinia-vitest/src/components/WelcomeItem.vue b/typescript-jsx-pinia-vitest/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/typescript-jsx-pinia-vitest/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/typescript-jsx-pinia-vitest/src/components/__tests__/HelloWorld.spec.ts b/typescript-jsx-pinia-vitest/src/components/__tests__/HelloWorld.spec.ts
new file mode 100644
index 00000000..293bf197
--- /dev/null
+++ b/typescript-jsx-pinia-vitest/src/components/__tests__/HelloWorld.spec.ts
@@ -0,0 +1,11 @@
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('renders properly', () => {
+ const wrapper = mount(HelloWorld, { propsData: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
+ })
+})
diff --git a/typescript-jsx-pinia-vitest/src/components/icons/IconCommunity.vue b/typescript-jsx-pinia-vitest/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/typescript-jsx-pinia-vitest/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-pinia-vitest/src/components/icons/IconDocumentation.vue b/typescript-jsx-pinia-vitest/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/typescript-jsx-pinia-vitest/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-pinia-vitest/src/components/icons/IconEcosystem.vue b/typescript-jsx-pinia-vitest/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/typescript-jsx-pinia-vitest/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-pinia-vitest/src/components/icons/IconSupport.vue b/typescript-jsx-pinia-vitest/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/typescript-jsx-pinia-vitest/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-pinia-vitest/src/components/icons/IconTooling.vue b/typescript-jsx-pinia-vitest/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/typescript-jsx-pinia-vitest/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/typescript-jsx-pinia-vitest/src/main.ts b/typescript-jsx-pinia-vitest/src/main.ts
new file mode 100644
index 00000000..febe0dbe
--- /dev/null
+++ b/typescript-jsx-pinia-vitest/src/main.ts
@@ -0,0 +1,13 @@
+import Vue from 'vue'
+import { createPinia, PiniaVuePlugin } from 'pinia'
+
+import App from './App.vue'
+
+import './assets/main.css'
+
+Vue.use(PiniaVuePlugin)
+
+new Vue({
+ pinia: createPinia(),
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/typescript-jsx-pinia-vitest/src/stores/counter.ts b/typescript-jsx-pinia-vitest/src/stores/counter.ts
new file mode 100644
index 00000000..4a2d2427
--- /dev/null
+++ b/typescript-jsx-pinia-vitest/src/stores/counter.ts
@@ -0,0 +1,16 @@
+import { defineStore } from 'pinia'
+
+export const useCounterStore = defineStore({
+ id: 'counter',
+ state: () => ({
+ counter: 0
+ }),
+ getters: {
+ doubleCount: (state) => state.counter * 2
+ },
+ actions: {
+ increment() {
+ this.counter++
+ }
+ }
+})
diff --git a/typescript-jsx-pinia-vitest/tsconfig.app.json b/typescript-jsx-pinia-vitest/tsconfig.app.json
new file mode 100644
index 00000000..cdbea1d7
--- /dev/null
+++ b/typescript-jsx-pinia-vitest/tsconfig.app.json
@@ -0,0 +1,12 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
+ "exclude": ["src/**/__tests__/*"],
+ "compilerOptions": {
+ "composite": true,
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ }
+}
diff --git a/typescript-jsx-pinia-vitest/tsconfig.config.json b/typescript-jsx-pinia-vitest/tsconfig.config.json
new file mode 100644
index 00000000..c2d3a309
--- /dev/null
+++ b/typescript-jsx-pinia-vitest/tsconfig.config.json
@@ -0,0 +1,8 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.node.json",
+ "include": ["vite.config.*", "vitest.config.*", "cypress.config.*"],
+ "compilerOptions": {
+ "composite": true,
+ "types": ["node"]
+ }
+}
diff --git a/typescript-jsx-pinia-vitest/tsconfig.json b/typescript-jsx-pinia-vitest/tsconfig.json
new file mode 100644
index 00000000..31f90037
--- /dev/null
+++ b/typescript-jsx-pinia-vitest/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "files": [],
+ "references": [
+ {
+ "path": "./tsconfig.config.json"
+ },
+ {
+ "path": "./tsconfig.app.json"
+ },
+ {
+ "path": "./tsconfig.vitest.json"
+ }
+ ]
+}
diff --git a/typescript-jsx-pinia-vitest/tsconfig.vitest.json b/typescript-jsx-pinia-vitest/tsconfig.vitest.json
new file mode 100644
index 00000000..d080d611
--- /dev/null
+++ b/typescript-jsx-pinia-vitest/tsconfig.vitest.json
@@ -0,0 +1,9 @@
+{
+ "extends": "./tsconfig.app.json",
+ "exclude": [],
+ "compilerOptions": {
+ "composite": true,
+ "lib": [],
+ "types": ["node", "jsdom"]
+ }
+}
diff --git a/typescript-jsx-pinia-vitest/vite.config.ts b/typescript-jsx-pinia-vitest/vite.config.ts
new file mode 100644
index 00000000..54d7440f
--- /dev/null
+++ b/typescript-jsx-pinia-vitest/vite.config.ts
@@ -0,0 +1,23 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+import vue2Jsx from '@vitejs/plugin-vue2-jsx'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ vue2Jsx(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/typescript-jsx-pinia-with-tests/README.md b/typescript-jsx-pinia-with-tests/README.md
index 79fac8f7..a3d3d35b 100644
--- a/typescript-jsx-pinia-with-tests/README.md
+++ b/typescript-jsx-pinia-with-tests/README.md
@@ -4,13 +4,18 @@ This template should help get you started developing with Vue 3 in Vite.
## Recommended IDE Setup
-[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=johnsoncodehk.volar) (and disable Vetur).
+[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).
## Type Support for `.vue` Imports in TS
-Since TypeScript cannot handle type information for `.vue` imports, they are shimmed to be a generic Vue component type by default. In most cases this is fine if you don't really care about component prop types outside of templates.
+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.
-However, if you wish to get actual prop types in `.vue` imports (for example to get props validation when using manual `h(...)` calls), you can run `Volar: Switch TS Plugin on/off` from VSCode command palette.
+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:
+
+1. Disable the built-in TypeScript Extension
+ 1) Run `Extensions: Show Built-in Extensions` from VSCode's command palette
+ 2) Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)`
+2. Reload the VSCode window by running `Developer: Reload Window` from the command palette.
## Customize configuration
@@ -34,10 +39,10 @@ pnpm dev
pnpm build
```
-### Run Unit Tests with [Cypress Component Testing](https://docs.cypress.io/guides/component-testing/introduction)
+### Run Unit Tests with [Vitest](https://vitest.dev/)
```sh
-pnpm test:unit # or `pnpm test:unit:ci` for headless testing
+pnpm test:unit
```
### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
diff --git a/typescript-jsx-pinia-with-tests/cypress.config.ts b/typescript-jsx-pinia-with-tests/cypress.config.ts
new file mode 100644
index 00000000..0f66080f
--- /dev/null
+++ b/typescript-jsx-pinia-with-tests/cypress.config.ts
@@ -0,0 +1,8 @@
+import { defineConfig } from 'cypress'
+
+export default defineConfig({
+ e2e: {
+ specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
+ baseUrl: 'http://localhost:4173/'
+ }
+})
diff --git a/typescript-jsx-pinia-with-tests/cypress.json b/typescript-jsx-pinia-with-tests/cypress.json
deleted file mode 100644
index 3d372252..00000000
--- a/typescript-jsx-pinia-with-tests/cypress.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "baseUrl": "http://localhost:5050/",
- "component": {
- "componentFolder": "src",
- "testFiles": "**/__tests__/*.spec.{js,ts,jsx,tsx}"
- }
-}
diff --git a/typescript-jsx-pinia-with-tests/cypress/e2e/example.cy.ts b/typescript-jsx-pinia-with-tests/cypress/e2e/example.cy.ts
new file mode 100644
index 00000000..7a8c909f
--- /dev/null
+++ b/typescript-jsx-pinia-with-tests/cypress/e2e/example.cy.ts
@@ -0,0 +1,8 @@
+// https://docs.cypress.io/api/introduction/api.html
+
+describe('My First Test', () => {
+ it('visits the app root url', () => {
+ cy.visit('/')
+ cy.contains('h1', 'You did it!')
+ })
+})
diff --git a/typescript-jsx-pinia-with-tests/cypress/e2e/tsconfig.json b/typescript-jsx-pinia-with-tests/cypress/e2e/tsconfig.json
new file mode 100644
index 00000000..be213aef
--- /dev/null
+++ b/typescript-jsx-pinia-with-tests/cypress/e2e/tsconfig.json
@@ -0,0 +1,10 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["./**/*", "../support/**/*"],
+ "compilerOptions": {
+ "isolatedModules": false,
+ "target": "es5",
+ "lib": ["es5", "dom"],
+ "types": ["cypress"]
+ }
+}
diff --git a/typescript-jsx-pinia-with-tests/cypress/plugins/index.ts b/typescript-jsx-pinia-with-tests/cypress/plugins/index.ts
deleted file mode 100644
index ad2e351d..00000000
--- a/typescript-jsx-pinia-with-tests/cypress/plugins/index.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-///
-// ***********************************************************
-// This example plugins/index.js can be used to load plugins
-//
-// You can change the location of this file or turn off loading
-// the plugins file with the 'pluginsFile' configuration option.
-//
-// You can read more here:
-// https://on.cypress.io/plugins-guide
-// ***********************************************************
-
-// This function is called when a project is opened or re-opened (e.g. due to
-// the project's config changing)
-
-const { startDevServer } = require('@cypress/vite-dev-server')
-
-/**
- * @type {Cypress.PluginConfig}
- */
-// eslint-disable-next-line no-unused-vars
-module.exports = (on, config) => {
- // `on` is used to hook into various events Cypress emits
- // `config` is the resolved Cypress config
- on('dev-server:start', (options) => {
- return startDevServer({ options })
- })
- return config
-}
diff --git a/typescript-jsx-pinia-with-tests/cypress/support/commands.ts b/typescript-jsx-pinia-with-tests/cypress/support/commands.ts
index 119ab03f..95857aea 100644
--- a/typescript-jsx-pinia-with-tests/cypress/support/commands.ts
+++ b/typescript-jsx-pinia-with-tests/cypress/support/commands.ts
@@ -1,5 +1,6 @@
+///
// ***********************************************
-// This example commands.js shows you how to
+// This example commands.ts shows you how to
// create various custom commands and overwrite
// existing commands.
//
@@ -23,3 +24,14 @@
//
// -- This will overwrite an existing command --
// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
+//
+// declare global {
+// namespace Cypress {
+// interface Chainable {
+// login(email: string, password: string): Chainable
+// drag(subject: string, options?: Partial): Chainable
+// dismiss(subject: string, options?: Partial): Chainable
+// visit(originalFn: CommandOriginalFn, url: string, options: Partial): Chainable
+// }
+// }
+// }
diff --git a/typescript-jsx-pinia-with-tests/cypress/support/e2e.ts b/typescript-jsx-pinia-with-tests/cypress/support/e2e.ts
new file mode 100644
index 00000000..d68db96d
--- /dev/null
+++ b/typescript-jsx-pinia-with-tests/cypress/support/e2e.ts
@@ -0,0 +1,20 @@
+// ***********************************************************
+// This example support/index.js is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
diff --git a/typescript-jsx-pinia-with-tests/cypress/tsconfig.json b/typescript-jsx-pinia-with-tests/cypress/tsconfig.json
deleted file mode 100644
index b5b2f972..00000000
--- a/typescript-jsx-pinia-with-tests/cypress/tsconfig.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "compilerOptions": {
- "target": "es5",
- "lib": ["es5", "dom"],
- "types": ["cypress"]
- },
- "include": ["./**/*"]
-}
diff --git a/typescript-jsx-pinia-with-tests/env.d.ts b/typescript-jsx-pinia-with-tests/env.d.ts
index 636d9c3f..11f02fe2 100644
--- a/typescript-jsx-pinia-with-tests/env.d.ts
+++ b/typescript-jsx-pinia-with-tests/env.d.ts
@@ -1,8 +1 @@
///
-
-declare module '*.vue' {
- import { DefineComponent } from 'vue'
- // eslint-disable-next-line
- const component: DefineComponent<{}, {}, any>
- export default component
-}
diff --git a/typescript-jsx-pinia-with-tests/package.json b/typescript-jsx-pinia-with-tests/package.json
index 5c3927ef..3b6c7318 100644
--- a/typescript-jsx-pinia-with-tests/package.json
+++ b/typescript-jsx-pinia-with-tests/package.json
@@ -3,28 +3,35 @@
"version": "0.0.0",
"scripts": {
"dev": "vite",
- "build": "vue-tsc --noEmit && vite build",
- "preview": "vite preview --port 5050",
- "test:unit": "cypress open-ct",
- "test:unit:ci": "cypress run-ct --quiet --reporter spec",
- "test:e2e": "start-server-and-test preview http://127.0.0.1:5050/ 'cypress open'",
- "test:e2e:ci": "start-server-and-test preview http://127.0.0.1:5050/ 'cypress run'",
- "typecheck": "vue-tsc --noEmit"
+ "build": "run-p type-check build-only",
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom",
+ "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
+ "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'",
+ "build-only": "vite build",
+ "type-check": "vue-tsc --noEmit -p tsconfig.vitest.json --composite false"
},
"dependencies": {
- "pinia": "^2.0.4",
- "vue": "^3.2.22"
+ "pinia": "^2.0.16",
+ "vue": "^2.7.7"
},
"devDependencies": {
- "@cypress/vite-dev-server": "^2.2.1",
- "@cypress/vue": "^3.0.5",
- "@types/node": "^16.11.10",
- "@vitejs/plugin-vue": "^1.10.0",
- "@vitejs/plugin-vue-jsx": "^1.3.0",
- "cypress": "^8.7.0",
+ "@types/jsdom": "^16.2.14",
+ "@types/node": "^16.11.45",
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vitejs/plugin-vue2-jsx": "^1.0.2",
+ "@vue/test-utils": "^1.3.0",
+ "@vue/tsconfig": "^0.1.3",
+ "cypress": "^10.3.0",
+ "jsdom": "^20.0.0",
+ "npm-run-all": "^4.1.5",
"start-server-and-test": "^1.14.0",
- "typescript": "~4.4.4",
- "vite": "^2.6.14",
- "vue-tsc": "^0.29.6"
+ "terser": "^5.14.2",
+ "typescript": "~4.7.4",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7",
+ "vue-tsc": "^0.38.8"
}
}
diff --git a/typescript-jsx-pinia-with-tests/src/App.vue b/typescript-jsx-pinia-with-tests/src/App.vue
index d91eefc4..70c911b5 100644
--- a/typescript-jsx-pinia-with-tests/src/App.vue
+++ b/typescript-jsx-pinia-with-tests/src/App.vue
@@ -4,30 +4,22 @@ import TheWelcome from './components/TheWelcome.vue'
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/typescript-jsx-pinia-with-tests/src/assets/main.css b/typescript-jsx-pinia-with-tests/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/typescript-jsx-pinia-with-tests/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/typescript-jsx-pinia-with-tests/src/components/HelloWorld.vue b/typescript-jsx-pinia-with-tests/src/components/HelloWorld.vue
index 01118cd9..624fb3e0 100644
--- a/typescript-jsx-pinia-with-tests/src/components/HelloWorld.vue
+++ b/typescript-jsx-pinia-with-tests/src/components/HelloWorld.vue
@@ -10,7 +10,7 @@ defineProps<{
You’ve successfully created a project with
Vite +
- Vue 3 .
+ Vue 2 .
diff --git a/typescript-jsx-pinia-with-tests/src/components/TheWelcome.vue b/typescript-jsx-pinia-with-tests/src/components/TheWelcome.vue
index b91a8edd..51d12392 100644
--- a/typescript-jsx-pinia-with-tests/src/components/TheWelcome.vue
+++ b/typescript-jsx-pinia-with-tests/src/components/TheWelcome.vue
@@ -8,77 +8,79 @@ import SupportIcon from './icons/IconSupport.vue'
-
-
-
-
- Documentation
+
+
+
+
+
+ Documentation
- Vue’s
- official documentation
- provides you with all information you need to get started.
-
+ Vue’s
+
official documentation
+ provides you with all information you need to get started.
+
-
-
-
-
- Tooling
+
+
+
+
+ Tooling
- This project is served and bundled with
- Vite . The recommended IDE
- setup is VSCode +
- Volar . If you need to test
- your components and web pages, check out
- Cypress and
- Cypress Component Testing .
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
-
+
- More instructions are available in README.md
.
-
+ More instructions are available in README.md
.
+
-
-
-
-
- Ecosystem
+
+
+
+
+ Ecosystem
- Get official tools and libraries for your project:
- Vuex ,
- Vue Router ,
- Vue Test Utils , and
- Vue Dev Tools . If you need more
- resources, we suggest paying
- Awesome Vue
- a visit.
-
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
-
-
-
-
- Community
+
+
+
+
+ Community
- Got stuck? Ask your question on
- Vue Land , our official Discord server, or
- StackOverflow .
- You should also subscribe to
- our mailing list and follow the official
- @vuejs
- twitter account for latest news in the Vue world.
-
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
-
-
-
-
- Support Vue
+
+
+
+
+ Support Vue
- As an independent project, Vue relies on community backing for its sustainability. You can help
- us by
- becoming a sponsor .
-
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
diff --git a/typescript-jsx-pinia-with-tests/src/components/__tests__/HelloWorld.spec.ts b/typescript-jsx-pinia-with-tests/src/components/__tests__/HelloWorld.spec.ts
index a69f3a9d..293bf197 100644
--- a/typescript-jsx-pinia-with-tests/src/components/__tests__/HelloWorld.spec.ts
+++ b/typescript-jsx-pinia-with-tests/src/components/__tests__/HelloWorld.spec.ts
@@ -1,13 +1,11 @@
-import { mount } from '@cypress/vue'
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
import HelloWorld from '../HelloWorld.vue'
describe('HelloWorld', () => {
- it('playground', () => {
- mount(HelloWorld, { props: { msg: 'Hello Cypress' } })
- })
-
it('renders properly', () => {
- mount(HelloWorld, { props: { msg: 'Hello Cypress' } })
- cy.get('h1').should('contain', 'Hello Cypress')
+ const wrapper = mount(HelloWorld, { propsData: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
})
})
diff --git a/typescript-jsx-pinia-with-tests/src/components/icons/IconTooling.vue b/typescript-jsx-pinia-with-tests/src/components/icons/IconTooling.vue
index 660598d7..07dc46b0 100644
--- a/typescript-jsx-pinia-with-tests/src/components/icons/IconTooling.vue
+++ b/typescript-jsx-pinia-with-tests/src/components/icons/IconTooling.vue
@@ -2,8 +2,6 @@
h(App)
+}).$mount('#app')
diff --git a/typescript-jsx-pinia-with-tests/tsconfig.app.json b/typescript-jsx-pinia-with-tests/tsconfig.app.json
new file mode 100644
index 00000000..cdbea1d7
--- /dev/null
+++ b/typescript-jsx-pinia-with-tests/tsconfig.app.json
@@ -0,0 +1,12 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
+ "exclude": ["src/**/__tests__/*"],
+ "compilerOptions": {
+ "composite": true,
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ }
+}
diff --git a/typescript-jsx-pinia-with-tests/tsconfig.config.json b/typescript-jsx-pinia-with-tests/tsconfig.config.json
new file mode 100644
index 00000000..c2d3a309
--- /dev/null
+++ b/typescript-jsx-pinia-with-tests/tsconfig.config.json
@@ -0,0 +1,8 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.node.json",
+ "include": ["vite.config.*", "vitest.config.*", "cypress.config.*"],
+ "compilerOptions": {
+ "composite": true,
+ "types": ["node"]
+ }
+}
diff --git a/typescript-jsx-pinia-with-tests/tsconfig.json b/typescript-jsx-pinia-with-tests/tsconfig.json
index 8c707192..31f90037 100644
--- a/typescript-jsx-pinia-with-tests/tsconfig.json
+++ b/typescript-jsx-pinia-with-tests/tsconfig.json
@@ -1,21 +1,14 @@
{
- "compilerOptions": {
- "baseUrl": "./",
- "target": "esnext",
- "useDefineForClassFields": true,
- "module": "esnext",
- "moduleResolution": "node",
- "isolatedModules": true,
- "strict": true,
- "jsx": "preserve",
- "sourceMap": true,
- "resolveJsonModule": true,
- "esModuleInterop": true,
- "paths": {
- "@/*": ["src/*"]
+ "files": [],
+ "references": [
+ {
+ "path": "./tsconfig.config.json"
},
- "lib": ["esnext", "dom", "dom.iterable", "scripthost"],
- "skipLibCheck": true
- },
- "include": ["vite.config.*", "env.d.ts", "src/**/*", "src/**/*.vue"]
+ {
+ "path": "./tsconfig.app.json"
+ },
+ {
+ "path": "./tsconfig.vitest.json"
+ }
+ ]
}
diff --git a/typescript-jsx-pinia-with-tests/tsconfig.vitest.json b/typescript-jsx-pinia-with-tests/tsconfig.vitest.json
new file mode 100644
index 00000000..d080d611
--- /dev/null
+++ b/typescript-jsx-pinia-with-tests/tsconfig.vitest.json
@@ -0,0 +1,9 @@
+{
+ "extends": "./tsconfig.app.json",
+ "exclude": [],
+ "compilerOptions": {
+ "composite": true,
+ "lib": [],
+ "types": ["node", "jsdom"]
+ }
+}
diff --git a/typescript-jsx-pinia-with-tests/vite.config.ts b/typescript-jsx-pinia-with-tests/vite.config.ts
index f140f276..54d7440f 100644
--- a/typescript-jsx-pinia-with-tests/vite.config.ts
+++ b/typescript-jsx-pinia-with-tests/vite.config.ts
@@ -1,12 +1,20 @@
-import { fileURLToPath } from 'url'
+import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vite'
-import vue from '@vitejs/plugin-vue'
-import vueJsx from '@vitejs/plugin-vue-jsx'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+import vue2Jsx from '@vitejs/plugin-vue2-jsx'
// https://vitejs.dev/config/
export default defineConfig({
- plugins: [vue(), vueJsx()],
+ plugins: [
+ vue2(),
+ vue2Jsx(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
diff --git a/typescript-jsx-pinia/README.md b/typescript-jsx-pinia/README.md
index b8c8b93a..3edce380 100644
--- a/typescript-jsx-pinia/README.md
+++ b/typescript-jsx-pinia/README.md
@@ -4,13 +4,18 @@ This template should help get you started developing with Vue 3 in Vite.
## Recommended IDE Setup
-[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=johnsoncodehk.volar) (and disable Vetur).
+[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).
## Type Support for `.vue` Imports in TS
-Since TypeScript cannot handle type information for `.vue` imports, they are shimmed to be a generic Vue component type by default. In most cases this is fine if you don't really care about component prop types outside of templates.
+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.
-However, if you wish to get actual prop types in `.vue` imports (for example to get props validation when using manual `h(...)` calls), you can run `Volar: Switch TS Plugin on/off` from VSCode command palette.
+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:
+
+1. Disable the built-in TypeScript Extension
+ 1) Run `Extensions: Show Built-in Extensions` from VSCode's command palette
+ 2) Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)`
+2. Reload the VSCode window by running `Developer: Reload Window` from the command palette.
## Customize configuration
diff --git a/typescript-jsx-pinia/env.d.ts b/typescript-jsx-pinia/env.d.ts
index 636d9c3f..11f02fe2 100644
--- a/typescript-jsx-pinia/env.d.ts
+++ b/typescript-jsx-pinia/env.d.ts
@@ -1,8 +1 @@
///
-
-declare module '*.vue' {
- import { DefineComponent } from 'vue'
- // eslint-disable-next-line
- const component: DefineComponent<{}, {}, any>
- export default component
-}
diff --git a/typescript-jsx-pinia/package.json b/typescript-jsx-pinia/package.json
index b7436763..cf693d65 100644
--- a/typescript-jsx-pinia/package.json
+++ b/typescript-jsx-pinia/package.json
@@ -3,20 +3,25 @@
"version": "0.0.0",
"scripts": {
"dev": "vite",
- "build": "vue-tsc --noEmit && vite build",
- "preview": "vite preview --port 5050",
- "typecheck": "vue-tsc --noEmit"
+ "build": "run-p type-check build-only",
+ "preview": "vite preview --port 4173",
+ "build-only": "vite build",
+ "type-check": "vue-tsc --noEmit"
},
"dependencies": {
- "pinia": "^2.0.4",
- "vue": "^3.2.22"
+ "pinia": "^2.0.16",
+ "vue": "^2.7.7"
},
"devDependencies": {
- "@types/node": "^16.11.10",
- "@vitejs/plugin-vue": "^1.10.0",
- "@vitejs/plugin-vue-jsx": "^1.3.0",
- "typescript": "~4.4.4",
- "vite": "^2.6.14",
- "vue-tsc": "^0.29.6"
+ "@types/node": "^16.11.45",
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vitejs/plugin-vue2-jsx": "^1.0.2",
+ "@vue/tsconfig": "^0.1.3",
+ "npm-run-all": "^4.1.5",
+ "terser": "^5.14.2",
+ "typescript": "~4.7.4",
+ "vite": "^3.0.2",
+ "vue-tsc": "^0.38.8"
}
}
diff --git a/typescript-jsx-pinia/src/App.vue b/typescript-jsx-pinia/src/App.vue
index d91eefc4..70c911b5 100644
--- a/typescript-jsx-pinia/src/App.vue
+++ b/typescript-jsx-pinia/src/App.vue
@@ -4,30 +4,22 @@ import TheWelcome from './components/TheWelcome.vue'
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/typescript-jsx-pinia/src/assets/main.css b/typescript-jsx-pinia/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/typescript-jsx-pinia/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/typescript-jsx-pinia/src/components/HelloWorld.vue b/typescript-jsx-pinia/src/components/HelloWorld.vue
index 01118cd9..624fb3e0 100644
--- a/typescript-jsx-pinia/src/components/HelloWorld.vue
+++ b/typescript-jsx-pinia/src/components/HelloWorld.vue
@@ -10,7 +10,7 @@ defineProps<{
You’ve successfully created a project with
Vite +
- Vue 3 .
+ Vue 2 .
diff --git a/typescript-jsx-pinia/src/components/TheWelcome.vue b/typescript-jsx-pinia/src/components/TheWelcome.vue
index b91a8edd..51d12392 100644
--- a/typescript-jsx-pinia/src/components/TheWelcome.vue
+++ b/typescript-jsx-pinia/src/components/TheWelcome.vue
@@ -8,77 +8,79 @@ import SupportIcon from './icons/IconSupport.vue'
-
-
-
-
- Documentation
+
+
+
+
+
+ Documentation
- Vue’s
- official documentation
- provides you with all information you need to get started.
-
+ Vue’s
+
official documentation
+ provides you with all information you need to get started.
+
-
-
-
-
- Tooling
+
+
+
+
+ Tooling
- This project is served and bundled with
- Vite . The recommended IDE
- setup is VSCode +
- Volar . If you need to test
- your components and web pages, check out
- Cypress and
- Cypress Component Testing .
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
-
+
- More instructions are available in README.md
.
-
+ More instructions are available in README.md
.
+
-
-
-
-
- Ecosystem
+
+
+
+
+ Ecosystem
- Get official tools and libraries for your project:
- Vuex ,
- Vue Router ,
- Vue Test Utils , and
- Vue Dev Tools . If you need more
- resources, we suggest paying
- Awesome Vue
- a visit.
-
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
-
-
-
-
- Community
+
+
+
+
+ Community
- Got stuck? Ask your question on
- Vue Land , our official Discord server, or
- StackOverflow .
- You should also subscribe to
- our mailing list and follow the official
- @vuejs
- twitter account for latest news in the Vue world.
-
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
-
-
-
-
- Support Vue
+
+
+
+
+ Support Vue
- As an independent project, Vue relies on community backing for its sustainability. You can help
- us by
- becoming a sponsor .
-
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
diff --git a/typescript-jsx-pinia/src/components/icons/IconTooling.vue b/typescript-jsx-pinia/src/components/icons/IconTooling.vue
index 660598d7..07dc46b0 100644
--- a/typescript-jsx-pinia/src/components/icons/IconTooling.vue
+++ b/typescript-jsx-pinia/src/components/icons/IconTooling.vue
@@ -2,8 +2,6 @@
h(App)
+}).$mount('#app')
diff --git a/typescript-jsx-pinia/tsconfig.config.json b/typescript-jsx-pinia/tsconfig.config.json
new file mode 100644
index 00000000..c2d3a309
--- /dev/null
+++ b/typescript-jsx-pinia/tsconfig.config.json
@@ -0,0 +1,8 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.node.json",
+ "include": ["vite.config.*", "vitest.config.*", "cypress.config.*"],
+ "compilerOptions": {
+ "composite": true,
+ "types": ["node"]
+ }
+}
diff --git a/typescript-jsx-pinia/tsconfig.json b/typescript-jsx-pinia/tsconfig.json
index 8c707192..8d235999 100644
--- a/typescript-jsx-pinia/tsconfig.json
+++ b/typescript-jsx-pinia/tsconfig.json
@@ -1,21 +1,16 @@
{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
"compilerOptions": {
- "baseUrl": "./",
- "target": "esnext",
- "useDefineForClassFields": true,
- "module": "esnext",
- "moduleResolution": "node",
- "isolatedModules": true,
- "strict": true,
- "jsx": "preserve",
- "sourceMap": true,
- "resolveJsonModule": true,
- "esModuleInterop": true,
+ "baseUrl": ".",
"paths": {
- "@/*": ["src/*"]
- },
- "lib": ["esnext", "dom", "dom.iterable", "scripthost"],
- "skipLibCheck": true
+ "@/*": ["./src/*"]
+ }
},
- "include": ["vite.config.*", "env.d.ts", "src/**/*", "src/**/*.vue"]
+
+ "references": [
+ {
+ "path": "./tsconfig.config.json"
+ }
+ ]
}
diff --git a/typescript-jsx-pinia/vite.config.ts b/typescript-jsx-pinia/vite.config.ts
index f140f276..54d7440f 100644
--- a/typescript-jsx-pinia/vite.config.ts
+++ b/typescript-jsx-pinia/vite.config.ts
@@ -1,12 +1,20 @@
-import { fileURLToPath } from 'url'
+import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vite'
-import vue from '@vitejs/plugin-vue'
-import vueJsx from '@vitejs/plugin-vue-jsx'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+import vue2Jsx from '@vitejs/plugin-vue2-jsx'
// https://vitejs.dev/config/
export default defineConfig({
- plugins: [vue(), vueJsx()],
+ plugins: [
+ vue2(),
+ vue2Jsx(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
diff --git a/typescript-jsx-router-cypress/.gitignore b/typescript-jsx-router-cypress/.gitignore
new file mode 100644
index 00000000..133da84e
--- /dev/null
+++ b/typescript-jsx-router-cypress/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/typescript-jsx-router-cypress/README.md b/typescript-jsx-router-cypress/README.md
new file mode 100644
index 00000000..20fb13bd
--- /dev/null
+++ b/typescript-jsx-router-cypress/README.md
@@ -0,0 +1,53 @@
+# typescript-jsx-router-cypress
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[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).
+
+## Type Support for `.vue` Imports in TS
+
+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.
+
+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:
+
+1. Disable the built-in TypeScript Extension
+ 1) Run `Extensions: Show Built-in Extensions` from VSCode's command palette
+ 2) Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)`
+2. Reload the VSCode window by running `Developer: Reload Window` from the command palette.
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Type-Check, Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Headed Component Tests with [Cypress Component Testing](https://on.cypress.io/component)
+
+```sh
+pnpm test:unit # or `pnpm test:unit:ci` for headless testing
+```
+
+### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
+
+```sh
+pnpm build
+pnpm test:e2e # or `pnpm test:e2e:ci` for headless testing
+```
diff --git a/typescript-jsx-router-cypress/cypress.config.ts b/typescript-jsx-router-cypress/cypress.config.ts
new file mode 100644
index 00000000..c8fac129
--- /dev/null
+++ b/typescript-jsx-router-cypress/cypress.config.ts
@@ -0,0 +1,15 @@
+import { defineConfig } from 'cypress'
+
+export default defineConfig({
+ e2e: {
+ specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
+ baseUrl: 'http://localhost:4173/'
+ },
+ component: {
+ specPattern: 'src/**/__tests__/*.{cy,spec}.{js,ts,jsx,tsx}',
+ devServer: {
+ framework: 'vue',
+ bundler: 'vite'
+ }
+ }
+})
diff --git a/typescript-jsx-router-cypress/cypress/e2e/example.cy.ts b/typescript-jsx-router-cypress/cypress/e2e/example.cy.ts
new file mode 100644
index 00000000..7a8c909f
--- /dev/null
+++ b/typescript-jsx-router-cypress/cypress/e2e/example.cy.ts
@@ -0,0 +1,8 @@
+// https://docs.cypress.io/api/introduction/api.html
+
+describe('My First Test', () => {
+ it('visits the app root url', () => {
+ cy.visit('/')
+ cy.contains('h1', 'You did it!')
+ })
+})
diff --git a/typescript-jsx-router-cypress/cypress/e2e/tsconfig.json b/typescript-jsx-router-cypress/cypress/e2e/tsconfig.json
new file mode 100644
index 00000000..be213aef
--- /dev/null
+++ b/typescript-jsx-router-cypress/cypress/e2e/tsconfig.json
@@ -0,0 +1,10 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["./**/*", "../support/**/*"],
+ "compilerOptions": {
+ "isolatedModules": false,
+ "target": "es5",
+ "lib": ["es5", "dom"],
+ "types": ["cypress"]
+ }
+}
diff --git a/typescript-jsx-router-cypress/cypress/fixtures/example.json b/typescript-jsx-router-cypress/cypress/fixtures/example.json
new file mode 100644
index 00000000..02e42543
--- /dev/null
+++ b/typescript-jsx-router-cypress/cypress/fixtures/example.json
@@ -0,0 +1,5 @@
+{
+ "name": "Using fixtures to represent data",
+ "email": "hello@cypress.io",
+ "body": "Fixtures are a great way to mock data for responses to routes"
+}
diff --git a/typescript-jsx-router-cypress/cypress/support/commands.ts b/typescript-jsx-router-cypress/cypress/support/commands.ts
new file mode 100644
index 00000000..95857aea
--- /dev/null
+++ b/typescript-jsx-router-cypress/cypress/support/commands.ts
@@ -0,0 +1,37 @@
+///
+// ***********************************************
+// This example commands.ts shows you how to
+// create various custom commands and overwrite
+// existing commands.
+//
+// For more comprehensive examples of custom
+// commands please read more here:
+// https://on.cypress.io/custom-commands
+// ***********************************************
+//
+//
+// -- This is a parent command --
+// Cypress.Commands.add('login', (email, password) => { ... })
+//
+//
+// -- This is a child command --
+// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
+//
+//
+// -- This is a dual command --
+// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
+//
+//
+// -- This will overwrite an existing command --
+// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
+//
+// declare global {
+// namespace Cypress {
+// interface Chainable {
+// login(email: string, password: string): Chainable
+// drag(subject: string, options?: Partial): Chainable
+// dismiss(subject: string, options?: Partial): Chainable
+// visit(originalFn: CommandOriginalFn, url: string, options: Partial): Chainable
+// }
+// }
+// }
diff --git a/typescript-jsx-router-cypress/cypress/support/component-index.html b/typescript-jsx-router-cypress/cypress/support/component-index.html
new file mode 100644
index 00000000..5f9622ae
--- /dev/null
+++ b/typescript-jsx-router-cypress/cypress/support/component-index.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+ Components App
+
+
+
+
+
diff --git a/typescript-jsx-router-cypress/cypress/support/component.ts b/typescript-jsx-router-cypress/cypress/support/component.ts
new file mode 100644
index 00000000..f3d667e0
--- /dev/null
+++ b/typescript-jsx-router-cypress/cypress/support/component.ts
@@ -0,0 +1,42 @@
+// ***********************************************************
+// This example support/component.ts is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
+
+// Import global styles
+import '@/assets/main.css'
+
+import { mount } from 'cypress/vue2'
+
+// Augment the Cypress namespace to include type definitions for
+// your custom command.
+// Alternatively, can be defined in cypress/support/component.d.ts
+// with a at the top of your spec.
+declare global {
+ namespace Cypress {
+ interface Chainable {
+ mount: typeof mount
+ }
+ }
+}
+
+Cypress.Commands.add('mount', mount)
+
+// Example use:
+// cy.mount(MyComponent)
diff --git a/typescript-jsx-router-cypress/cypress/support/e2e.ts b/typescript-jsx-router-cypress/cypress/support/e2e.ts
new file mode 100644
index 00000000..d68db96d
--- /dev/null
+++ b/typescript-jsx-router-cypress/cypress/support/e2e.ts
@@ -0,0 +1,20 @@
+// ***********************************************************
+// This example support/index.js is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
diff --git a/typescript-jsx-router-cypress/env.d.ts b/typescript-jsx-router-cypress/env.d.ts
new file mode 100644
index 00000000..11f02fe2
--- /dev/null
+++ b/typescript-jsx-router-cypress/env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/typescript-jsx-router-cypress/index.html b/typescript-jsx-router-cypress/index.html
new file mode 100644
index 00000000..11603f87
--- /dev/null
+++ b/typescript-jsx-router-cypress/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/typescript-jsx-router-cypress/package.json b/typescript-jsx-router-cypress/package.json
new file mode 100644
index 00000000..d9b2b4fb
--- /dev/null
+++ b/typescript-jsx-router-cypress/package.json
@@ -0,0 +1,33 @@
+{
+ "name": "typescript-jsx-router-cypress",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "run-p type-check build-only",
+ "preview": "vite preview --port 4173",
+ "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
+ "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'",
+ "test:unit": "cypress open --component",
+ "test:unit:ci": "cypress run --component --quiet --reporter spec",
+ "build-only": "vite build",
+ "type-check": "vue-tsc --noEmit"
+ },
+ "dependencies": {
+ "vue": "^2.7.7",
+ "vue-router": "^3.5.4"
+ },
+ "devDependencies": {
+ "@types/node": "^16.11.45",
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vitejs/plugin-vue2-jsx": "^1.0.2",
+ "@vue/tsconfig": "^0.1.3",
+ "cypress": "^10.3.0",
+ "npm-run-all": "^4.1.5",
+ "start-server-and-test": "^1.14.0",
+ "terser": "^5.14.2",
+ "typescript": "~4.7.4",
+ "vite": "^3.0.2",
+ "vue-tsc": "^0.38.8"
+ }
+}
diff --git a/typescript-jsx-router-cypress/public/favicon.ico b/typescript-jsx-router-cypress/public/favicon.ico
new file mode 100644
index 00000000..df36fcfb
Binary files /dev/null and b/typescript-jsx-router-cypress/public/favicon.ico differ
diff --git a/typescript-jsx-router-cypress/src/App.vue b/typescript-jsx-router-cypress/src/App.vue
new file mode 100644
index 00000000..2745f550
--- /dev/null
+++ b/typescript-jsx-router-cypress/src/App.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+ Home
+ About
+
+
+
+
+
+
+
+
+
diff --git a/typescript-jsx-router-cypress/src/assets/base.css b/typescript-jsx-router-cypress/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/typescript-jsx-router-cypress/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/typescript-jsx-router-cypress/src/assets/logo.svg b/typescript-jsx-router-cypress/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/typescript-jsx-router-cypress/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/typescript-jsx-router-cypress/src/assets/main.css b/typescript-jsx-router-cypress/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/typescript-jsx-router-cypress/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/typescript-jsx-router-cypress/src/components/HelloWorld.vue b/typescript-jsx-router-cypress/src/components/HelloWorld.vue
new file mode 100644
index 00000000..bf0a052f
--- /dev/null
+++ b/typescript-jsx-router-cypress/src/components/HelloWorld.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 . What's next?
+
+
+
+
+
diff --git a/typescript-jsx-router-cypress/src/components/TheWelcome.vue b/typescript-jsx-router-cypress/src/components/TheWelcome.vue
new file mode 100644
index 00000000..51d12392
--- /dev/null
+++ b/typescript-jsx-router-cypress/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/typescript-jsx-router-cypress/src/components/WelcomeItem.vue b/typescript-jsx-router-cypress/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/typescript-jsx-router-cypress/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/typescript-jsx-router-cypress/src/components/__tests__/HelloWorld.cy.ts b/typescript-jsx-router-cypress/src/components/__tests__/HelloWorld.cy.ts
new file mode 100644
index 00000000..0e0c065a
--- /dev/null
+++ b/typescript-jsx-router-cypress/src/components/__tests__/HelloWorld.cy.ts
@@ -0,0 +1,12 @@
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('playground', () => {
+ cy.mount(HelloWorld, { propsData: { msg: 'Hello Cypress' } })
+ })
+
+ it('renders properly', () => {
+ cy.mount(HelloWorld, { propsData: { msg: 'Hello Cypress' } })
+ cy.get('h1').should('contain', 'Hello Cypress')
+ })
+})
diff --git a/typescript-jsx-router-cypress/src/components/icons/IconCommunity.vue b/typescript-jsx-router-cypress/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/typescript-jsx-router-cypress/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-router-cypress/src/components/icons/IconDocumentation.vue b/typescript-jsx-router-cypress/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/typescript-jsx-router-cypress/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-router-cypress/src/components/icons/IconEcosystem.vue b/typescript-jsx-router-cypress/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/typescript-jsx-router-cypress/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-router-cypress/src/components/icons/IconSupport.vue b/typescript-jsx-router-cypress/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/typescript-jsx-router-cypress/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-router-cypress/src/components/icons/IconTooling.vue b/typescript-jsx-router-cypress/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/typescript-jsx-router-cypress/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/typescript-jsx-router-cypress/src/main.ts b/typescript-jsx-router-cypress/src/main.ts
new file mode 100644
index 00000000..4919cf77
--- /dev/null
+++ b/typescript-jsx-router-cypress/src/main.ts
@@ -0,0 +1,11 @@
+import Vue from 'vue'
+
+import App from './App.vue'
+import router from './router'
+
+import './assets/main.css'
+
+new Vue({
+ router,
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/typescript-jsx-router-cypress/src/router/index.ts b/typescript-jsx-router-cypress/src/router/index.ts
new file mode 100644
index 00000000..cf9820b0
--- /dev/null
+++ b/typescript-jsx-router-cypress/src/router/index.ts
@@ -0,0 +1,27 @@
+import Vue from 'vue'
+import VueRouter from 'vue-router'
+import HomeView from '../views/HomeView.vue'
+
+Vue.use(VueRouter)
+
+const router = new VueRouter({
+ mode: 'history',
+ base: import.meta.env.BASE_URL,
+ routes: [
+ {
+ path: '/',
+ name: 'home',
+ component: HomeView
+ },
+ {
+ path: '/about',
+ name: 'about',
+ // route level code-splitting
+ // this generates a separate chunk (About.[hash].js) for this route
+ // which is lazy-loaded when the route is visited.
+ component: () => import('../views/AboutView.vue')
+ }
+ ]
+})
+
+export default router
diff --git a/typescript-jsx-router-cypress/src/views/AboutView.vue b/typescript-jsx-router-cypress/src/views/AboutView.vue
new file mode 100644
index 00000000..756ad2a1
--- /dev/null
+++ b/typescript-jsx-router-cypress/src/views/AboutView.vue
@@ -0,0 +1,15 @@
+
+
+
This is an about page
+
+
+
+
diff --git a/typescript-jsx-router-cypress/src/views/HomeView.vue b/typescript-jsx-router-cypress/src/views/HomeView.vue
new file mode 100644
index 00000000..6555a646
--- /dev/null
+++ b/typescript-jsx-router-cypress/src/views/HomeView.vue
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/typescript-jsx-router-cypress/tsconfig.app.json b/typescript-jsx-router-cypress/tsconfig.app.json
new file mode 100644
index 00000000..cdbea1d7
--- /dev/null
+++ b/typescript-jsx-router-cypress/tsconfig.app.json
@@ -0,0 +1,12 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
+ "exclude": ["src/**/__tests__/*"],
+ "compilerOptions": {
+ "composite": true,
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ }
+}
diff --git a/typescript-jsx-router-cypress/tsconfig.config.json b/typescript-jsx-router-cypress/tsconfig.config.json
new file mode 100644
index 00000000..c2d3a309
--- /dev/null
+++ b/typescript-jsx-router-cypress/tsconfig.config.json
@@ -0,0 +1,8 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.node.json",
+ "include": ["vite.config.*", "vitest.config.*", "cypress.config.*"],
+ "compilerOptions": {
+ "composite": true,
+ "types": ["node"]
+ }
+}
diff --git a/typescript-jsx-router-cypress/tsconfig.cypress-ct.json b/typescript-jsx-router-cypress/tsconfig.cypress-ct.json
new file mode 100644
index 00000000..29cbaa47
--- /dev/null
+++ b/typescript-jsx-router-cypress/tsconfig.cypress-ct.json
@@ -0,0 +1,8 @@
+{
+ "extends": "./tsconfig.app.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue", "cypress/support/component.*"],
+ "exclude": [],
+ "compilerOptions": {
+ "composite": true
+ }
+}
diff --git a/typescript-jsx-router-cypress/tsconfig.json b/typescript-jsx-router-cypress/tsconfig.json
new file mode 100644
index 00000000..040665bb
--- /dev/null
+++ b/typescript-jsx-router-cypress/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "files": [],
+ "references": [
+ {
+ "path": "./tsconfig.config.json"
+ },
+ {
+ "path": "./tsconfig.app.json"
+ },
+ {
+ "path": "./tsconfig.cypress-ct.json"
+ }
+ ]
+}
diff --git a/typescript-jsx-router-cypress/vite.config.ts b/typescript-jsx-router-cypress/vite.config.ts
new file mode 100644
index 00000000..54d7440f
--- /dev/null
+++ b/typescript-jsx-router-cypress/vite.config.ts
@@ -0,0 +1,23 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+import vue2Jsx from '@vitejs/plugin-vue2-jsx'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ vue2Jsx(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/typescript-jsx-router-pinia-cypress/.gitignore b/typescript-jsx-router-pinia-cypress/.gitignore
new file mode 100644
index 00000000..133da84e
--- /dev/null
+++ b/typescript-jsx-router-pinia-cypress/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/typescript-jsx-router-pinia-cypress/README.md b/typescript-jsx-router-pinia-cypress/README.md
new file mode 100644
index 00000000..404704a9
--- /dev/null
+++ b/typescript-jsx-router-pinia-cypress/README.md
@@ -0,0 +1,53 @@
+# typescript-jsx-router-pinia-cypress
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[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).
+
+## Type Support for `.vue` Imports in TS
+
+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.
+
+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:
+
+1. Disable the built-in TypeScript Extension
+ 1) Run `Extensions: Show Built-in Extensions` from VSCode's command palette
+ 2) Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)`
+2. Reload the VSCode window by running `Developer: Reload Window` from the command palette.
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Type-Check, Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Headed Component Tests with [Cypress Component Testing](https://on.cypress.io/component)
+
+```sh
+pnpm test:unit # or `pnpm test:unit:ci` for headless testing
+```
+
+### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
+
+```sh
+pnpm build
+pnpm test:e2e # or `pnpm test:e2e:ci` for headless testing
+```
diff --git a/typescript-jsx-router-pinia-cypress/cypress.config.ts b/typescript-jsx-router-pinia-cypress/cypress.config.ts
new file mode 100644
index 00000000..c8fac129
--- /dev/null
+++ b/typescript-jsx-router-pinia-cypress/cypress.config.ts
@@ -0,0 +1,15 @@
+import { defineConfig } from 'cypress'
+
+export default defineConfig({
+ e2e: {
+ specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
+ baseUrl: 'http://localhost:4173/'
+ },
+ component: {
+ specPattern: 'src/**/__tests__/*.{cy,spec}.{js,ts,jsx,tsx}',
+ devServer: {
+ framework: 'vue',
+ bundler: 'vite'
+ }
+ }
+})
diff --git a/typescript-jsx-router-pinia-cypress/cypress/e2e/example.cy.ts b/typescript-jsx-router-pinia-cypress/cypress/e2e/example.cy.ts
new file mode 100644
index 00000000..7a8c909f
--- /dev/null
+++ b/typescript-jsx-router-pinia-cypress/cypress/e2e/example.cy.ts
@@ -0,0 +1,8 @@
+// https://docs.cypress.io/api/introduction/api.html
+
+describe('My First Test', () => {
+ it('visits the app root url', () => {
+ cy.visit('/')
+ cy.contains('h1', 'You did it!')
+ })
+})
diff --git a/typescript-jsx-router-pinia-cypress/cypress/e2e/tsconfig.json b/typescript-jsx-router-pinia-cypress/cypress/e2e/tsconfig.json
new file mode 100644
index 00000000..be213aef
--- /dev/null
+++ b/typescript-jsx-router-pinia-cypress/cypress/e2e/tsconfig.json
@@ -0,0 +1,10 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["./**/*", "../support/**/*"],
+ "compilerOptions": {
+ "isolatedModules": false,
+ "target": "es5",
+ "lib": ["es5", "dom"],
+ "types": ["cypress"]
+ }
+}
diff --git a/typescript-jsx-router-pinia-cypress/cypress/fixtures/example.json b/typescript-jsx-router-pinia-cypress/cypress/fixtures/example.json
new file mode 100644
index 00000000..02e42543
--- /dev/null
+++ b/typescript-jsx-router-pinia-cypress/cypress/fixtures/example.json
@@ -0,0 +1,5 @@
+{
+ "name": "Using fixtures to represent data",
+ "email": "hello@cypress.io",
+ "body": "Fixtures are a great way to mock data for responses to routes"
+}
diff --git a/typescript-jsx-router-pinia-cypress/cypress/support/commands.ts b/typescript-jsx-router-pinia-cypress/cypress/support/commands.ts
new file mode 100644
index 00000000..95857aea
--- /dev/null
+++ b/typescript-jsx-router-pinia-cypress/cypress/support/commands.ts
@@ -0,0 +1,37 @@
+///
+// ***********************************************
+// This example commands.ts shows you how to
+// create various custom commands and overwrite
+// existing commands.
+//
+// For more comprehensive examples of custom
+// commands please read more here:
+// https://on.cypress.io/custom-commands
+// ***********************************************
+//
+//
+// -- This is a parent command --
+// Cypress.Commands.add('login', (email, password) => { ... })
+//
+//
+// -- This is a child command --
+// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
+//
+//
+// -- This is a dual command --
+// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
+//
+//
+// -- This will overwrite an existing command --
+// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
+//
+// declare global {
+// namespace Cypress {
+// interface Chainable {
+// login(email: string, password: string): Chainable
+// drag(subject: string, options?: Partial): Chainable
+// dismiss(subject: string, options?: Partial): Chainable
+// visit(originalFn: CommandOriginalFn, url: string, options: Partial): Chainable
+// }
+// }
+// }
diff --git a/typescript-jsx-router-pinia-cypress/cypress/support/component-index.html b/typescript-jsx-router-pinia-cypress/cypress/support/component-index.html
new file mode 100644
index 00000000..5f9622ae
--- /dev/null
+++ b/typescript-jsx-router-pinia-cypress/cypress/support/component-index.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+ Components App
+
+
+
+
+
diff --git a/typescript-jsx-router-pinia-cypress/cypress/support/component.ts b/typescript-jsx-router-pinia-cypress/cypress/support/component.ts
new file mode 100644
index 00000000..f3d667e0
--- /dev/null
+++ b/typescript-jsx-router-pinia-cypress/cypress/support/component.ts
@@ -0,0 +1,42 @@
+// ***********************************************************
+// This example support/component.ts is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
+
+// Import global styles
+import '@/assets/main.css'
+
+import { mount } from 'cypress/vue2'
+
+// Augment the Cypress namespace to include type definitions for
+// your custom command.
+// Alternatively, can be defined in cypress/support/component.d.ts
+// with a at the top of your spec.
+declare global {
+ namespace Cypress {
+ interface Chainable {
+ mount: typeof mount
+ }
+ }
+}
+
+Cypress.Commands.add('mount', mount)
+
+// Example use:
+// cy.mount(MyComponent)
diff --git a/typescript-jsx-router-pinia-cypress/cypress/support/e2e.ts b/typescript-jsx-router-pinia-cypress/cypress/support/e2e.ts
new file mode 100644
index 00000000..d68db96d
--- /dev/null
+++ b/typescript-jsx-router-pinia-cypress/cypress/support/e2e.ts
@@ -0,0 +1,20 @@
+// ***********************************************************
+// This example support/index.js is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
diff --git a/typescript-jsx-router-pinia-cypress/env.d.ts b/typescript-jsx-router-pinia-cypress/env.d.ts
new file mode 100644
index 00000000..11f02fe2
--- /dev/null
+++ b/typescript-jsx-router-pinia-cypress/env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/typescript-jsx-router-pinia-cypress/index.html b/typescript-jsx-router-pinia-cypress/index.html
new file mode 100644
index 00000000..11603f87
--- /dev/null
+++ b/typescript-jsx-router-pinia-cypress/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/typescript-jsx-router-pinia-cypress/package.json b/typescript-jsx-router-pinia-cypress/package.json
new file mode 100644
index 00000000..ccf1697e
--- /dev/null
+++ b/typescript-jsx-router-pinia-cypress/package.json
@@ -0,0 +1,34 @@
+{
+ "name": "typescript-jsx-router-pinia-cypress",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "run-p type-check build-only",
+ "preview": "vite preview --port 4173",
+ "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
+ "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'",
+ "test:unit": "cypress open --component",
+ "test:unit:ci": "cypress run --component --quiet --reporter spec",
+ "build-only": "vite build",
+ "type-check": "vue-tsc --noEmit"
+ },
+ "dependencies": {
+ "pinia": "^2.0.16",
+ "vue": "^2.7.7",
+ "vue-router": "^3.5.4"
+ },
+ "devDependencies": {
+ "@types/node": "^16.11.45",
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vitejs/plugin-vue2-jsx": "^1.0.2",
+ "@vue/tsconfig": "^0.1.3",
+ "cypress": "^10.3.0",
+ "npm-run-all": "^4.1.5",
+ "start-server-and-test": "^1.14.0",
+ "terser": "^5.14.2",
+ "typescript": "~4.7.4",
+ "vite": "^3.0.2",
+ "vue-tsc": "^0.38.8"
+ }
+}
diff --git a/typescript-jsx-router-pinia-cypress/public/favicon.ico b/typescript-jsx-router-pinia-cypress/public/favicon.ico
new file mode 100644
index 00000000..df36fcfb
Binary files /dev/null and b/typescript-jsx-router-pinia-cypress/public/favicon.ico differ
diff --git a/typescript-jsx-router-pinia-cypress/src/App.vue b/typescript-jsx-router-pinia-cypress/src/App.vue
new file mode 100644
index 00000000..2745f550
--- /dev/null
+++ b/typescript-jsx-router-pinia-cypress/src/App.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+ Home
+ About
+
+
+
+
+
+
+
+
+
diff --git a/typescript-jsx-router-pinia-cypress/src/assets/base.css b/typescript-jsx-router-pinia-cypress/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/typescript-jsx-router-pinia-cypress/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/typescript-jsx-router-pinia-cypress/src/assets/logo.svg b/typescript-jsx-router-pinia-cypress/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/typescript-jsx-router-pinia-cypress/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/typescript-jsx-router-pinia-cypress/src/assets/main.css b/typescript-jsx-router-pinia-cypress/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/typescript-jsx-router-pinia-cypress/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/typescript-jsx-router-pinia-cypress/src/components/HelloWorld.vue b/typescript-jsx-router-pinia-cypress/src/components/HelloWorld.vue
new file mode 100644
index 00000000..bf0a052f
--- /dev/null
+++ b/typescript-jsx-router-pinia-cypress/src/components/HelloWorld.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 . What's next?
+
+
+
+
+
diff --git a/typescript-jsx-router-pinia-cypress/src/components/TheWelcome.vue b/typescript-jsx-router-pinia-cypress/src/components/TheWelcome.vue
new file mode 100644
index 00000000..51d12392
--- /dev/null
+++ b/typescript-jsx-router-pinia-cypress/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/typescript-jsx-router-pinia-cypress/src/components/WelcomeItem.vue b/typescript-jsx-router-pinia-cypress/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/typescript-jsx-router-pinia-cypress/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/typescript-jsx-router-pinia-cypress/src/components/__tests__/HelloWorld.cy.ts b/typescript-jsx-router-pinia-cypress/src/components/__tests__/HelloWorld.cy.ts
new file mode 100644
index 00000000..0e0c065a
--- /dev/null
+++ b/typescript-jsx-router-pinia-cypress/src/components/__tests__/HelloWorld.cy.ts
@@ -0,0 +1,12 @@
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('playground', () => {
+ cy.mount(HelloWorld, { propsData: { msg: 'Hello Cypress' } })
+ })
+
+ it('renders properly', () => {
+ cy.mount(HelloWorld, { propsData: { msg: 'Hello Cypress' } })
+ cy.get('h1').should('contain', 'Hello Cypress')
+ })
+})
diff --git a/typescript-jsx-router-pinia-cypress/src/components/icons/IconCommunity.vue b/typescript-jsx-router-pinia-cypress/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/typescript-jsx-router-pinia-cypress/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-router-pinia-cypress/src/components/icons/IconDocumentation.vue b/typescript-jsx-router-pinia-cypress/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/typescript-jsx-router-pinia-cypress/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-router-pinia-cypress/src/components/icons/IconEcosystem.vue b/typescript-jsx-router-pinia-cypress/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/typescript-jsx-router-pinia-cypress/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-router-pinia-cypress/src/components/icons/IconSupport.vue b/typescript-jsx-router-pinia-cypress/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/typescript-jsx-router-pinia-cypress/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-router-pinia-cypress/src/components/icons/IconTooling.vue b/typescript-jsx-router-pinia-cypress/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/typescript-jsx-router-pinia-cypress/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/typescript-jsx-router-pinia-cypress/src/main.ts b/typescript-jsx-router-pinia-cypress/src/main.ts
new file mode 100644
index 00000000..e11e78e0
--- /dev/null
+++ b/typescript-jsx-router-pinia-cypress/src/main.ts
@@ -0,0 +1,15 @@
+import Vue from 'vue'
+import { createPinia, PiniaVuePlugin } from 'pinia'
+
+import App from './App.vue'
+import router from './router'
+
+import './assets/main.css'
+
+Vue.use(PiniaVuePlugin)
+
+new Vue({
+ router,
+ pinia: createPinia(),
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/typescript-jsx-router-pinia-cypress/src/router/index.ts b/typescript-jsx-router-pinia-cypress/src/router/index.ts
new file mode 100644
index 00000000..cf9820b0
--- /dev/null
+++ b/typescript-jsx-router-pinia-cypress/src/router/index.ts
@@ -0,0 +1,27 @@
+import Vue from 'vue'
+import VueRouter from 'vue-router'
+import HomeView from '../views/HomeView.vue'
+
+Vue.use(VueRouter)
+
+const router = new VueRouter({
+ mode: 'history',
+ base: import.meta.env.BASE_URL,
+ routes: [
+ {
+ path: '/',
+ name: 'home',
+ component: HomeView
+ },
+ {
+ path: '/about',
+ name: 'about',
+ // route level code-splitting
+ // this generates a separate chunk (About.[hash].js) for this route
+ // which is lazy-loaded when the route is visited.
+ component: () => import('../views/AboutView.vue')
+ }
+ ]
+})
+
+export default router
diff --git a/typescript-jsx-router-pinia-cypress/src/stores/counter.ts b/typescript-jsx-router-pinia-cypress/src/stores/counter.ts
new file mode 100644
index 00000000..4a2d2427
--- /dev/null
+++ b/typescript-jsx-router-pinia-cypress/src/stores/counter.ts
@@ -0,0 +1,16 @@
+import { defineStore } from 'pinia'
+
+export const useCounterStore = defineStore({
+ id: 'counter',
+ state: () => ({
+ counter: 0
+ }),
+ getters: {
+ doubleCount: (state) => state.counter * 2
+ },
+ actions: {
+ increment() {
+ this.counter++
+ }
+ }
+})
diff --git a/typescript-jsx-router-pinia-cypress/src/views/AboutView.vue b/typescript-jsx-router-pinia-cypress/src/views/AboutView.vue
new file mode 100644
index 00000000..756ad2a1
--- /dev/null
+++ b/typescript-jsx-router-pinia-cypress/src/views/AboutView.vue
@@ -0,0 +1,15 @@
+
+
+
This is an about page
+
+
+
+
diff --git a/typescript-jsx-router-pinia-cypress/src/views/HomeView.vue b/typescript-jsx-router-pinia-cypress/src/views/HomeView.vue
new file mode 100644
index 00000000..6555a646
--- /dev/null
+++ b/typescript-jsx-router-pinia-cypress/src/views/HomeView.vue
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/typescript-jsx-router-pinia-cypress/tsconfig.app.json b/typescript-jsx-router-pinia-cypress/tsconfig.app.json
new file mode 100644
index 00000000..cdbea1d7
--- /dev/null
+++ b/typescript-jsx-router-pinia-cypress/tsconfig.app.json
@@ -0,0 +1,12 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
+ "exclude": ["src/**/__tests__/*"],
+ "compilerOptions": {
+ "composite": true,
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ }
+}
diff --git a/typescript-jsx-router-pinia-cypress/tsconfig.config.json b/typescript-jsx-router-pinia-cypress/tsconfig.config.json
new file mode 100644
index 00000000..c2d3a309
--- /dev/null
+++ b/typescript-jsx-router-pinia-cypress/tsconfig.config.json
@@ -0,0 +1,8 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.node.json",
+ "include": ["vite.config.*", "vitest.config.*", "cypress.config.*"],
+ "compilerOptions": {
+ "composite": true,
+ "types": ["node"]
+ }
+}
diff --git a/typescript-jsx-router-pinia-cypress/tsconfig.cypress-ct.json b/typescript-jsx-router-pinia-cypress/tsconfig.cypress-ct.json
new file mode 100644
index 00000000..29cbaa47
--- /dev/null
+++ b/typescript-jsx-router-pinia-cypress/tsconfig.cypress-ct.json
@@ -0,0 +1,8 @@
+{
+ "extends": "./tsconfig.app.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue", "cypress/support/component.*"],
+ "exclude": [],
+ "compilerOptions": {
+ "composite": true
+ }
+}
diff --git a/typescript-jsx-router-pinia-cypress/tsconfig.json b/typescript-jsx-router-pinia-cypress/tsconfig.json
new file mode 100644
index 00000000..040665bb
--- /dev/null
+++ b/typescript-jsx-router-pinia-cypress/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "files": [],
+ "references": [
+ {
+ "path": "./tsconfig.config.json"
+ },
+ {
+ "path": "./tsconfig.app.json"
+ },
+ {
+ "path": "./tsconfig.cypress-ct.json"
+ }
+ ]
+}
diff --git a/typescript-jsx-router-pinia-cypress/vite.config.ts b/typescript-jsx-router-pinia-cypress/vite.config.ts
new file mode 100644
index 00000000..54d7440f
--- /dev/null
+++ b/typescript-jsx-router-pinia-cypress/vite.config.ts
@@ -0,0 +1,23 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+import vue2Jsx from '@vitejs/plugin-vue2-jsx'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ vue2Jsx(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/typescript-jsx-router-pinia-vitest-cypress/.gitignore b/typescript-jsx-router-pinia-vitest-cypress/.gitignore
new file mode 100644
index 00000000..133da84e
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest-cypress/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/typescript-jsx-router-pinia-vitest-cypress/README.md b/typescript-jsx-router-pinia-vitest-cypress/README.md
new file mode 100644
index 00000000..5c430d29
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest-cypress/README.md
@@ -0,0 +1,53 @@
+# typescript-jsx-router-pinia-vitest-cypress
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[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).
+
+## Type Support for `.vue` Imports in TS
+
+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.
+
+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:
+
+1. Disable the built-in TypeScript Extension
+ 1) Run `Extensions: Show Built-in Extensions` from VSCode's command palette
+ 2) Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)`
+2. Reload the VSCode window by running `Developer: Reload Window` from the command palette.
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Type-Check, Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Unit Tests with [Vitest](https://vitest.dev/)
+
+```sh
+pnpm test:unit
+```
+
+### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
+
+```sh
+pnpm build
+pnpm test:e2e # or `pnpm test:e2e:ci` for headless testing
+```
diff --git a/typescript-jsx-router-pinia-vitest-cypress/cypress.config.ts b/typescript-jsx-router-pinia-vitest-cypress/cypress.config.ts
new file mode 100644
index 00000000..0f66080f
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest-cypress/cypress.config.ts
@@ -0,0 +1,8 @@
+import { defineConfig } from 'cypress'
+
+export default defineConfig({
+ e2e: {
+ specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
+ baseUrl: 'http://localhost:4173/'
+ }
+})
diff --git a/typescript-jsx-router-pinia-vitest-cypress/cypress/e2e/example.cy.ts b/typescript-jsx-router-pinia-vitest-cypress/cypress/e2e/example.cy.ts
new file mode 100644
index 00000000..7a8c909f
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest-cypress/cypress/e2e/example.cy.ts
@@ -0,0 +1,8 @@
+// https://docs.cypress.io/api/introduction/api.html
+
+describe('My First Test', () => {
+ it('visits the app root url', () => {
+ cy.visit('/')
+ cy.contains('h1', 'You did it!')
+ })
+})
diff --git a/typescript-jsx-router-pinia-vitest-cypress/cypress/e2e/tsconfig.json b/typescript-jsx-router-pinia-vitest-cypress/cypress/e2e/tsconfig.json
new file mode 100644
index 00000000..be213aef
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest-cypress/cypress/e2e/tsconfig.json
@@ -0,0 +1,10 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["./**/*", "../support/**/*"],
+ "compilerOptions": {
+ "isolatedModules": false,
+ "target": "es5",
+ "lib": ["es5", "dom"],
+ "types": ["cypress"]
+ }
+}
diff --git a/typescript-jsx-router-pinia-vitest-cypress/cypress/fixtures/example.json b/typescript-jsx-router-pinia-vitest-cypress/cypress/fixtures/example.json
new file mode 100644
index 00000000..02e42543
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest-cypress/cypress/fixtures/example.json
@@ -0,0 +1,5 @@
+{
+ "name": "Using fixtures to represent data",
+ "email": "hello@cypress.io",
+ "body": "Fixtures are a great way to mock data for responses to routes"
+}
diff --git a/typescript-jsx-router-pinia-vitest-cypress/cypress/support/commands.ts b/typescript-jsx-router-pinia-vitest-cypress/cypress/support/commands.ts
new file mode 100644
index 00000000..95857aea
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest-cypress/cypress/support/commands.ts
@@ -0,0 +1,37 @@
+///
+// ***********************************************
+// This example commands.ts shows you how to
+// create various custom commands and overwrite
+// existing commands.
+//
+// For more comprehensive examples of custom
+// commands please read more here:
+// https://on.cypress.io/custom-commands
+// ***********************************************
+//
+//
+// -- This is a parent command --
+// Cypress.Commands.add('login', (email, password) => { ... })
+//
+//
+// -- This is a child command --
+// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
+//
+//
+// -- This is a dual command --
+// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
+//
+//
+// -- This will overwrite an existing command --
+// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
+//
+// declare global {
+// namespace Cypress {
+// interface Chainable {
+// login(email: string, password: string): Chainable
+// drag(subject: string, options?: Partial): Chainable
+// dismiss(subject: string, options?: Partial): Chainable
+// visit(originalFn: CommandOriginalFn, url: string, options: Partial): Chainable
+// }
+// }
+// }
diff --git a/typescript-jsx-router-pinia-vitest-cypress/cypress/support/e2e.ts b/typescript-jsx-router-pinia-vitest-cypress/cypress/support/e2e.ts
new file mode 100644
index 00000000..d68db96d
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest-cypress/cypress/support/e2e.ts
@@ -0,0 +1,20 @@
+// ***********************************************************
+// This example support/index.js is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
diff --git a/typescript-jsx-router-pinia-vitest-cypress/env.d.ts b/typescript-jsx-router-pinia-vitest-cypress/env.d.ts
new file mode 100644
index 00000000..11f02fe2
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest-cypress/env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/typescript-jsx-router-pinia-vitest-cypress/index.html b/typescript-jsx-router-pinia-vitest-cypress/index.html
new file mode 100644
index 00000000..11603f87
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest-cypress/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/typescript-jsx-router-pinia-vitest-cypress/package.json b/typescript-jsx-router-pinia-vitest-cypress/package.json
new file mode 100644
index 00000000..977d3606
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest-cypress/package.json
@@ -0,0 +1,38 @@
+{
+ "name": "typescript-jsx-router-pinia-vitest-cypress",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "run-p type-check build-only",
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom",
+ "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
+ "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'",
+ "build-only": "vite build",
+ "type-check": "vue-tsc --noEmit -p tsconfig.vitest.json --composite false"
+ },
+ "dependencies": {
+ "pinia": "^2.0.16",
+ "vue": "^2.7.7",
+ "vue-router": "^3.5.4"
+ },
+ "devDependencies": {
+ "@types/jsdom": "^16.2.14",
+ "@types/node": "^16.11.45",
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vitejs/plugin-vue2-jsx": "^1.0.2",
+ "@vue/test-utils": "^1.3.0",
+ "@vue/tsconfig": "^0.1.3",
+ "cypress": "^10.3.0",
+ "jsdom": "^20.0.0",
+ "npm-run-all": "^4.1.5",
+ "start-server-and-test": "^1.14.0",
+ "terser": "^5.14.2",
+ "typescript": "~4.7.4",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7",
+ "vue-tsc": "^0.38.8"
+ }
+}
diff --git a/typescript-jsx-router-pinia-vitest-cypress/public/favicon.ico b/typescript-jsx-router-pinia-vitest-cypress/public/favicon.ico
new file mode 100644
index 00000000..df36fcfb
Binary files /dev/null and b/typescript-jsx-router-pinia-vitest-cypress/public/favicon.ico differ
diff --git a/typescript-jsx-router-pinia-vitest-cypress/src/App.vue b/typescript-jsx-router-pinia-vitest-cypress/src/App.vue
new file mode 100644
index 00000000..2745f550
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest-cypress/src/App.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+ Home
+ About
+
+
+
+
+
+
+
+
+
diff --git a/typescript-jsx-router-pinia-vitest-cypress/src/assets/base.css b/typescript-jsx-router-pinia-vitest-cypress/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest-cypress/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/typescript-jsx-router-pinia-vitest-cypress/src/assets/logo.svg b/typescript-jsx-router-pinia-vitest-cypress/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest-cypress/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/typescript-jsx-router-pinia-vitest-cypress/src/assets/main.css b/typescript-jsx-router-pinia-vitest-cypress/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest-cypress/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/typescript-jsx-router-pinia-vitest-cypress/src/components/HelloWorld.vue b/typescript-jsx-router-pinia-vitest-cypress/src/components/HelloWorld.vue
new file mode 100644
index 00000000..bf0a052f
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest-cypress/src/components/HelloWorld.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 . What's next?
+
+
+
+
+
diff --git a/typescript-jsx-router-pinia-vitest-cypress/src/components/TheWelcome.vue b/typescript-jsx-router-pinia-vitest-cypress/src/components/TheWelcome.vue
new file mode 100644
index 00000000..51d12392
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest-cypress/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/typescript-jsx-router-pinia-vitest-cypress/src/components/WelcomeItem.vue b/typescript-jsx-router-pinia-vitest-cypress/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest-cypress/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/typescript-jsx-router-pinia-vitest-cypress/src/components/__tests__/HelloWorld.spec.ts b/typescript-jsx-router-pinia-vitest-cypress/src/components/__tests__/HelloWorld.spec.ts
new file mode 100644
index 00000000..293bf197
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest-cypress/src/components/__tests__/HelloWorld.spec.ts
@@ -0,0 +1,11 @@
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('renders properly', () => {
+ const wrapper = mount(HelloWorld, { propsData: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
+ })
+})
diff --git a/typescript-jsx-router-pinia-vitest-cypress/src/components/icons/IconCommunity.vue b/typescript-jsx-router-pinia-vitest-cypress/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest-cypress/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-router-pinia-vitest-cypress/src/components/icons/IconDocumentation.vue b/typescript-jsx-router-pinia-vitest-cypress/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest-cypress/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-router-pinia-vitest-cypress/src/components/icons/IconEcosystem.vue b/typescript-jsx-router-pinia-vitest-cypress/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest-cypress/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-router-pinia-vitest-cypress/src/components/icons/IconSupport.vue b/typescript-jsx-router-pinia-vitest-cypress/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest-cypress/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-router-pinia-vitest-cypress/src/components/icons/IconTooling.vue b/typescript-jsx-router-pinia-vitest-cypress/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest-cypress/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/typescript-jsx-router-pinia-vitest-cypress/src/main.ts b/typescript-jsx-router-pinia-vitest-cypress/src/main.ts
new file mode 100644
index 00000000..e11e78e0
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest-cypress/src/main.ts
@@ -0,0 +1,15 @@
+import Vue from 'vue'
+import { createPinia, PiniaVuePlugin } from 'pinia'
+
+import App from './App.vue'
+import router from './router'
+
+import './assets/main.css'
+
+Vue.use(PiniaVuePlugin)
+
+new Vue({
+ router,
+ pinia: createPinia(),
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/typescript-jsx-router-pinia-vitest-cypress/src/router/index.ts b/typescript-jsx-router-pinia-vitest-cypress/src/router/index.ts
new file mode 100644
index 00000000..cf9820b0
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest-cypress/src/router/index.ts
@@ -0,0 +1,27 @@
+import Vue from 'vue'
+import VueRouter from 'vue-router'
+import HomeView from '../views/HomeView.vue'
+
+Vue.use(VueRouter)
+
+const router = new VueRouter({
+ mode: 'history',
+ base: import.meta.env.BASE_URL,
+ routes: [
+ {
+ path: '/',
+ name: 'home',
+ component: HomeView
+ },
+ {
+ path: '/about',
+ name: 'about',
+ // route level code-splitting
+ // this generates a separate chunk (About.[hash].js) for this route
+ // which is lazy-loaded when the route is visited.
+ component: () => import('../views/AboutView.vue')
+ }
+ ]
+})
+
+export default router
diff --git a/typescript-jsx-router-pinia-vitest-cypress/src/stores/counter.ts b/typescript-jsx-router-pinia-vitest-cypress/src/stores/counter.ts
new file mode 100644
index 00000000..4a2d2427
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest-cypress/src/stores/counter.ts
@@ -0,0 +1,16 @@
+import { defineStore } from 'pinia'
+
+export const useCounterStore = defineStore({
+ id: 'counter',
+ state: () => ({
+ counter: 0
+ }),
+ getters: {
+ doubleCount: (state) => state.counter * 2
+ },
+ actions: {
+ increment() {
+ this.counter++
+ }
+ }
+})
diff --git a/typescript-jsx-router-pinia-vitest-cypress/src/views/AboutView.vue b/typescript-jsx-router-pinia-vitest-cypress/src/views/AboutView.vue
new file mode 100644
index 00000000..756ad2a1
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest-cypress/src/views/AboutView.vue
@@ -0,0 +1,15 @@
+
+
+
This is an about page
+
+
+
+
diff --git a/typescript-jsx-router-pinia-vitest-cypress/src/views/HomeView.vue b/typescript-jsx-router-pinia-vitest-cypress/src/views/HomeView.vue
new file mode 100644
index 00000000..6555a646
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest-cypress/src/views/HomeView.vue
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/typescript-jsx-router-pinia-vitest-cypress/tsconfig.app.json b/typescript-jsx-router-pinia-vitest-cypress/tsconfig.app.json
new file mode 100644
index 00000000..cdbea1d7
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest-cypress/tsconfig.app.json
@@ -0,0 +1,12 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
+ "exclude": ["src/**/__tests__/*"],
+ "compilerOptions": {
+ "composite": true,
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ }
+}
diff --git a/typescript-jsx-router-pinia-vitest-cypress/tsconfig.config.json b/typescript-jsx-router-pinia-vitest-cypress/tsconfig.config.json
new file mode 100644
index 00000000..c2d3a309
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest-cypress/tsconfig.config.json
@@ -0,0 +1,8 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.node.json",
+ "include": ["vite.config.*", "vitest.config.*", "cypress.config.*"],
+ "compilerOptions": {
+ "composite": true,
+ "types": ["node"]
+ }
+}
diff --git a/typescript-jsx-router-pinia-vitest-cypress/tsconfig.json b/typescript-jsx-router-pinia-vitest-cypress/tsconfig.json
new file mode 100644
index 00000000..31f90037
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest-cypress/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "files": [],
+ "references": [
+ {
+ "path": "./tsconfig.config.json"
+ },
+ {
+ "path": "./tsconfig.app.json"
+ },
+ {
+ "path": "./tsconfig.vitest.json"
+ }
+ ]
+}
diff --git a/typescript-jsx-router-pinia-vitest-cypress/tsconfig.vitest.json b/typescript-jsx-router-pinia-vitest-cypress/tsconfig.vitest.json
new file mode 100644
index 00000000..d080d611
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest-cypress/tsconfig.vitest.json
@@ -0,0 +1,9 @@
+{
+ "extends": "./tsconfig.app.json",
+ "exclude": [],
+ "compilerOptions": {
+ "composite": true,
+ "lib": [],
+ "types": ["node", "jsdom"]
+ }
+}
diff --git a/typescript-jsx-router-pinia-vitest-cypress/vite.config.ts b/typescript-jsx-router-pinia-vitest-cypress/vite.config.ts
new file mode 100644
index 00000000..54d7440f
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest-cypress/vite.config.ts
@@ -0,0 +1,23 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+import vue2Jsx from '@vitejs/plugin-vue2-jsx'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ vue2Jsx(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/typescript-jsx-router-pinia-vitest/.gitignore b/typescript-jsx-router-pinia-vitest/.gitignore
new file mode 100644
index 00000000..133da84e
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/typescript-jsx-router-pinia-vitest/README.md b/typescript-jsx-router-pinia-vitest/README.md
new file mode 100644
index 00000000..6561c331
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest/README.md
@@ -0,0 +1,46 @@
+# typescript-jsx-router-pinia-vitest
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[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).
+
+## Type Support for `.vue` Imports in TS
+
+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.
+
+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:
+
+1. Disable the built-in TypeScript Extension
+ 1) Run `Extensions: Show Built-in Extensions` from VSCode's command palette
+ 2) Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)`
+2. Reload the VSCode window by running `Developer: Reload Window` from the command palette.
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Type-Check, Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Unit Tests with [Vitest](https://vitest.dev/)
+
+```sh
+pnpm test:unit
+```
diff --git a/typescript-jsx-router-pinia-vitest/env.d.ts b/typescript-jsx-router-pinia-vitest/env.d.ts
new file mode 100644
index 00000000..11f02fe2
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest/env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/typescript-jsx-router-pinia-vitest/index.html b/typescript-jsx-router-pinia-vitest/index.html
new file mode 100644
index 00000000..11603f87
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/typescript-jsx-router-pinia-vitest/package.json b/typescript-jsx-router-pinia-vitest/package.json
new file mode 100644
index 00000000..72f9467c
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest/package.json
@@ -0,0 +1,34 @@
+{
+ "name": "typescript-jsx-router-pinia-vitest",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "run-p type-check build-only",
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom",
+ "build-only": "vite build",
+ "type-check": "vue-tsc --noEmit -p tsconfig.vitest.json --composite false"
+ },
+ "dependencies": {
+ "pinia": "^2.0.16",
+ "vue": "^2.7.7",
+ "vue-router": "^3.5.4"
+ },
+ "devDependencies": {
+ "@types/jsdom": "^16.2.14",
+ "@types/node": "^16.11.45",
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vitejs/plugin-vue2-jsx": "^1.0.2",
+ "@vue/test-utils": "^1.3.0",
+ "@vue/tsconfig": "^0.1.3",
+ "jsdom": "^20.0.0",
+ "npm-run-all": "^4.1.5",
+ "terser": "^5.14.2",
+ "typescript": "~4.7.4",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7",
+ "vue-tsc": "^0.38.8"
+ }
+}
diff --git a/typescript-jsx-router-pinia-vitest/public/favicon.ico b/typescript-jsx-router-pinia-vitest/public/favicon.ico
new file mode 100644
index 00000000..df36fcfb
Binary files /dev/null and b/typescript-jsx-router-pinia-vitest/public/favicon.ico differ
diff --git a/typescript-jsx-router-pinia-vitest/src/App.vue b/typescript-jsx-router-pinia-vitest/src/App.vue
new file mode 100644
index 00000000..2745f550
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest/src/App.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+ Home
+ About
+
+
+
+
+
+
+
+
+
diff --git a/typescript-jsx-router-pinia-vitest/src/assets/base.css b/typescript-jsx-router-pinia-vitest/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/typescript-jsx-router-pinia-vitest/src/assets/logo.svg b/typescript-jsx-router-pinia-vitest/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/typescript-jsx-router-pinia-vitest/src/assets/main.css b/typescript-jsx-router-pinia-vitest/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/typescript-jsx-router-pinia-vitest/src/components/HelloWorld.vue b/typescript-jsx-router-pinia-vitest/src/components/HelloWorld.vue
new file mode 100644
index 00000000..bf0a052f
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest/src/components/HelloWorld.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 . What's next?
+
+
+
+
+
diff --git a/typescript-jsx-router-pinia-vitest/src/components/TheWelcome.vue b/typescript-jsx-router-pinia-vitest/src/components/TheWelcome.vue
new file mode 100644
index 00000000..51d12392
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/typescript-jsx-router-pinia-vitest/src/components/WelcomeItem.vue b/typescript-jsx-router-pinia-vitest/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/typescript-jsx-router-pinia-vitest/src/components/__tests__/HelloWorld.spec.ts b/typescript-jsx-router-pinia-vitest/src/components/__tests__/HelloWorld.spec.ts
new file mode 100644
index 00000000..293bf197
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest/src/components/__tests__/HelloWorld.spec.ts
@@ -0,0 +1,11 @@
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('renders properly', () => {
+ const wrapper = mount(HelloWorld, { propsData: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
+ })
+})
diff --git a/typescript-jsx-router-pinia-vitest/src/components/icons/IconCommunity.vue b/typescript-jsx-router-pinia-vitest/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-router-pinia-vitest/src/components/icons/IconDocumentation.vue b/typescript-jsx-router-pinia-vitest/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-router-pinia-vitest/src/components/icons/IconEcosystem.vue b/typescript-jsx-router-pinia-vitest/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-router-pinia-vitest/src/components/icons/IconSupport.vue b/typescript-jsx-router-pinia-vitest/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-router-pinia-vitest/src/components/icons/IconTooling.vue b/typescript-jsx-router-pinia-vitest/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/typescript-jsx-router-pinia-vitest/src/main.ts b/typescript-jsx-router-pinia-vitest/src/main.ts
new file mode 100644
index 00000000..e11e78e0
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest/src/main.ts
@@ -0,0 +1,15 @@
+import Vue from 'vue'
+import { createPinia, PiniaVuePlugin } from 'pinia'
+
+import App from './App.vue'
+import router from './router'
+
+import './assets/main.css'
+
+Vue.use(PiniaVuePlugin)
+
+new Vue({
+ router,
+ pinia: createPinia(),
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/typescript-jsx-router-pinia-vitest/src/router/index.ts b/typescript-jsx-router-pinia-vitest/src/router/index.ts
new file mode 100644
index 00000000..cf9820b0
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest/src/router/index.ts
@@ -0,0 +1,27 @@
+import Vue from 'vue'
+import VueRouter from 'vue-router'
+import HomeView from '../views/HomeView.vue'
+
+Vue.use(VueRouter)
+
+const router = new VueRouter({
+ mode: 'history',
+ base: import.meta.env.BASE_URL,
+ routes: [
+ {
+ path: '/',
+ name: 'home',
+ component: HomeView
+ },
+ {
+ path: '/about',
+ name: 'about',
+ // route level code-splitting
+ // this generates a separate chunk (About.[hash].js) for this route
+ // which is lazy-loaded when the route is visited.
+ component: () => import('../views/AboutView.vue')
+ }
+ ]
+})
+
+export default router
diff --git a/typescript-jsx-router-pinia-vitest/src/stores/counter.ts b/typescript-jsx-router-pinia-vitest/src/stores/counter.ts
new file mode 100644
index 00000000..4a2d2427
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest/src/stores/counter.ts
@@ -0,0 +1,16 @@
+import { defineStore } from 'pinia'
+
+export const useCounterStore = defineStore({
+ id: 'counter',
+ state: () => ({
+ counter: 0
+ }),
+ getters: {
+ doubleCount: (state) => state.counter * 2
+ },
+ actions: {
+ increment() {
+ this.counter++
+ }
+ }
+})
diff --git a/typescript-jsx-router-pinia-vitest/src/views/AboutView.vue b/typescript-jsx-router-pinia-vitest/src/views/AboutView.vue
new file mode 100644
index 00000000..756ad2a1
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest/src/views/AboutView.vue
@@ -0,0 +1,15 @@
+
+
+
This is an about page
+
+
+
+
diff --git a/typescript-jsx-router-pinia-vitest/src/views/HomeView.vue b/typescript-jsx-router-pinia-vitest/src/views/HomeView.vue
new file mode 100644
index 00000000..6555a646
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest/src/views/HomeView.vue
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/typescript-jsx-router-pinia-vitest/tsconfig.app.json b/typescript-jsx-router-pinia-vitest/tsconfig.app.json
new file mode 100644
index 00000000..cdbea1d7
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest/tsconfig.app.json
@@ -0,0 +1,12 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
+ "exclude": ["src/**/__tests__/*"],
+ "compilerOptions": {
+ "composite": true,
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ }
+}
diff --git a/typescript-jsx-router-pinia-vitest/tsconfig.config.json b/typescript-jsx-router-pinia-vitest/tsconfig.config.json
new file mode 100644
index 00000000..c2d3a309
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest/tsconfig.config.json
@@ -0,0 +1,8 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.node.json",
+ "include": ["vite.config.*", "vitest.config.*", "cypress.config.*"],
+ "compilerOptions": {
+ "composite": true,
+ "types": ["node"]
+ }
+}
diff --git a/typescript-jsx-router-pinia-vitest/tsconfig.json b/typescript-jsx-router-pinia-vitest/tsconfig.json
new file mode 100644
index 00000000..31f90037
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "files": [],
+ "references": [
+ {
+ "path": "./tsconfig.config.json"
+ },
+ {
+ "path": "./tsconfig.app.json"
+ },
+ {
+ "path": "./tsconfig.vitest.json"
+ }
+ ]
+}
diff --git a/typescript-jsx-router-pinia-vitest/tsconfig.vitest.json b/typescript-jsx-router-pinia-vitest/tsconfig.vitest.json
new file mode 100644
index 00000000..d080d611
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest/tsconfig.vitest.json
@@ -0,0 +1,9 @@
+{
+ "extends": "./tsconfig.app.json",
+ "exclude": [],
+ "compilerOptions": {
+ "composite": true,
+ "lib": [],
+ "types": ["node", "jsdom"]
+ }
+}
diff --git a/typescript-jsx-router-pinia-vitest/vite.config.ts b/typescript-jsx-router-pinia-vitest/vite.config.ts
new file mode 100644
index 00000000..54d7440f
--- /dev/null
+++ b/typescript-jsx-router-pinia-vitest/vite.config.ts
@@ -0,0 +1,23 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+import vue2Jsx from '@vitejs/plugin-vue2-jsx'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ vue2Jsx(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/typescript-jsx-router-pinia-with-tests/README.md b/typescript-jsx-router-pinia-with-tests/README.md
index 4353bb53..37e8a5aa 100644
--- a/typescript-jsx-router-pinia-with-tests/README.md
+++ b/typescript-jsx-router-pinia-with-tests/README.md
@@ -4,13 +4,18 @@ This template should help get you started developing with Vue 3 in Vite.
## Recommended IDE Setup
-[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=johnsoncodehk.volar) (and disable Vetur).
+[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).
## Type Support for `.vue` Imports in TS
-Since TypeScript cannot handle type information for `.vue` imports, they are shimmed to be a generic Vue component type by default. In most cases this is fine if you don't really care about component prop types outside of templates.
+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.
-However, if you wish to get actual prop types in `.vue` imports (for example to get props validation when using manual `h(...)` calls), you can run `Volar: Switch TS Plugin on/off` from VSCode command palette.
+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:
+
+1. Disable the built-in TypeScript Extension
+ 1) Run `Extensions: Show Built-in Extensions` from VSCode's command palette
+ 2) Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)`
+2. Reload the VSCode window by running `Developer: Reload Window` from the command palette.
## Customize configuration
@@ -34,10 +39,10 @@ pnpm dev
pnpm build
```
-### Run Unit Tests with [Cypress Component Testing](https://docs.cypress.io/guides/component-testing/introduction)
+### Run Unit Tests with [Vitest](https://vitest.dev/)
```sh
-pnpm test:unit # or `pnpm test:unit:ci` for headless testing
+pnpm test:unit
```
### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
diff --git a/typescript-jsx-router-pinia-with-tests/cypress.config.ts b/typescript-jsx-router-pinia-with-tests/cypress.config.ts
new file mode 100644
index 00000000..0f66080f
--- /dev/null
+++ b/typescript-jsx-router-pinia-with-tests/cypress.config.ts
@@ -0,0 +1,8 @@
+import { defineConfig } from 'cypress'
+
+export default defineConfig({
+ e2e: {
+ specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
+ baseUrl: 'http://localhost:4173/'
+ }
+})
diff --git a/typescript-jsx-router-pinia-with-tests/cypress.json b/typescript-jsx-router-pinia-with-tests/cypress.json
deleted file mode 100644
index 3d372252..00000000
--- a/typescript-jsx-router-pinia-with-tests/cypress.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "baseUrl": "http://localhost:5050/",
- "component": {
- "componentFolder": "src",
- "testFiles": "**/__tests__/*.spec.{js,ts,jsx,tsx}"
- }
-}
diff --git a/typescript-jsx-router-pinia-with-tests/cypress/e2e/example.cy.ts b/typescript-jsx-router-pinia-with-tests/cypress/e2e/example.cy.ts
new file mode 100644
index 00000000..7a8c909f
--- /dev/null
+++ b/typescript-jsx-router-pinia-with-tests/cypress/e2e/example.cy.ts
@@ -0,0 +1,8 @@
+// https://docs.cypress.io/api/introduction/api.html
+
+describe('My First Test', () => {
+ it('visits the app root url', () => {
+ cy.visit('/')
+ cy.contains('h1', 'You did it!')
+ })
+})
diff --git a/typescript-jsx-router-pinia-with-tests/cypress/e2e/tsconfig.json b/typescript-jsx-router-pinia-with-tests/cypress/e2e/tsconfig.json
new file mode 100644
index 00000000..be213aef
--- /dev/null
+++ b/typescript-jsx-router-pinia-with-tests/cypress/e2e/tsconfig.json
@@ -0,0 +1,10 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["./**/*", "../support/**/*"],
+ "compilerOptions": {
+ "isolatedModules": false,
+ "target": "es5",
+ "lib": ["es5", "dom"],
+ "types": ["cypress"]
+ }
+}
diff --git a/typescript-jsx-router-pinia-with-tests/cypress/integration/example.spec.ts b/typescript-jsx-router-pinia-with-tests/cypress/integration/example.spec.ts
deleted file mode 100644
index 13a2922b..00000000
--- a/typescript-jsx-router-pinia-with-tests/cypress/integration/example.spec.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-// https://docs.cypress.io/api/introduction/api.html
-
-describe('My First Test', () => {
- it('visits the app root url', () => {
- cy.visit('/')
- cy.contains('h1', 'You did it!')
- })
-
- it('navigates to the about page', () => {
- cy.visit('/about')
- cy.contains('h1', 'This is an about page')
- })
-})
diff --git a/typescript-jsx-router-pinia-with-tests/cypress/plugins/index.ts b/typescript-jsx-router-pinia-with-tests/cypress/plugins/index.ts
deleted file mode 100644
index ad2e351d..00000000
--- a/typescript-jsx-router-pinia-with-tests/cypress/plugins/index.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-///
-// ***********************************************************
-// This example plugins/index.js can be used to load plugins
-//
-// You can change the location of this file or turn off loading
-// the plugins file with the 'pluginsFile' configuration option.
-//
-// You can read more here:
-// https://on.cypress.io/plugins-guide
-// ***********************************************************
-
-// This function is called when a project is opened or re-opened (e.g. due to
-// the project's config changing)
-
-const { startDevServer } = require('@cypress/vite-dev-server')
-
-/**
- * @type {Cypress.PluginConfig}
- */
-// eslint-disable-next-line no-unused-vars
-module.exports = (on, config) => {
- // `on` is used to hook into various events Cypress emits
- // `config` is the resolved Cypress config
- on('dev-server:start', (options) => {
- return startDevServer({ options })
- })
- return config
-}
diff --git a/typescript-jsx-router-pinia-with-tests/cypress/support/commands.ts b/typescript-jsx-router-pinia-with-tests/cypress/support/commands.ts
index 119ab03f..95857aea 100644
--- a/typescript-jsx-router-pinia-with-tests/cypress/support/commands.ts
+++ b/typescript-jsx-router-pinia-with-tests/cypress/support/commands.ts
@@ -1,5 +1,6 @@
+///
// ***********************************************
-// This example commands.js shows you how to
+// This example commands.ts shows you how to
// create various custom commands and overwrite
// existing commands.
//
@@ -23,3 +24,14 @@
//
// -- This will overwrite an existing command --
// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
+//
+// declare global {
+// namespace Cypress {
+// interface Chainable {
+// login(email: string, password: string): Chainable
+// drag(subject: string, options?: Partial): Chainable
+// dismiss(subject: string, options?: Partial): Chainable
+// visit(originalFn: CommandOriginalFn, url: string, options: Partial): Chainable
+// }
+// }
+// }
diff --git a/typescript-jsx-router-pinia-with-tests/cypress/support/e2e.ts b/typescript-jsx-router-pinia-with-tests/cypress/support/e2e.ts
new file mode 100644
index 00000000..d68db96d
--- /dev/null
+++ b/typescript-jsx-router-pinia-with-tests/cypress/support/e2e.ts
@@ -0,0 +1,20 @@
+// ***********************************************************
+// This example support/index.js is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
diff --git a/typescript-jsx-router-pinia-with-tests/cypress/tsconfig.json b/typescript-jsx-router-pinia-with-tests/cypress/tsconfig.json
deleted file mode 100644
index b5b2f972..00000000
--- a/typescript-jsx-router-pinia-with-tests/cypress/tsconfig.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "compilerOptions": {
- "target": "es5",
- "lib": ["es5", "dom"],
- "types": ["cypress"]
- },
- "include": ["./**/*"]
-}
diff --git a/typescript-jsx-router-pinia-with-tests/env.d.ts b/typescript-jsx-router-pinia-with-tests/env.d.ts
index 636d9c3f..11f02fe2 100644
--- a/typescript-jsx-router-pinia-with-tests/env.d.ts
+++ b/typescript-jsx-router-pinia-with-tests/env.d.ts
@@ -1,8 +1 @@
///
-
-declare module '*.vue' {
- import { DefineComponent } from 'vue'
- // eslint-disable-next-line
- const component: DefineComponent<{}, {}, any>
- export default component
-}
diff --git a/typescript-jsx-router-pinia-with-tests/package.json b/typescript-jsx-router-pinia-with-tests/package.json
index bf68ad2a..a7f7c18b 100644
--- a/typescript-jsx-router-pinia-with-tests/package.json
+++ b/typescript-jsx-router-pinia-with-tests/package.json
@@ -3,29 +3,36 @@
"version": "0.0.0",
"scripts": {
"dev": "vite",
- "build": "vue-tsc --noEmit && vite build",
- "preview": "vite preview --port 5050",
- "test:unit": "cypress open-ct",
- "test:unit:ci": "cypress run-ct --quiet --reporter spec",
- "test:e2e": "start-server-and-test preview http://127.0.0.1:5050/ 'cypress open'",
- "test:e2e:ci": "start-server-and-test preview http://127.0.0.1:5050/ 'cypress run'",
- "typecheck": "vue-tsc --noEmit"
+ "build": "run-p type-check build-only",
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom",
+ "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
+ "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'",
+ "build-only": "vite build",
+ "type-check": "vue-tsc --noEmit -p tsconfig.vitest.json --composite false"
},
"dependencies": {
- "pinia": "^2.0.4",
- "vue": "^3.2.22",
- "vue-router": "^4.0.12"
+ "pinia": "^2.0.16",
+ "vue": "^2.7.7",
+ "vue-router": "^3.5.4"
},
"devDependencies": {
- "@cypress/vite-dev-server": "^2.2.1",
- "@cypress/vue": "^3.0.5",
- "@types/node": "^16.11.10",
- "@vitejs/plugin-vue": "^1.10.0",
- "@vitejs/plugin-vue-jsx": "^1.3.0",
- "cypress": "^8.7.0",
+ "@types/jsdom": "^16.2.14",
+ "@types/node": "^16.11.45",
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vitejs/plugin-vue2-jsx": "^1.0.2",
+ "@vue/test-utils": "^1.3.0",
+ "@vue/tsconfig": "^0.1.3",
+ "cypress": "^10.3.0",
+ "jsdom": "^20.0.0",
+ "npm-run-all": "^4.1.5",
"start-server-and-test": "^1.14.0",
- "typescript": "~4.4.4",
- "vite": "^2.6.14",
- "vue-tsc": "^0.29.6"
+ "terser": "^5.14.2",
+ "typescript": "~4.7.4",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7",
+ "vue-tsc": "^0.38.8"
}
}
diff --git a/typescript-jsx-router-pinia-with-tests/src/App.vue b/typescript-jsx-router-pinia-with-tests/src/App.vue
index 8a1e9b19..2745f550 100644
--- a/typescript-jsx-router-pinia-with-tests/src/App.vue
+++ b/typescript-jsx-router-pinia-with-tests/src/App.vue
@@ -1,35 +1,27 @@
-
-
-
-
-
-
-
- Home
- About
-
-
-
-
-
+
+
+
+
+
+
+
+
+ Home
+ About
+
+
+
+
+
+
-
diff --git a/typescript-jsx-router-vitest-cypress/src/assets/base.css b/typescript-jsx-router-vitest-cypress/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/typescript-jsx-router-vitest-cypress/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/typescript-jsx-router-vitest-cypress/src/assets/logo.svg b/typescript-jsx-router-vitest-cypress/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/typescript-jsx-router-vitest-cypress/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/typescript-jsx-router-vitest-cypress/src/assets/main.css b/typescript-jsx-router-vitest-cypress/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/typescript-jsx-router-vitest-cypress/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/typescript-jsx-router-vitest-cypress/src/components/HelloWorld.vue b/typescript-jsx-router-vitest-cypress/src/components/HelloWorld.vue
new file mode 100644
index 00000000..bf0a052f
--- /dev/null
+++ b/typescript-jsx-router-vitest-cypress/src/components/HelloWorld.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 . What's next?
+
+
+
+
+
diff --git a/typescript-jsx-router-vitest-cypress/src/components/TheWelcome.vue b/typescript-jsx-router-vitest-cypress/src/components/TheWelcome.vue
new file mode 100644
index 00000000..51d12392
--- /dev/null
+++ b/typescript-jsx-router-vitest-cypress/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/typescript-jsx-router-vitest-cypress/src/components/WelcomeItem.vue b/typescript-jsx-router-vitest-cypress/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/typescript-jsx-router-vitest-cypress/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/typescript-jsx-router-vitest-cypress/src/components/__tests__/HelloWorld.spec.ts b/typescript-jsx-router-vitest-cypress/src/components/__tests__/HelloWorld.spec.ts
new file mode 100644
index 00000000..293bf197
--- /dev/null
+++ b/typescript-jsx-router-vitest-cypress/src/components/__tests__/HelloWorld.spec.ts
@@ -0,0 +1,11 @@
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('renders properly', () => {
+ const wrapper = mount(HelloWorld, { propsData: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
+ })
+})
diff --git a/typescript-jsx-router-vitest-cypress/src/components/icons/IconCommunity.vue b/typescript-jsx-router-vitest-cypress/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/typescript-jsx-router-vitest-cypress/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-router-vitest-cypress/src/components/icons/IconDocumentation.vue b/typescript-jsx-router-vitest-cypress/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/typescript-jsx-router-vitest-cypress/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-router-vitest-cypress/src/components/icons/IconEcosystem.vue b/typescript-jsx-router-vitest-cypress/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/typescript-jsx-router-vitest-cypress/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-router-vitest-cypress/src/components/icons/IconSupport.vue b/typescript-jsx-router-vitest-cypress/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/typescript-jsx-router-vitest-cypress/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-router-vitest-cypress/src/components/icons/IconTooling.vue b/typescript-jsx-router-vitest-cypress/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/typescript-jsx-router-vitest-cypress/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/typescript-jsx-router-vitest-cypress/src/main.ts b/typescript-jsx-router-vitest-cypress/src/main.ts
new file mode 100644
index 00000000..4919cf77
--- /dev/null
+++ b/typescript-jsx-router-vitest-cypress/src/main.ts
@@ -0,0 +1,11 @@
+import Vue from 'vue'
+
+import App from './App.vue'
+import router from './router'
+
+import './assets/main.css'
+
+new Vue({
+ router,
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/typescript-jsx-router-vitest-cypress/src/router/index.ts b/typescript-jsx-router-vitest-cypress/src/router/index.ts
new file mode 100644
index 00000000..cf9820b0
--- /dev/null
+++ b/typescript-jsx-router-vitest-cypress/src/router/index.ts
@@ -0,0 +1,27 @@
+import Vue from 'vue'
+import VueRouter from 'vue-router'
+import HomeView from '../views/HomeView.vue'
+
+Vue.use(VueRouter)
+
+const router = new VueRouter({
+ mode: 'history',
+ base: import.meta.env.BASE_URL,
+ routes: [
+ {
+ path: '/',
+ name: 'home',
+ component: HomeView
+ },
+ {
+ path: '/about',
+ name: 'about',
+ // route level code-splitting
+ // this generates a separate chunk (About.[hash].js) for this route
+ // which is lazy-loaded when the route is visited.
+ component: () => import('../views/AboutView.vue')
+ }
+ ]
+})
+
+export default router
diff --git a/typescript-jsx-router-vitest-cypress/src/views/AboutView.vue b/typescript-jsx-router-vitest-cypress/src/views/AboutView.vue
new file mode 100644
index 00000000..756ad2a1
--- /dev/null
+++ b/typescript-jsx-router-vitest-cypress/src/views/AboutView.vue
@@ -0,0 +1,15 @@
+
+
+
This is an about page
+
+
+
+
diff --git a/typescript-jsx-router-vitest-cypress/src/views/HomeView.vue b/typescript-jsx-router-vitest-cypress/src/views/HomeView.vue
new file mode 100644
index 00000000..6555a646
--- /dev/null
+++ b/typescript-jsx-router-vitest-cypress/src/views/HomeView.vue
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/typescript-jsx-router-vitest-cypress/tsconfig.app.json b/typescript-jsx-router-vitest-cypress/tsconfig.app.json
new file mode 100644
index 00000000..cdbea1d7
--- /dev/null
+++ b/typescript-jsx-router-vitest-cypress/tsconfig.app.json
@@ -0,0 +1,12 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
+ "exclude": ["src/**/__tests__/*"],
+ "compilerOptions": {
+ "composite": true,
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ }
+}
diff --git a/typescript-jsx-router-vitest-cypress/tsconfig.config.json b/typescript-jsx-router-vitest-cypress/tsconfig.config.json
new file mode 100644
index 00000000..c2d3a309
--- /dev/null
+++ b/typescript-jsx-router-vitest-cypress/tsconfig.config.json
@@ -0,0 +1,8 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.node.json",
+ "include": ["vite.config.*", "vitest.config.*", "cypress.config.*"],
+ "compilerOptions": {
+ "composite": true,
+ "types": ["node"]
+ }
+}
diff --git a/typescript-jsx-router-vitest-cypress/tsconfig.json b/typescript-jsx-router-vitest-cypress/tsconfig.json
new file mode 100644
index 00000000..31f90037
--- /dev/null
+++ b/typescript-jsx-router-vitest-cypress/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "files": [],
+ "references": [
+ {
+ "path": "./tsconfig.config.json"
+ },
+ {
+ "path": "./tsconfig.app.json"
+ },
+ {
+ "path": "./tsconfig.vitest.json"
+ }
+ ]
+}
diff --git a/typescript-jsx-router-vitest-cypress/tsconfig.vitest.json b/typescript-jsx-router-vitest-cypress/tsconfig.vitest.json
new file mode 100644
index 00000000..d080d611
--- /dev/null
+++ b/typescript-jsx-router-vitest-cypress/tsconfig.vitest.json
@@ -0,0 +1,9 @@
+{
+ "extends": "./tsconfig.app.json",
+ "exclude": [],
+ "compilerOptions": {
+ "composite": true,
+ "lib": [],
+ "types": ["node", "jsdom"]
+ }
+}
diff --git a/typescript-jsx-router-vitest-cypress/vite.config.ts b/typescript-jsx-router-vitest-cypress/vite.config.ts
new file mode 100644
index 00000000..54d7440f
--- /dev/null
+++ b/typescript-jsx-router-vitest-cypress/vite.config.ts
@@ -0,0 +1,23 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+import vue2Jsx from '@vitejs/plugin-vue2-jsx'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ vue2Jsx(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/typescript-jsx-router-vitest/.gitignore b/typescript-jsx-router-vitest/.gitignore
new file mode 100644
index 00000000..133da84e
--- /dev/null
+++ b/typescript-jsx-router-vitest/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/typescript-jsx-router-vitest/README.md b/typescript-jsx-router-vitest/README.md
new file mode 100644
index 00000000..51d21c67
--- /dev/null
+++ b/typescript-jsx-router-vitest/README.md
@@ -0,0 +1,46 @@
+# typescript-jsx-router-vitest
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[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).
+
+## Type Support for `.vue` Imports in TS
+
+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.
+
+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:
+
+1. Disable the built-in TypeScript Extension
+ 1) Run `Extensions: Show Built-in Extensions` from VSCode's command palette
+ 2) Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)`
+2. Reload the VSCode window by running `Developer: Reload Window` from the command palette.
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Type-Check, Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Unit Tests with [Vitest](https://vitest.dev/)
+
+```sh
+pnpm test:unit
+```
diff --git a/typescript-jsx-router-vitest/env.d.ts b/typescript-jsx-router-vitest/env.d.ts
new file mode 100644
index 00000000..11f02fe2
--- /dev/null
+++ b/typescript-jsx-router-vitest/env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/typescript-jsx-router-vitest/index.html b/typescript-jsx-router-vitest/index.html
new file mode 100644
index 00000000..11603f87
--- /dev/null
+++ b/typescript-jsx-router-vitest/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/typescript-jsx-router-vitest/package.json b/typescript-jsx-router-vitest/package.json
new file mode 100644
index 00000000..bf7fb40a
--- /dev/null
+++ b/typescript-jsx-router-vitest/package.json
@@ -0,0 +1,33 @@
+{
+ "name": "typescript-jsx-router-vitest",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "run-p type-check build-only",
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom",
+ "build-only": "vite build",
+ "type-check": "vue-tsc --noEmit -p tsconfig.vitest.json --composite false"
+ },
+ "dependencies": {
+ "vue": "^2.7.7",
+ "vue-router": "^3.5.4"
+ },
+ "devDependencies": {
+ "@types/jsdom": "^16.2.14",
+ "@types/node": "^16.11.45",
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vitejs/plugin-vue2-jsx": "^1.0.2",
+ "@vue/test-utils": "^1.3.0",
+ "@vue/tsconfig": "^0.1.3",
+ "jsdom": "^20.0.0",
+ "npm-run-all": "^4.1.5",
+ "terser": "^5.14.2",
+ "typescript": "~4.7.4",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7",
+ "vue-tsc": "^0.38.8"
+ }
+}
diff --git a/typescript-jsx-router-vitest/public/favicon.ico b/typescript-jsx-router-vitest/public/favicon.ico
new file mode 100644
index 00000000..df36fcfb
Binary files /dev/null and b/typescript-jsx-router-vitest/public/favicon.ico differ
diff --git a/typescript-jsx-router-vitest/src/App.vue b/typescript-jsx-router-vitest/src/App.vue
new file mode 100644
index 00000000..2745f550
--- /dev/null
+++ b/typescript-jsx-router-vitest/src/App.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+ Home
+ About
+
+
+
+
+
+
+
+
+
diff --git a/typescript-jsx-router-vitest/src/assets/base.css b/typescript-jsx-router-vitest/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/typescript-jsx-router-vitest/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/typescript-jsx-router-vitest/src/assets/logo.svg b/typescript-jsx-router-vitest/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/typescript-jsx-router-vitest/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/typescript-jsx-router-vitest/src/assets/main.css b/typescript-jsx-router-vitest/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/typescript-jsx-router-vitest/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/typescript-jsx-router-vitest/src/components/HelloWorld.vue b/typescript-jsx-router-vitest/src/components/HelloWorld.vue
new file mode 100644
index 00000000..bf0a052f
--- /dev/null
+++ b/typescript-jsx-router-vitest/src/components/HelloWorld.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 . What's next?
+
+
+
+
+
diff --git a/typescript-jsx-router-vitest/src/components/TheWelcome.vue b/typescript-jsx-router-vitest/src/components/TheWelcome.vue
new file mode 100644
index 00000000..51d12392
--- /dev/null
+++ b/typescript-jsx-router-vitest/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/typescript-jsx-router-vitest/src/components/WelcomeItem.vue b/typescript-jsx-router-vitest/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/typescript-jsx-router-vitest/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/typescript-jsx-router-vitest/src/components/__tests__/HelloWorld.spec.ts b/typescript-jsx-router-vitest/src/components/__tests__/HelloWorld.spec.ts
new file mode 100644
index 00000000..293bf197
--- /dev/null
+++ b/typescript-jsx-router-vitest/src/components/__tests__/HelloWorld.spec.ts
@@ -0,0 +1,11 @@
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('renders properly', () => {
+ const wrapper = mount(HelloWorld, { propsData: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
+ })
+})
diff --git a/typescript-jsx-router-vitest/src/components/icons/IconCommunity.vue b/typescript-jsx-router-vitest/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/typescript-jsx-router-vitest/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-router-vitest/src/components/icons/IconDocumentation.vue b/typescript-jsx-router-vitest/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/typescript-jsx-router-vitest/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-router-vitest/src/components/icons/IconEcosystem.vue b/typescript-jsx-router-vitest/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/typescript-jsx-router-vitest/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-router-vitest/src/components/icons/IconSupport.vue b/typescript-jsx-router-vitest/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/typescript-jsx-router-vitest/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-router-vitest/src/components/icons/IconTooling.vue b/typescript-jsx-router-vitest/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/typescript-jsx-router-vitest/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/typescript-jsx-router-vitest/src/main.ts b/typescript-jsx-router-vitest/src/main.ts
new file mode 100644
index 00000000..4919cf77
--- /dev/null
+++ b/typescript-jsx-router-vitest/src/main.ts
@@ -0,0 +1,11 @@
+import Vue from 'vue'
+
+import App from './App.vue'
+import router from './router'
+
+import './assets/main.css'
+
+new Vue({
+ router,
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/typescript-jsx-router-vitest/src/router/index.ts b/typescript-jsx-router-vitest/src/router/index.ts
new file mode 100644
index 00000000..cf9820b0
--- /dev/null
+++ b/typescript-jsx-router-vitest/src/router/index.ts
@@ -0,0 +1,27 @@
+import Vue from 'vue'
+import VueRouter from 'vue-router'
+import HomeView from '../views/HomeView.vue'
+
+Vue.use(VueRouter)
+
+const router = new VueRouter({
+ mode: 'history',
+ base: import.meta.env.BASE_URL,
+ routes: [
+ {
+ path: '/',
+ name: 'home',
+ component: HomeView
+ },
+ {
+ path: '/about',
+ name: 'about',
+ // route level code-splitting
+ // this generates a separate chunk (About.[hash].js) for this route
+ // which is lazy-loaded when the route is visited.
+ component: () => import('../views/AboutView.vue')
+ }
+ ]
+})
+
+export default router
diff --git a/typescript-jsx-router-vitest/src/views/AboutView.vue b/typescript-jsx-router-vitest/src/views/AboutView.vue
new file mode 100644
index 00000000..756ad2a1
--- /dev/null
+++ b/typescript-jsx-router-vitest/src/views/AboutView.vue
@@ -0,0 +1,15 @@
+
+
+
This is an about page
+
+
+
+
diff --git a/typescript-jsx-router-vitest/src/views/HomeView.vue b/typescript-jsx-router-vitest/src/views/HomeView.vue
new file mode 100644
index 00000000..6555a646
--- /dev/null
+++ b/typescript-jsx-router-vitest/src/views/HomeView.vue
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/typescript-jsx-router-vitest/tsconfig.app.json b/typescript-jsx-router-vitest/tsconfig.app.json
new file mode 100644
index 00000000..cdbea1d7
--- /dev/null
+++ b/typescript-jsx-router-vitest/tsconfig.app.json
@@ -0,0 +1,12 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
+ "exclude": ["src/**/__tests__/*"],
+ "compilerOptions": {
+ "composite": true,
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ }
+}
diff --git a/typescript-jsx-router-vitest/tsconfig.config.json b/typescript-jsx-router-vitest/tsconfig.config.json
new file mode 100644
index 00000000..c2d3a309
--- /dev/null
+++ b/typescript-jsx-router-vitest/tsconfig.config.json
@@ -0,0 +1,8 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.node.json",
+ "include": ["vite.config.*", "vitest.config.*", "cypress.config.*"],
+ "compilerOptions": {
+ "composite": true,
+ "types": ["node"]
+ }
+}
diff --git a/typescript-jsx-router-vitest/tsconfig.json b/typescript-jsx-router-vitest/tsconfig.json
new file mode 100644
index 00000000..31f90037
--- /dev/null
+++ b/typescript-jsx-router-vitest/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "files": [],
+ "references": [
+ {
+ "path": "./tsconfig.config.json"
+ },
+ {
+ "path": "./tsconfig.app.json"
+ },
+ {
+ "path": "./tsconfig.vitest.json"
+ }
+ ]
+}
diff --git a/typescript-jsx-router-vitest/tsconfig.vitest.json b/typescript-jsx-router-vitest/tsconfig.vitest.json
new file mode 100644
index 00000000..d080d611
--- /dev/null
+++ b/typescript-jsx-router-vitest/tsconfig.vitest.json
@@ -0,0 +1,9 @@
+{
+ "extends": "./tsconfig.app.json",
+ "exclude": [],
+ "compilerOptions": {
+ "composite": true,
+ "lib": [],
+ "types": ["node", "jsdom"]
+ }
+}
diff --git a/typescript-jsx-router-vitest/vite.config.ts b/typescript-jsx-router-vitest/vite.config.ts
new file mode 100644
index 00000000..54d7440f
--- /dev/null
+++ b/typescript-jsx-router-vitest/vite.config.ts
@@ -0,0 +1,23 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+import vue2Jsx from '@vitejs/plugin-vue2-jsx'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ vue2Jsx(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/typescript-jsx-router-with-tests/README.md b/typescript-jsx-router-with-tests/README.md
index d75a9773..79540e7d 100644
--- a/typescript-jsx-router-with-tests/README.md
+++ b/typescript-jsx-router-with-tests/README.md
@@ -4,13 +4,18 @@ This template should help get you started developing with Vue 3 in Vite.
## Recommended IDE Setup
-[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=johnsoncodehk.volar) (and disable Vetur).
+[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).
## Type Support for `.vue` Imports in TS
-Since TypeScript cannot handle type information for `.vue` imports, they are shimmed to be a generic Vue component type by default. In most cases this is fine if you don't really care about component prop types outside of templates.
+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.
-However, if you wish to get actual prop types in `.vue` imports (for example to get props validation when using manual `h(...)` calls), you can run `Volar: Switch TS Plugin on/off` from VSCode command palette.
+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:
+
+1. Disable the built-in TypeScript Extension
+ 1) Run `Extensions: Show Built-in Extensions` from VSCode's command palette
+ 2) Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)`
+2. Reload the VSCode window by running `Developer: Reload Window` from the command palette.
## Customize configuration
@@ -34,10 +39,10 @@ pnpm dev
pnpm build
```
-### Run Unit Tests with [Cypress Component Testing](https://docs.cypress.io/guides/component-testing/introduction)
+### Run Unit Tests with [Vitest](https://vitest.dev/)
```sh
-pnpm test:unit # or `pnpm test:unit:ci` for headless testing
+pnpm test:unit
```
### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
diff --git a/typescript-jsx-router-with-tests/cypress.config.ts b/typescript-jsx-router-with-tests/cypress.config.ts
new file mode 100644
index 00000000..0f66080f
--- /dev/null
+++ b/typescript-jsx-router-with-tests/cypress.config.ts
@@ -0,0 +1,8 @@
+import { defineConfig } from 'cypress'
+
+export default defineConfig({
+ e2e: {
+ specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
+ baseUrl: 'http://localhost:4173/'
+ }
+})
diff --git a/typescript-jsx-router-with-tests/cypress.json b/typescript-jsx-router-with-tests/cypress.json
deleted file mode 100644
index 3d372252..00000000
--- a/typescript-jsx-router-with-tests/cypress.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "baseUrl": "http://localhost:5050/",
- "component": {
- "componentFolder": "src",
- "testFiles": "**/__tests__/*.spec.{js,ts,jsx,tsx}"
- }
-}
diff --git a/typescript-jsx-router-with-tests/cypress/e2e/example.cy.ts b/typescript-jsx-router-with-tests/cypress/e2e/example.cy.ts
new file mode 100644
index 00000000..7a8c909f
--- /dev/null
+++ b/typescript-jsx-router-with-tests/cypress/e2e/example.cy.ts
@@ -0,0 +1,8 @@
+// https://docs.cypress.io/api/introduction/api.html
+
+describe('My First Test', () => {
+ it('visits the app root url', () => {
+ cy.visit('/')
+ cy.contains('h1', 'You did it!')
+ })
+})
diff --git a/typescript-jsx-router-with-tests/cypress/e2e/tsconfig.json b/typescript-jsx-router-with-tests/cypress/e2e/tsconfig.json
new file mode 100644
index 00000000..be213aef
--- /dev/null
+++ b/typescript-jsx-router-with-tests/cypress/e2e/tsconfig.json
@@ -0,0 +1,10 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["./**/*", "../support/**/*"],
+ "compilerOptions": {
+ "isolatedModules": false,
+ "target": "es5",
+ "lib": ["es5", "dom"],
+ "types": ["cypress"]
+ }
+}
diff --git a/typescript-jsx-router-with-tests/cypress/integration/example.spec.ts b/typescript-jsx-router-with-tests/cypress/integration/example.spec.ts
deleted file mode 100644
index 13a2922b..00000000
--- a/typescript-jsx-router-with-tests/cypress/integration/example.spec.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-// https://docs.cypress.io/api/introduction/api.html
-
-describe('My First Test', () => {
- it('visits the app root url', () => {
- cy.visit('/')
- cy.contains('h1', 'You did it!')
- })
-
- it('navigates to the about page', () => {
- cy.visit('/about')
- cy.contains('h1', 'This is an about page')
- })
-})
diff --git a/typescript-jsx-router-with-tests/cypress/plugins/index.ts b/typescript-jsx-router-with-tests/cypress/plugins/index.ts
deleted file mode 100644
index ad2e351d..00000000
--- a/typescript-jsx-router-with-tests/cypress/plugins/index.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-///
-// ***********************************************************
-// This example plugins/index.js can be used to load plugins
-//
-// You can change the location of this file or turn off loading
-// the plugins file with the 'pluginsFile' configuration option.
-//
-// You can read more here:
-// https://on.cypress.io/plugins-guide
-// ***********************************************************
-
-// This function is called when a project is opened or re-opened (e.g. due to
-// the project's config changing)
-
-const { startDevServer } = require('@cypress/vite-dev-server')
-
-/**
- * @type {Cypress.PluginConfig}
- */
-// eslint-disable-next-line no-unused-vars
-module.exports = (on, config) => {
- // `on` is used to hook into various events Cypress emits
- // `config` is the resolved Cypress config
- on('dev-server:start', (options) => {
- return startDevServer({ options })
- })
- return config
-}
diff --git a/typescript-jsx-router-with-tests/cypress/support/commands.ts b/typescript-jsx-router-with-tests/cypress/support/commands.ts
index 119ab03f..95857aea 100644
--- a/typescript-jsx-router-with-tests/cypress/support/commands.ts
+++ b/typescript-jsx-router-with-tests/cypress/support/commands.ts
@@ -1,5 +1,6 @@
+///
// ***********************************************
-// This example commands.js shows you how to
+// This example commands.ts shows you how to
// create various custom commands and overwrite
// existing commands.
//
@@ -23,3 +24,14 @@
//
// -- This will overwrite an existing command --
// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
+//
+// declare global {
+// namespace Cypress {
+// interface Chainable {
+// login(email: string, password: string): Chainable
+// drag(subject: string, options?: Partial): Chainable
+// dismiss(subject: string, options?: Partial): Chainable
+// visit(originalFn: CommandOriginalFn, url: string, options: Partial): Chainable
+// }
+// }
+// }
diff --git a/typescript-jsx-router-with-tests/cypress/support/e2e.ts b/typescript-jsx-router-with-tests/cypress/support/e2e.ts
new file mode 100644
index 00000000..d68db96d
--- /dev/null
+++ b/typescript-jsx-router-with-tests/cypress/support/e2e.ts
@@ -0,0 +1,20 @@
+// ***********************************************************
+// This example support/index.js is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
diff --git a/typescript-jsx-router-with-tests/cypress/tsconfig.json b/typescript-jsx-router-with-tests/cypress/tsconfig.json
deleted file mode 100644
index b5b2f972..00000000
--- a/typescript-jsx-router-with-tests/cypress/tsconfig.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "compilerOptions": {
- "target": "es5",
- "lib": ["es5", "dom"],
- "types": ["cypress"]
- },
- "include": ["./**/*"]
-}
diff --git a/typescript-jsx-router-with-tests/env.d.ts b/typescript-jsx-router-with-tests/env.d.ts
index 636d9c3f..11f02fe2 100644
--- a/typescript-jsx-router-with-tests/env.d.ts
+++ b/typescript-jsx-router-with-tests/env.d.ts
@@ -1,8 +1 @@
///
-
-declare module '*.vue' {
- import { DefineComponent } from 'vue'
- // eslint-disable-next-line
- const component: DefineComponent<{}, {}, any>
- export default component
-}
diff --git a/typescript-jsx-router-with-tests/package.json b/typescript-jsx-router-with-tests/package.json
index cc74af24..fed5fc30 100644
--- a/typescript-jsx-router-with-tests/package.json
+++ b/typescript-jsx-router-with-tests/package.json
@@ -3,28 +3,35 @@
"version": "0.0.0",
"scripts": {
"dev": "vite",
- "build": "vue-tsc --noEmit && vite build",
- "preview": "vite preview --port 5050",
- "test:unit": "cypress open-ct",
- "test:unit:ci": "cypress run-ct --quiet --reporter spec",
- "test:e2e": "start-server-and-test preview http://127.0.0.1:5050/ 'cypress open'",
- "test:e2e:ci": "start-server-and-test preview http://127.0.0.1:5050/ 'cypress run'",
- "typecheck": "vue-tsc --noEmit"
+ "build": "run-p type-check build-only",
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom",
+ "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
+ "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'",
+ "build-only": "vite build",
+ "type-check": "vue-tsc --noEmit -p tsconfig.vitest.json --composite false"
},
"dependencies": {
- "vue": "^3.2.22",
- "vue-router": "^4.0.12"
+ "vue": "^2.7.7",
+ "vue-router": "^3.5.4"
},
"devDependencies": {
- "@cypress/vite-dev-server": "^2.2.1",
- "@cypress/vue": "^3.0.5",
- "@types/node": "^16.11.10",
- "@vitejs/plugin-vue": "^1.10.0",
- "@vitejs/plugin-vue-jsx": "^1.3.0",
- "cypress": "^8.7.0",
+ "@types/jsdom": "^16.2.14",
+ "@types/node": "^16.11.45",
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vitejs/plugin-vue2-jsx": "^1.0.2",
+ "@vue/test-utils": "^1.3.0",
+ "@vue/tsconfig": "^0.1.3",
+ "cypress": "^10.3.0",
+ "jsdom": "^20.0.0",
+ "npm-run-all": "^4.1.5",
"start-server-and-test": "^1.14.0",
- "typescript": "~4.4.4",
- "vite": "^2.6.14",
- "vue-tsc": "^0.29.6"
+ "terser": "^5.14.2",
+ "typescript": "~4.7.4",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7",
+ "vue-tsc": "^0.38.8"
}
}
diff --git a/typescript-jsx-router-with-tests/src/App.vue b/typescript-jsx-router-with-tests/src/App.vue
index 8a1e9b19..2745f550 100644
--- a/typescript-jsx-router-with-tests/src/App.vue
+++ b/typescript-jsx-router-with-tests/src/App.vue
@@ -1,35 +1,27 @@
-
-
-
-
-
-
-
- Home
- About
-
-
-
-
-
+
+
+
+
+
+
+
+
+ Home
+ About
+
+
+
+
+
+
-
diff --git a/typescript-jsx-vitest-cypress/src/assets/base.css b/typescript-jsx-vitest-cypress/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/typescript-jsx-vitest-cypress/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/typescript-jsx-vitest-cypress/src/assets/logo.svg b/typescript-jsx-vitest-cypress/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/typescript-jsx-vitest-cypress/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/typescript-jsx-vitest-cypress/src/assets/main.css b/typescript-jsx-vitest-cypress/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/typescript-jsx-vitest-cypress/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/typescript-jsx-vitest-cypress/src/components/HelloWorld.vue b/typescript-jsx-vitest-cypress/src/components/HelloWorld.vue
new file mode 100644
index 00000000..624fb3e0
--- /dev/null
+++ b/typescript-jsx-vitest-cypress/src/components/HelloWorld.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 .
+
+
+
+
+
diff --git a/typescript-jsx-vitest-cypress/src/components/TheWelcome.vue b/typescript-jsx-vitest-cypress/src/components/TheWelcome.vue
new file mode 100644
index 00000000..51d12392
--- /dev/null
+++ b/typescript-jsx-vitest-cypress/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/typescript-jsx-vitest-cypress/src/components/WelcomeItem.vue b/typescript-jsx-vitest-cypress/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/typescript-jsx-vitest-cypress/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/typescript-jsx-vitest-cypress/src/components/__tests__/HelloWorld.spec.ts b/typescript-jsx-vitest-cypress/src/components/__tests__/HelloWorld.spec.ts
new file mode 100644
index 00000000..293bf197
--- /dev/null
+++ b/typescript-jsx-vitest-cypress/src/components/__tests__/HelloWorld.spec.ts
@@ -0,0 +1,11 @@
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('renders properly', () => {
+ const wrapper = mount(HelloWorld, { propsData: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
+ })
+})
diff --git a/typescript-jsx-vitest-cypress/src/components/icons/IconCommunity.vue b/typescript-jsx-vitest-cypress/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/typescript-jsx-vitest-cypress/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-vitest-cypress/src/components/icons/IconDocumentation.vue b/typescript-jsx-vitest-cypress/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/typescript-jsx-vitest-cypress/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-vitest-cypress/src/components/icons/IconEcosystem.vue b/typescript-jsx-vitest-cypress/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/typescript-jsx-vitest-cypress/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-vitest-cypress/src/components/icons/IconSupport.vue b/typescript-jsx-vitest-cypress/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/typescript-jsx-vitest-cypress/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-vitest-cypress/src/components/icons/IconTooling.vue b/typescript-jsx-vitest-cypress/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/typescript-jsx-vitest-cypress/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/typescript-jsx-vitest-cypress/src/main.ts b/typescript-jsx-vitest-cypress/src/main.ts
new file mode 100644
index 00000000..c5da47dc
--- /dev/null
+++ b/typescript-jsx-vitest-cypress/src/main.ts
@@ -0,0 +1,8 @@
+import Vue from 'vue'
+import App from './App.vue'
+
+import './assets/main.css'
+
+new Vue({
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/typescript-jsx-vitest-cypress/tsconfig.app.json b/typescript-jsx-vitest-cypress/tsconfig.app.json
new file mode 100644
index 00000000..cdbea1d7
--- /dev/null
+++ b/typescript-jsx-vitest-cypress/tsconfig.app.json
@@ -0,0 +1,12 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
+ "exclude": ["src/**/__tests__/*"],
+ "compilerOptions": {
+ "composite": true,
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ }
+}
diff --git a/typescript-jsx-vitest-cypress/tsconfig.config.json b/typescript-jsx-vitest-cypress/tsconfig.config.json
new file mode 100644
index 00000000..c2d3a309
--- /dev/null
+++ b/typescript-jsx-vitest-cypress/tsconfig.config.json
@@ -0,0 +1,8 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.node.json",
+ "include": ["vite.config.*", "vitest.config.*", "cypress.config.*"],
+ "compilerOptions": {
+ "composite": true,
+ "types": ["node"]
+ }
+}
diff --git a/typescript-jsx-vitest-cypress/tsconfig.json b/typescript-jsx-vitest-cypress/tsconfig.json
new file mode 100644
index 00000000..31f90037
--- /dev/null
+++ b/typescript-jsx-vitest-cypress/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "files": [],
+ "references": [
+ {
+ "path": "./tsconfig.config.json"
+ },
+ {
+ "path": "./tsconfig.app.json"
+ },
+ {
+ "path": "./tsconfig.vitest.json"
+ }
+ ]
+}
diff --git a/typescript-jsx-vitest-cypress/tsconfig.vitest.json b/typescript-jsx-vitest-cypress/tsconfig.vitest.json
new file mode 100644
index 00000000..d080d611
--- /dev/null
+++ b/typescript-jsx-vitest-cypress/tsconfig.vitest.json
@@ -0,0 +1,9 @@
+{
+ "extends": "./tsconfig.app.json",
+ "exclude": [],
+ "compilerOptions": {
+ "composite": true,
+ "lib": [],
+ "types": ["node", "jsdom"]
+ }
+}
diff --git a/typescript-jsx-vitest-cypress/vite.config.ts b/typescript-jsx-vitest-cypress/vite.config.ts
new file mode 100644
index 00000000..54d7440f
--- /dev/null
+++ b/typescript-jsx-vitest-cypress/vite.config.ts
@@ -0,0 +1,23 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+import vue2Jsx from '@vitejs/plugin-vue2-jsx'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ vue2Jsx(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/typescript-jsx-vitest/.gitignore b/typescript-jsx-vitest/.gitignore
new file mode 100644
index 00000000..133da84e
--- /dev/null
+++ b/typescript-jsx-vitest/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/typescript-jsx-vitest/README.md b/typescript-jsx-vitest/README.md
new file mode 100644
index 00000000..9c8e9f01
--- /dev/null
+++ b/typescript-jsx-vitest/README.md
@@ -0,0 +1,46 @@
+# typescript-jsx-vitest
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[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).
+
+## Type Support for `.vue` Imports in TS
+
+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.
+
+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:
+
+1. Disable the built-in TypeScript Extension
+ 1) Run `Extensions: Show Built-in Extensions` from VSCode's command palette
+ 2) Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)`
+2. Reload the VSCode window by running `Developer: Reload Window` from the command palette.
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Type-Check, Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Unit Tests with [Vitest](https://vitest.dev/)
+
+```sh
+pnpm test:unit
+```
diff --git a/typescript-jsx-vitest/env.d.ts b/typescript-jsx-vitest/env.d.ts
new file mode 100644
index 00000000..11f02fe2
--- /dev/null
+++ b/typescript-jsx-vitest/env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/typescript-jsx-vitest/index.html b/typescript-jsx-vitest/index.html
new file mode 100644
index 00000000..11603f87
--- /dev/null
+++ b/typescript-jsx-vitest/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/typescript-jsx-vitest/package.json b/typescript-jsx-vitest/package.json
new file mode 100644
index 00000000..bd0bcedf
--- /dev/null
+++ b/typescript-jsx-vitest/package.json
@@ -0,0 +1,32 @@
+{
+ "name": "typescript-jsx-vitest",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "run-p type-check build-only",
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom",
+ "build-only": "vite build",
+ "type-check": "vue-tsc --noEmit -p tsconfig.vitest.json --composite false"
+ },
+ "dependencies": {
+ "vue": "^2.7.7"
+ },
+ "devDependencies": {
+ "@types/jsdom": "^16.2.14",
+ "@types/node": "^16.11.45",
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vitejs/plugin-vue2-jsx": "^1.0.2",
+ "@vue/test-utils": "^1.3.0",
+ "@vue/tsconfig": "^0.1.3",
+ "jsdom": "^20.0.0",
+ "npm-run-all": "^4.1.5",
+ "terser": "^5.14.2",
+ "typescript": "~4.7.4",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7",
+ "vue-tsc": "^0.38.8"
+ }
+}
diff --git a/typescript-jsx-vitest/public/favicon.ico b/typescript-jsx-vitest/public/favicon.ico
new file mode 100644
index 00000000..df36fcfb
Binary files /dev/null and b/typescript-jsx-vitest/public/favicon.ico differ
diff --git a/typescript-jsx-vitest/src/App.vue b/typescript-jsx-vitest/src/App.vue
new file mode 100644
index 00000000..70c911b5
--- /dev/null
+++ b/typescript-jsx-vitest/src/App.vue
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/typescript-jsx-vitest/src/assets/base.css b/typescript-jsx-vitest/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/typescript-jsx-vitest/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/typescript-jsx-vitest/src/assets/logo.svg b/typescript-jsx-vitest/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/typescript-jsx-vitest/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/typescript-jsx-vitest/src/assets/main.css b/typescript-jsx-vitest/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/typescript-jsx-vitest/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/typescript-jsx-vitest/src/components/HelloWorld.vue b/typescript-jsx-vitest/src/components/HelloWorld.vue
new file mode 100644
index 00000000..624fb3e0
--- /dev/null
+++ b/typescript-jsx-vitest/src/components/HelloWorld.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 .
+
+
+
+
+
diff --git a/typescript-jsx-vitest/src/components/TheWelcome.vue b/typescript-jsx-vitest/src/components/TheWelcome.vue
new file mode 100644
index 00000000..51d12392
--- /dev/null
+++ b/typescript-jsx-vitest/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/typescript-jsx-vitest/src/components/WelcomeItem.vue b/typescript-jsx-vitest/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/typescript-jsx-vitest/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/typescript-jsx-vitest/src/components/__tests__/HelloWorld.spec.ts b/typescript-jsx-vitest/src/components/__tests__/HelloWorld.spec.ts
new file mode 100644
index 00000000..293bf197
--- /dev/null
+++ b/typescript-jsx-vitest/src/components/__tests__/HelloWorld.spec.ts
@@ -0,0 +1,11 @@
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('renders properly', () => {
+ const wrapper = mount(HelloWorld, { propsData: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
+ })
+})
diff --git a/typescript-jsx-vitest/src/components/icons/IconCommunity.vue b/typescript-jsx-vitest/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/typescript-jsx-vitest/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-vitest/src/components/icons/IconDocumentation.vue b/typescript-jsx-vitest/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/typescript-jsx-vitest/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-vitest/src/components/icons/IconEcosystem.vue b/typescript-jsx-vitest/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/typescript-jsx-vitest/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-vitest/src/components/icons/IconSupport.vue b/typescript-jsx-vitest/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/typescript-jsx-vitest/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-jsx-vitest/src/components/icons/IconTooling.vue b/typescript-jsx-vitest/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/typescript-jsx-vitest/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/typescript-jsx-vitest/src/main.ts b/typescript-jsx-vitest/src/main.ts
new file mode 100644
index 00000000..c5da47dc
--- /dev/null
+++ b/typescript-jsx-vitest/src/main.ts
@@ -0,0 +1,8 @@
+import Vue from 'vue'
+import App from './App.vue'
+
+import './assets/main.css'
+
+new Vue({
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/typescript-jsx-vitest/tsconfig.app.json b/typescript-jsx-vitest/tsconfig.app.json
new file mode 100644
index 00000000..cdbea1d7
--- /dev/null
+++ b/typescript-jsx-vitest/tsconfig.app.json
@@ -0,0 +1,12 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
+ "exclude": ["src/**/__tests__/*"],
+ "compilerOptions": {
+ "composite": true,
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ }
+}
diff --git a/typescript-jsx-vitest/tsconfig.config.json b/typescript-jsx-vitest/tsconfig.config.json
new file mode 100644
index 00000000..c2d3a309
--- /dev/null
+++ b/typescript-jsx-vitest/tsconfig.config.json
@@ -0,0 +1,8 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.node.json",
+ "include": ["vite.config.*", "vitest.config.*", "cypress.config.*"],
+ "compilerOptions": {
+ "composite": true,
+ "types": ["node"]
+ }
+}
diff --git a/typescript-jsx-vitest/tsconfig.json b/typescript-jsx-vitest/tsconfig.json
new file mode 100644
index 00000000..31f90037
--- /dev/null
+++ b/typescript-jsx-vitest/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "files": [],
+ "references": [
+ {
+ "path": "./tsconfig.config.json"
+ },
+ {
+ "path": "./tsconfig.app.json"
+ },
+ {
+ "path": "./tsconfig.vitest.json"
+ }
+ ]
+}
diff --git a/typescript-jsx-vitest/tsconfig.vitest.json b/typescript-jsx-vitest/tsconfig.vitest.json
new file mode 100644
index 00000000..d080d611
--- /dev/null
+++ b/typescript-jsx-vitest/tsconfig.vitest.json
@@ -0,0 +1,9 @@
+{
+ "extends": "./tsconfig.app.json",
+ "exclude": [],
+ "compilerOptions": {
+ "composite": true,
+ "lib": [],
+ "types": ["node", "jsdom"]
+ }
+}
diff --git a/typescript-jsx-vitest/vite.config.ts b/typescript-jsx-vitest/vite.config.ts
new file mode 100644
index 00000000..54d7440f
--- /dev/null
+++ b/typescript-jsx-vitest/vite.config.ts
@@ -0,0 +1,23 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+import vue2Jsx from '@vitejs/plugin-vue2-jsx'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ vue2Jsx(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/typescript-jsx-with-tests/README.md b/typescript-jsx-with-tests/README.md
index d6d8250f..3e211cac 100644
--- a/typescript-jsx-with-tests/README.md
+++ b/typescript-jsx-with-tests/README.md
@@ -4,13 +4,18 @@ This template should help get you started developing with Vue 3 in Vite.
## Recommended IDE Setup
-[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=johnsoncodehk.volar) (and disable Vetur).
+[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).
## Type Support for `.vue` Imports in TS
-Since TypeScript cannot handle type information for `.vue` imports, they are shimmed to be a generic Vue component type by default. In most cases this is fine if you don't really care about component prop types outside of templates.
+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.
-However, if you wish to get actual prop types in `.vue` imports (for example to get props validation when using manual `h(...)` calls), you can run `Volar: Switch TS Plugin on/off` from VSCode command palette.
+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:
+
+1. Disable the built-in TypeScript Extension
+ 1) Run `Extensions: Show Built-in Extensions` from VSCode's command palette
+ 2) Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)`
+2. Reload the VSCode window by running `Developer: Reload Window` from the command palette.
## Customize configuration
@@ -34,10 +39,10 @@ pnpm dev
pnpm build
```
-### Run Unit Tests with [Cypress Component Testing](https://docs.cypress.io/guides/component-testing/introduction)
+### Run Unit Tests with [Vitest](https://vitest.dev/)
```sh
-pnpm test:unit # or `pnpm test:unit:ci` for headless testing
+pnpm test:unit
```
### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
diff --git a/typescript-jsx-with-tests/cypress.config.ts b/typescript-jsx-with-tests/cypress.config.ts
new file mode 100644
index 00000000..0f66080f
--- /dev/null
+++ b/typescript-jsx-with-tests/cypress.config.ts
@@ -0,0 +1,8 @@
+import { defineConfig } from 'cypress'
+
+export default defineConfig({
+ e2e: {
+ specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
+ baseUrl: 'http://localhost:4173/'
+ }
+})
diff --git a/typescript-jsx-with-tests/cypress.json b/typescript-jsx-with-tests/cypress.json
deleted file mode 100644
index 3d372252..00000000
--- a/typescript-jsx-with-tests/cypress.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "baseUrl": "http://localhost:5050/",
- "component": {
- "componentFolder": "src",
- "testFiles": "**/__tests__/*.spec.{js,ts,jsx,tsx}"
- }
-}
diff --git a/typescript-jsx-with-tests/cypress/e2e/example.cy.ts b/typescript-jsx-with-tests/cypress/e2e/example.cy.ts
new file mode 100644
index 00000000..7a8c909f
--- /dev/null
+++ b/typescript-jsx-with-tests/cypress/e2e/example.cy.ts
@@ -0,0 +1,8 @@
+// https://docs.cypress.io/api/introduction/api.html
+
+describe('My First Test', () => {
+ it('visits the app root url', () => {
+ cy.visit('/')
+ cy.contains('h1', 'You did it!')
+ })
+})
diff --git a/typescript-jsx-with-tests/cypress/e2e/tsconfig.json b/typescript-jsx-with-tests/cypress/e2e/tsconfig.json
new file mode 100644
index 00000000..be213aef
--- /dev/null
+++ b/typescript-jsx-with-tests/cypress/e2e/tsconfig.json
@@ -0,0 +1,10 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["./**/*", "../support/**/*"],
+ "compilerOptions": {
+ "isolatedModules": false,
+ "target": "es5",
+ "lib": ["es5", "dom"],
+ "types": ["cypress"]
+ }
+}
diff --git a/typescript-jsx-with-tests/cypress/plugins/index.ts b/typescript-jsx-with-tests/cypress/plugins/index.ts
deleted file mode 100644
index ad2e351d..00000000
--- a/typescript-jsx-with-tests/cypress/plugins/index.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-///
-// ***********************************************************
-// This example plugins/index.js can be used to load plugins
-//
-// You can change the location of this file or turn off loading
-// the plugins file with the 'pluginsFile' configuration option.
-//
-// You can read more here:
-// https://on.cypress.io/plugins-guide
-// ***********************************************************
-
-// This function is called when a project is opened or re-opened (e.g. due to
-// the project's config changing)
-
-const { startDevServer } = require('@cypress/vite-dev-server')
-
-/**
- * @type {Cypress.PluginConfig}
- */
-// eslint-disable-next-line no-unused-vars
-module.exports = (on, config) => {
- // `on` is used to hook into various events Cypress emits
- // `config` is the resolved Cypress config
- on('dev-server:start', (options) => {
- return startDevServer({ options })
- })
- return config
-}
diff --git a/typescript-jsx-with-tests/cypress/support/commands.ts b/typescript-jsx-with-tests/cypress/support/commands.ts
index 119ab03f..95857aea 100644
--- a/typescript-jsx-with-tests/cypress/support/commands.ts
+++ b/typescript-jsx-with-tests/cypress/support/commands.ts
@@ -1,5 +1,6 @@
+///
// ***********************************************
-// This example commands.js shows you how to
+// This example commands.ts shows you how to
// create various custom commands and overwrite
// existing commands.
//
@@ -23,3 +24,14 @@
//
// -- This will overwrite an existing command --
// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
+//
+// declare global {
+// namespace Cypress {
+// interface Chainable {
+// login(email: string, password: string): Chainable
+// drag(subject: string, options?: Partial): Chainable
+// dismiss(subject: string, options?: Partial): Chainable
+// visit(originalFn: CommandOriginalFn, url: string, options: Partial): Chainable
+// }
+// }
+// }
diff --git a/typescript-jsx-with-tests/cypress/support/e2e.ts b/typescript-jsx-with-tests/cypress/support/e2e.ts
new file mode 100644
index 00000000..d68db96d
--- /dev/null
+++ b/typescript-jsx-with-tests/cypress/support/e2e.ts
@@ -0,0 +1,20 @@
+// ***********************************************************
+// This example support/index.js is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
diff --git a/typescript-jsx-with-tests/cypress/tsconfig.json b/typescript-jsx-with-tests/cypress/tsconfig.json
deleted file mode 100644
index b5b2f972..00000000
--- a/typescript-jsx-with-tests/cypress/tsconfig.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "compilerOptions": {
- "target": "es5",
- "lib": ["es5", "dom"],
- "types": ["cypress"]
- },
- "include": ["./**/*"]
-}
diff --git a/typescript-jsx-with-tests/env.d.ts b/typescript-jsx-with-tests/env.d.ts
index 636d9c3f..11f02fe2 100644
--- a/typescript-jsx-with-tests/env.d.ts
+++ b/typescript-jsx-with-tests/env.d.ts
@@ -1,8 +1 @@
///
-
-declare module '*.vue' {
- import { DefineComponent } from 'vue'
- // eslint-disable-next-line
- const component: DefineComponent<{}, {}, any>
- export default component
-}
diff --git a/typescript-jsx-with-tests/package.json b/typescript-jsx-with-tests/package.json
index 7c397df0..3bf7e6f2 100644
--- a/typescript-jsx-with-tests/package.json
+++ b/typescript-jsx-with-tests/package.json
@@ -3,27 +3,34 @@
"version": "0.0.0",
"scripts": {
"dev": "vite",
- "build": "vue-tsc --noEmit && vite build",
- "preview": "vite preview --port 5050",
- "test:unit": "cypress open-ct",
- "test:unit:ci": "cypress run-ct --quiet --reporter spec",
- "test:e2e": "start-server-and-test preview http://127.0.0.1:5050/ 'cypress open'",
- "test:e2e:ci": "start-server-and-test preview http://127.0.0.1:5050/ 'cypress run'",
- "typecheck": "vue-tsc --noEmit"
+ "build": "run-p type-check build-only",
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom",
+ "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
+ "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'",
+ "build-only": "vite build",
+ "type-check": "vue-tsc --noEmit -p tsconfig.vitest.json --composite false"
},
"dependencies": {
- "vue": "^3.2.22"
+ "vue": "^2.7.7"
},
"devDependencies": {
- "@cypress/vite-dev-server": "^2.2.1",
- "@cypress/vue": "^3.0.5",
- "@types/node": "^16.11.10",
- "@vitejs/plugin-vue": "^1.10.0",
- "@vitejs/plugin-vue-jsx": "^1.3.0",
- "cypress": "^8.7.0",
+ "@types/jsdom": "^16.2.14",
+ "@types/node": "^16.11.45",
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vitejs/plugin-vue2-jsx": "^1.0.2",
+ "@vue/test-utils": "^1.3.0",
+ "@vue/tsconfig": "^0.1.3",
+ "cypress": "^10.3.0",
+ "jsdom": "^20.0.0",
+ "npm-run-all": "^4.1.5",
"start-server-and-test": "^1.14.0",
- "typescript": "~4.4.4",
- "vite": "^2.6.14",
- "vue-tsc": "^0.29.6"
+ "terser": "^5.14.2",
+ "typescript": "~4.7.4",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7",
+ "vue-tsc": "^0.38.8"
}
}
diff --git a/typescript-jsx-with-tests/src/App.vue b/typescript-jsx-with-tests/src/App.vue
index d91eefc4..70c911b5 100644
--- a/typescript-jsx-with-tests/src/App.vue
+++ b/typescript-jsx-with-tests/src/App.vue
@@ -4,30 +4,22 @@ import TheWelcome from './components/TheWelcome.vue'
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/typescript-jsx-with-tests/src/assets/main.css b/typescript-jsx-with-tests/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/typescript-jsx-with-tests/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/typescript-jsx-with-tests/src/components/HelloWorld.vue b/typescript-jsx-with-tests/src/components/HelloWorld.vue
index 01118cd9..624fb3e0 100644
--- a/typescript-jsx-with-tests/src/components/HelloWorld.vue
+++ b/typescript-jsx-with-tests/src/components/HelloWorld.vue
@@ -10,7 +10,7 @@ defineProps<{
You’ve successfully created a project with
Vite +
- Vue 3 .
+ Vue 2 .
diff --git a/typescript-jsx-with-tests/src/components/TheWelcome.vue b/typescript-jsx-with-tests/src/components/TheWelcome.vue
index b91a8edd..51d12392 100644
--- a/typescript-jsx-with-tests/src/components/TheWelcome.vue
+++ b/typescript-jsx-with-tests/src/components/TheWelcome.vue
@@ -8,77 +8,79 @@ import SupportIcon from './icons/IconSupport.vue'
-
-
-
-
- Documentation
+
+
+
+
+
+ Documentation
- Vue’s
- official documentation
- provides you with all information you need to get started.
-
+ Vue’s
+
official documentation
+ provides you with all information you need to get started.
+
-
-
-
-
- Tooling
+
+
+
+
+ Tooling
- This project is served and bundled with
- Vite . The recommended IDE
- setup is VSCode +
- Volar . If you need to test
- your components and web pages, check out
- Cypress and
- Cypress Component Testing .
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
-
+
- More instructions are available in README.md
.
-
+ More instructions are available in README.md
.
+
-
-
-
-
- Ecosystem
+
+
+
+
+ Ecosystem
- Get official tools and libraries for your project:
- Vuex ,
- Vue Router ,
- Vue Test Utils , and
- Vue Dev Tools . If you need more
- resources, we suggest paying
- Awesome Vue
- a visit.
-
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
-
-
-
-
- Community
+
+
+
+
+ Community
- Got stuck? Ask your question on
- Vue Land , our official Discord server, or
- StackOverflow .
- You should also subscribe to
- our mailing list and follow the official
- @vuejs
- twitter account for latest news in the Vue world.
-
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
-
-
-
-
- Support Vue
+
+
+
+
+ Support Vue
- As an independent project, Vue relies on community backing for its sustainability. You can help
- us by
- becoming a sponsor .
-
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
diff --git a/typescript-jsx-with-tests/src/components/__tests__/HelloWorld.spec.ts b/typescript-jsx-with-tests/src/components/__tests__/HelloWorld.spec.ts
index a69f3a9d..293bf197 100644
--- a/typescript-jsx-with-tests/src/components/__tests__/HelloWorld.spec.ts
+++ b/typescript-jsx-with-tests/src/components/__tests__/HelloWorld.spec.ts
@@ -1,13 +1,11 @@
-import { mount } from '@cypress/vue'
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
import HelloWorld from '../HelloWorld.vue'
describe('HelloWorld', () => {
- it('playground', () => {
- mount(HelloWorld, { props: { msg: 'Hello Cypress' } })
- })
-
it('renders properly', () => {
- mount(HelloWorld, { props: { msg: 'Hello Cypress' } })
- cy.get('h1').should('contain', 'Hello Cypress')
+ const wrapper = mount(HelloWorld, { propsData: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
})
})
diff --git a/typescript-jsx-with-tests/src/components/icons/IconTooling.vue b/typescript-jsx-with-tests/src/components/icons/IconTooling.vue
index 660598d7..07dc46b0 100644
--- a/typescript-jsx-with-tests/src/components/icons/IconTooling.vue
+++ b/typescript-jsx-with-tests/src/components/icons/IconTooling.vue
@@ -2,8 +2,6 @@
h(App)
+}).$mount('#app')
diff --git a/typescript-jsx-with-tests/tsconfig.app.json b/typescript-jsx-with-tests/tsconfig.app.json
new file mode 100644
index 00000000..cdbea1d7
--- /dev/null
+++ b/typescript-jsx-with-tests/tsconfig.app.json
@@ -0,0 +1,12 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
+ "exclude": ["src/**/__tests__/*"],
+ "compilerOptions": {
+ "composite": true,
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ }
+}
diff --git a/typescript-jsx-with-tests/tsconfig.config.json b/typescript-jsx-with-tests/tsconfig.config.json
new file mode 100644
index 00000000..c2d3a309
--- /dev/null
+++ b/typescript-jsx-with-tests/tsconfig.config.json
@@ -0,0 +1,8 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.node.json",
+ "include": ["vite.config.*", "vitest.config.*", "cypress.config.*"],
+ "compilerOptions": {
+ "composite": true,
+ "types": ["node"]
+ }
+}
diff --git a/typescript-jsx-with-tests/tsconfig.json b/typescript-jsx-with-tests/tsconfig.json
index 8c707192..31f90037 100644
--- a/typescript-jsx-with-tests/tsconfig.json
+++ b/typescript-jsx-with-tests/tsconfig.json
@@ -1,21 +1,14 @@
{
- "compilerOptions": {
- "baseUrl": "./",
- "target": "esnext",
- "useDefineForClassFields": true,
- "module": "esnext",
- "moduleResolution": "node",
- "isolatedModules": true,
- "strict": true,
- "jsx": "preserve",
- "sourceMap": true,
- "resolveJsonModule": true,
- "esModuleInterop": true,
- "paths": {
- "@/*": ["src/*"]
+ "files": [],
+ "references": [
+ {
+ "path": "./tsconfig.config.json"
},
- "lib": ["esnext", "dom", "dom.iterable", "scripthost"],
- "skipLibCheck": true
- },
- "include": ["vite.config.*", "env.d.ts", "src/**/*", "src/**/*.vue"]
+ {
+ "path": "./tsconfig.app.json"
+ },
+ {
+ "path": "./tsconfig.vitest.json"
+ }
+ ]
}
diff --git a/typescript-jsx-with-tests/tsconfig.vitest.json b/typescript-jsx-with-tests/tsconfig.vitest.json
new file mode 100644
index 00000000..d080d611
--- /dev/null
+++ b/typescript-jsx-with-tests/tsconfig.vitest.json
@@ -0,0 +1,9 @@
+{
+ "extends": "./tsconfig.app.json",
+ "exclude": [],
+ "compilerOptions": {
+ "composite": true,
+ "lib": [],
+ "types": ["node", "jsdom"]
+ }
+}
diff --git a/typescript-jsx-with-tests/vite.config.ts b/typescript-jsx-with-tests/vite.config.ts
index f140f276..54d7440f 100644
--- a/typescript-jsx-with-tests/vite.config.ts
+++ b/typescript-jsx-with-tests/vite.config.ts
@@ -1,12 +1,20 @@
-import { fileURLToPath } from 'url'
+import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vite'
-import vue from '@vitejs/plugin-vue'
-import vueJsx from '@vitejs/plugin-vue-jsx'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+import vue2Jsx from '@vitejs/plugin-vue2-jsx'
// https://vitejs.dev/config/
export default defineConfig({
- plugins: [vue(), vueJsx()],
+ plugins: [
+ vue2(),
+ vue2Jsx(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
diff --git a/typescript-jsx/README.md b/typescript-jsx/README.md
index 0b75eadb..09436e2e 100644
--- a/typescript-jsx/README.md
+++ b/typescript-jsx/README.md
@@ -4,13 +4,18 @@ This template should help get you started developing with Vue 3 in Vite.
## Recommended IDE Setup
-[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=johnsoncodehk.volar) (and disable Vetur).
+[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).
## Type Support for `.vue` Imports in TS
-Since TypeScript cannot handle type information for `.vue` imports, they are shimmed to be a generic Vue component type by default. In most cases this is fine if you don't really care about component prop types outside of templates.
+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.
-However, if you wish to get actual prop types in `.vue` imports (for example to get props validation when using manual `h(...)` calls), you can run `Volar: Switch TS Plugin on/off` from VSCode command palette.
+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:
+
+1. Disable the built-in TypeScript Extension
+ 1) Run `Extensions: Show Built-in Extensions` from VSCode's command palette
+ 2) Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)`
+2. Reload the VSCode window by running `Developer: Reload Window` from the command palette.
## Customize configuration
diff --git a/typescript-jsx/env.d.ts b/typescript-jsx/env.d.ts
index 636d9c3f..11f02fe2 100644
--- a/typescript-jsx/env.d.ts
+++ b/typescript-jsx/env.d.ts
@@ -1,8 +1 @@
///
-
-declare module '*.vue' {
- import { DefineComponent } from 'vue'
- // eslint-disable-next-line
- const component: DefineComponent<{}, {}, any>
- export default component
-}
diff --git a/typescript-jsx/package.json b/typescript-jsx/package.json
index 54f115c4..5ea8a3b8 100644
--- a/typescript-jsx/package.json
+++ b/typescript-jsx/package.json
@@ -3,19 +3,24 @@
"version": "0.0.0",
"scripts": {
"dev": "vite",
- "build": "vue-tsc --noEmit && vite build",
- "preview": "vite preview --port 5050",
- "typecheck": "vue-tsc --noEmit"
+ "build": "run-p type-check build-only",
+ "preview": "vite preview --port 4173",
+ "build-only": "vite build",
+ "type-check": "vue-tsc --noEmit"
},
"dependencies": {
- "vue": "^3.2.22"
+ "vue": "^2.7.7"
},
"devDependencies": {
- "@types/node": "^16.11.10",
- "@vitejs/plugin-vue": "^1.10.0",
- "@vitejs/plugin-vue-jsx": "^1.3.0",
- "typescript": "~4.4.4",
- "vite": "^2.6.14",
- "vue-tsc": "^0.29.6"
+ "@types/node": "^16.11.45",
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vitejs/plugin-vue2-jsx": "^1.0.2",
+ "@vue/tsconfig": "^0.1.3",
+ "npm-run-all": "^4.1.5",
+ "terser": "^5.14.2",
+ "typescript": "~4.7.4",
+ "vite": "^3.0.2",
+ "vue-tsc": "^0.38.8"
}
}
diff --git a/typescript-jsx/src/App.vue b/typescript-jsx/src/App.vue
index d91eefc4..70c911b5 100644
--- a/typescript-jsx/src/App.vue
+++ b/typescript-jsx/src/App.vue
@@ -4,30 +4,22 @@ import TheWelcome from './components/TheWelcome.vue'
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/typescript-jsx/src/assets/main.css b/typescript-jsx/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/typescript-jsx/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/typescript-jsx/src/components/HelloWorld.vue b/typescript-jsx/src/components/HelloWorld.vue
index 01118cd9..624fb3e0 100644
--- a/typescript-jsx/src/components/HelloWorld.vue
+++ b/typescript-jsx/src/components/HelloWorld.vue
@@ -10,7 +10,7 @@ defineProps<{
You’ve successfully created a project with
Vite +
- Vue 3 .
+ Vue 2 .
diff --git a/typescript-jsx/src/components/TheWelcome.vue b/typescript-jsx/src/components/TheWelcome.vue
index b91a8edd..51d12392 100644
--- a/typescript-jsx/src/components/TheWelcome.vue
+++ b/typescript-jsx/src/components/TheWelcome.vue
@@ -8,77 +8,79 @@ import SupportIcon from './icons/IconSupport.vue'
-
-
-
-
- Documentation
+
+
+
+
+
+ Documentation
- Vue’s
- official documentation
- provides you with all information you need to get started.
-
+ Vue’s
+
official documentation
+ provides you with all information you need to get started.
+
-
-
-
-
- Tooling
+
+
+
+
+ Tooling
- This project is served and bundled with
- Vite . The recommended IDE
- setup is VSCode +
- Volar . If you need to test
- your components and web pages, check out
- Cypress and
- Cypress Component Testing .
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
-
+
- More instructions are available in README.md
.
-
+ More instructions are available in README.md
.
+
-
-
-
-
- Ecosystem
+
+
+
+
+ Ecosystem
- Get official tools and libraries for your project:
- Vuex ,
- Vue Router ,
- Vue Test Utils , and
- Vue Dev Tools . If you need more
- resources, we suggest paying
- Awesome Vue
- a visit.
-
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
-
-
-
-
- Community
+
+
+
+
+ Community
- Got stuck? Ask your question on
- Vue Land , our official Discord server, or
- StackOverflow .
- You should also subscribe to
- our mailing list and follow the official
- @vuejs
- twitter account for latest news in the Vue world.
-
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
-
-
-
-
- Support Vue
+
+
+
+
+ Support Vue
- As an independent project, Vue relies on community backing for its sustainability. You can help
- us by
- becoming a sponsor .
-
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
diff --git a/typescript-jsx/src/components/icons/IconTooling.vue b/typescript-jsx/src/components/icons/IconTooling.vue
index 660598d7..07dc46b0 100644
--- a/typescript-jsx/src/components/icons/IconTooling.vue
+++ b/typescript-jsx/src/components/icons/IconTooling.vue
@@ -2,8 +2,6 @@
h(App)
+}).$mount('#app')
diff --git a/typescript-jsx/tsconfig.config.json b/typescript-jsx/tsconfig.config.json
new file mode 100644
index 00000000..c2d3a309
--- /dev/null
+++ b/typescript-jsx/tsconfig.config.json
@@ -0,0 +1,8 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.node.json",
+ "include": ["vite.config.*", "vitest.config.*", "cypress.config.*"],
+ "compilerOptions": {
+ "composite": true,
+ "types": ["node"]
+ }
+}
diff --git a/typescript-jsx/tsconfig.json b/typescript-jsx/tsconfig.json
index 8c707192..8d235999 100644
--- a/typescript-jsx/tsconfig.json
+++ b/typescript-jsx/tsconfig.json
@@ -1,21 +1,16 @@
{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
"compilerOptions": {
- "baseUrl": "./",
- "target": "esnext",
- "useDefineForClassFields": true,
- "module": "esnext",
- "moduleResolution": "node",
- "isolatedModules": true,
- "strict": true,
- "jsx": "preserve",
- "sourceMap": true,
- "resolveJsonModule": true,
- "esModuleInterop": true,
+ "baseUrl": ".",
"paths": {
- "@/*": ["src/*"]
- },
- "lib": ["esnext", "dom", "dom.iterable", "scripthost"],
- "skipLibCheck": true
+ "@/*": ["./src/*"]
+ }
},
- "include": ["vite.config.*", "env.d.ts", "src/**/*", "src/**/*.vue"]
+
+ "references": [
+ {
+ "path": "./tsconfig.config.json"
+ }
+ ]
}
diff --git a/typescript-jsx/vite.config.ts b/typescript-jsx/vite.config.ts
index f140f276..54d7440f 100644
--- a/typescript-jsx/vite.config.ts
+++ b/typescript-jsx/vite.config.ts
@@ -1,12 +1,20 @@
-import { fileURLToPath } from 'url'
+import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vite'
-import vue from '@vitejs/plugin-vue'
-import vueJsx from '@vitejs/plugin-vue-jsx'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+import vue2Jsx from '@vitejs/plugin-vue2-jsx'
// https://vitejs.dev/config/
export default defineConfig({
- plugins: [vue(), vueJsx()],
+ plugins: [
+ vue2(),
+ vue2Jsx(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
diff --git a/typescript-pinia-cypress/.gitignore b/typescript-pinia-cypress/.gitignore
new file mode 100644
index 00000000..133da84e
--- /dev/null
+++ b/typescript-pinia-cypress/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/typescript-pinia-cypress/README.md b/typescript-pinia-cypress/README.md
new file mode 100644
index 00000000..961e41ac
--- /dev/null
+++ b/typescript-pinia-cypress/README.md
@@ -0,0 +1,53 @@
+# typescript-pinia-cypress
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[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).
+
+## Type Support for `.vue` Imports in TS
+
+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.
+
+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:
+
+1. Disable the built-in TypeScript Extension
+ 1) Run `Extensions: Show Built-in Extensions` from VSCode's command palette
+ 2) Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)`
+2. Reload the VSCode window by running `Developer: Reload Window` from the command palette.
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Type-Check, Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Headed Component Tests with [Cypress Component Testing](https://on.cypress.io/component)
+
+```sh
+pnpm test:unit # or `pnpm test:unit:ci` for headless testing
+```
+
+### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
+
+```sh
+pnpm build
+pnpm test:e2e # or `pnpm test:e2e:ci` for headless testing
+```
diff --git a/typescript-pinia-cypress/cypress.config.ts b/typescript-pinia-cypress/cypress.config.ts
new file mode 100644
index 00000000..c8fac129
--- /dev/null
+++ b/typescript-pinia-cypress/cypress.config.ts
@@ -0,0 +1,15 @@
+import { defineConfig } from 'cypress'
+
+export default defineConfig({
+ e2e: {
+ specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
+ baseUrl: 'http://localhost:4173/'
+ },
+ component: {
+ specPattern: 'src/**/__tests__/*.{cy,spec}.{js,ts,jsx,tsx}',
+ devServer: {
+ framework: 'vue',
+ bundler: 'vite'
+ }
+ }
+})
diff --git a/typescript-pinia-cypress/cypress/e2e/example.cy.ts b/typescript-pinia-cypress/cypress/e2e/example.cy.ts
new file mode 100644
index 00000000..7a8c909f
--- /dev/null
+++ b/typescript-pinia-cypress/cypress/e2e/example.cy.ts
@@ -0,0 +1,8 @@
+// https://docs.cypress.io/api/introduction/api.html
+
+describe('My First Test', () => {
+ it('visits the app root url', () => {
+ cy.visit('/')
+ cy.contains('h1', 'You did it!')
+ })
+})
diff --git a/typescript-pinia-cypress/cypress/e2e/tsconfig.json b/typescript-pinia-cypress/cypress/e2e/tsconfig.json
new file mode 100644
index 00000000..be213aef
--- /dev/null
+++ b/typescript-pinia-cypress/cypress/e2e/tsconfig.json
@@ -0,0 +1,10 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["./**/*", "../support/**/*"],
+ "compilerOptions": {
+ "isolatedModules": false,
+ "target": "es5",
+ "lib": ["es5", "dom"],
+ "types": ["cypress"]
+ }
+}
diff --git a/typescript-pinia-cypress/cypress/fixtures/example.json b/typescript-pinia-cypress/cypress/fixtures/example.json
new file mode 100644
index 00000000..02e42543
--- /dev/null
+++ b/typescript-pinia-cypress/cypress/fixtures/example.json
@@ -0,0 +1,5 @@
+{
+ "name": "Using fixtures to represent data",
+ "email": "hello@cypress.io",
+ "body": "Fixtures are a great way to mock data for responses to routes"
+}
diff --git a/typescript-pinia-cypress/cypress/support/commands.ts b/typescript-pinia-cypress/cypress/support/commands.ts
new file mode 100644
index 00000000..95857aea
--- /dev/null
+++ b/typescript-pinia-cypress/cypress/support/commands.ts
@@ -0,0 +1,37 @@
+///
+// ***********************************************
+// This example commands.ts shows you how to
+// create various custom commands and overwrite
+// existing commands.
+//
+// For more comprehensive examples of custom
+// commands please read more here:
+// https://on.cypress.io/custom-commands
+// ***********************************************
+//
+//
+// -- This is a parent command --
+// Cypress.Commands.add('login', (email, password) => { ... })
+//
+//
+// -- This is a child command --
+// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
+//
+//
+// -- This is a dual command --
+// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
+//
+//
+// -- This will overwrite an existing command --
+// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
+//
+// declare global {
+// namespace Cypress {
+// interface Chainable {
+// login(email: string, password: string): Chainable
+// drag(subject: string, options?: Partial): Chainable
+// dismiss(subject: string, options?: Partial): Chainable
+// visit(originalFn: CommandOriginalFn, url: string, options: Partial): Chainable
+// }
+// }
+// }
diff --git a/typescript-pinia-cypress/cypress/support/component-index.html b/typescript-pinia-cypress/cypress/support/component-index.html
new file mode 100644
index 00000000..5f9622ae
--- /dev/null
+++ b/typescript-pinia-cypress/cypress/support/component-index.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+ Components App
+
+
+
+
+
diff --git a/typescript-pinia-cypress/cypress/support/component.ts b/typescript-pinia-cypress/cypress/support/component.ts
new file mode 100644
index 00000000..f3d667e0
--- /dev/null
+++ b/typescript-pinia-cypress/cypress/support/component.ts
@@ -0,0 +1,42 @@
+// ***********************************************************
+// This example support/component.ts is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
+
+// Import global styles
+import '@/assets/main.css'
+
+import { mount } from 'cypress/vue2'
+
+// Augment the Cypress namespace to include type definitions for
+// your custom command.
+// Alternatively, can be defined in cypress/support/component.d.ts
+// with a at the top of your spec.
+declare global {
+ namespace Cypress {
+ interface Chainable {
+ mount: typeof mount
+ }
+ }
+}
+
+Cypress.Commands.add('mount', mount)
+
+// Example use:
+// cy.mount(MyComponent)
diff --git a/typescript-pinia-cypress/cypress/support/e2e.ts b/typescript-pinia-cypress/cypress/support/e2e.ts
new file mode 100644
index 00000000..d68db96d
--- /dev/null
+++ b/typescript-pinia-cypress/cypress/support/e2e.ts
@@ -0,0 +1,20 @@
+// ***********************************************************
+// This example support/index.js is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
diff --git a/typescript-pinia-cypress/env.d.ts b/typescript-pinia-cypress/env.d.ts
new file mode 100644
index 00000000..11f02fe2
--- /dev/null
+++ b/typescript-pinia-cypress/env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/typescript-pinia-cypress/index.html b/typescript-pinia-cypress/index.html
new file mode 100644
index 00000000..11603f87
--- /dev/null
+++ b/typescript-pinia-cypress/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/typescript-pinia-cypress/package.json b/typescript-pinia-cypress/package.json
new file mode 100644
index 00000000..7885a94a
--- /dev/null
+++ b/typescript-pinia-cypress/package.json
@@ -0,0 +1,32 @@
+{
+ "name": "typescript-pinia-cypress",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "run-p type-check build-only",
+ "preview": "vite preview --port 4173",
+ "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
+ "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'",
+ "test:unit": "cypress open --component",
+ "test:unit:ci": "cypress run --component --quiet --reporter spec",
+ "build-only": "vite build",
+ "type-check": "vue-tsc --noEmit"
+ },
+ "dependencies": {
+ "pinia": "^2.0.16",
+ "vue": "^2.7.7"
+ },
+ "devDependencies": {
+ "@types/node": "^16.11.45",
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vue/tsconfig": "^0.1.3",
+ "cypress": "^10.3.0",
+ "npm-run-all": "^4.1.5",
+ "start-server-and-test": "^1.14.0",
+ "terser": "^5.14.2",
+ "typescript": "~4.7.4",
+ "vite": "^3.0.2",
+ "vue-tsc": "^0.38.8"
+ }
+}
diff --git a/typescript-pinia-cypress/public/favicon.ico b/typescript-pinia-cypress/public/favicon.ico
new file mode 100644
index 00000000..df36fcfb
Binary files /dev/null and b/typescript-pinia-cypress/public/favicon.ico differ
diff --git a/typescript-pinia-cypress/src/App.vue b/typescript-pinia-cypress/src/App.vue
new file mode 100644
index 00000000..70c911b5
--- /dev/null
+++ b/typescript-pinia-cypress/src/App.vue
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/typescript-pinia-cypress/src/assets/base.css b/typescript-pinia-cypress/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/typescript-pinia-cypress/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/typescript-pinia-cypress/src/assets/logo.svg b/typescript-pinia-cypress/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/typescript-pinia-cypress/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/typescript-pinia-cypress/src/assets/main.css b/typescript-pinia-cypress/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/typescript-pinia-cypress/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/typescript-pinia-cypress/src/components/HelloWorld.vue b/typescript-pinia-cypress/src/components/HelloWorld.vue
new file mode 100644
index 00000000..624fb3e0
--- /dev/null
+++ b/typescript-pinia-cypress/src/components/HelloWorld.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 .
+
+
+
+
+
diff --git a/typescript-pinia-cypress/src/components/TheWelcome.vue b/typescript-pinia-cypress/src/components/TheWelcome.vue
new file mode 100644
index 00000000..51d12392
--- /dev/null
+++ b/typescript-pinia-cypress/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/typescript-pinia-cypress/src/components/WelcomeItem.vue b/typescript-pinia-cypress/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/typescript-pinia-cypress/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/typescript-pinia-cypress/src/components/__tests__/HelloWorld.cy.ts b/typescript-pinia-cypress/src/components/__tests__/HelloWorld.cy.ts
new file mode 100644
index 00000000..0e0c065a
--- /dev/null
+++ b/typescript-pinia-cypress/src/components/__tests__/HelloWorld.cy.ts
@@ -0,0 +1,12 @@
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('playground', () => {
+ cy.mount(HelloWorld, { propsData: { msg: 'Hello Cypress' } })
+ })
+
+ it('renders properly', () => {
+ cy.mount(HelloWorld, { propsData: { msg: 'Hello Cypress' } })
+ cy.get('h1').should('contain', 'Hello Cypress')
+ })
+})
diff --git a/typescript-pinia-cypress/src/components/icons/IconCommunity.vue b/typescript-pinia-cypress/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/typescript-pinia-cypress/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-pinia-cypress/src/components/icons/IconDocumentation.vue b/typescript-pinia-cypress/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/typescript-pinia-cypress/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-pinia-cypress/src/components/icons/IconEcosystem.vue b/typescript-pinia-cypress/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/typescript-pinia-cypress/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-pinia-cypress/src/components/icons/IconSupport.vue b/typescript-pinia-cypress/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/typescript-pinia-cypress/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-pinia-cypress/src/components/icons/IconTooling.vue b/typescript-pinia-cypress/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/typescript-pinia-cypress/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/typescript-pinia-cypress/src/main.ts b/typescript-pinia-cypress/src/main.ts
new file mode 100644
index 00000000..febe0dbe
--- /dev/null
+++ b/typescript-pinia-cypress/src/main.ts
@@ -0,0 +1,13 @@
+import Vue from 'vue'
+import { createPinia, PiniaVuePlugin } from 'pinia'
+
+import App from './App.vue'
+
+import './assets/main.css'
+
+Vue.use(PiniaVuePlugin)
+
+new Vue({
+ pinia: createPinia(),
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/typescript-pinia-cypress/src/stores/counter.ts b/typescript-pinia-cypress/src/stores/counter.ts
new file mode 100644
index 00000000..4a2d2427
--- /dev/null
+++ b/typescript-pinia-cypress/src/stores/counter.ts
@@ -0,0 +1,16 @@
+import { defineStore } from 'pinia'
+
+export const useCounterStore = defineStore({
+ id: 'counter',
+ state: () => ({
+ counter: 0
+ }),
+ getters: {
+ doubleCount: (state) => state.counter * 2
+ },
+ actions: {
+ increment() {
+ this.counter++
+ }
+ }
+})
diff --git a/typescript-pinia-cypress/tsconfig.app.json b/typescript-pinia-cypress/tsconfig.app.json
new file mode 100644
index 00000000..cdbea1d7
--- /dev/null
+++ b/typescript-pinia-cypress/tsconfig.app.json
@@ -0,0 +1,12 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
+ "exclude": ["src/**/__tests__/*"],
+ "compilerOptions": {
+ "composite": true,
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ }
+}
diff --git a/typescript-pinia-cypress/tsconfig.config.json b/typescript-pinia-cypress/tsconfig.config.json
new file mode 100644
index 00000000..c2d3a309
--- /dev/null
+++ b/typescript-pinia-cypress/tsconfig.config.json
@@ -0,0 +1,8 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.node.json",
+ "include": ["vite.config.*", "vitest.config.*", "cypress.config.*"],
+ "compilerOptions": {
+ "composite": true,
+ "types": ["node"]
+ }
+}
diff --git a/typescript-pinia-cypress/tsconfig.cypress-ct.json b/typescript-pinia-cypress/tsconfig.cypress-ct.json
new file mode 100644
index 00000000..29cbaa47
--- /dev/null
+++ b/typescript-pinia-cypress/tsconfig.cypress-ct.json
@@ -0,0 +1,8 @@
+{
+ "extends": "./tsconfig.app.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue", "cypress/support/component.*"],
+ "exclude": [],
+ "compilerOptions": {
+ "composite": true
+ }
+}
diff --git a/typescript-pinia-cypress/tsconfig.json b/typescript-pinia-cypress/tsconfig.json
new file mode 100644
index 00000000..040665bb
--- /dev/null
+++ b/typescript-pinia-cypress/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "files": [],
+ "references": [
+ {
+ "path": "./tsconfig.config.json"
+ },
+ {
+ "path": "./tsconfig.app.json"
+ },
+ {
+ "path": "./tsconfig.cypress-ct.json"
+ }
+ ]
+}
diff --git a/typescript-pinia-cypress/vite.config.ts b/typescript-pinia-cypress/vite.config.ts
new file mode 100644
index 00000000..d4945079
--- /dev/null
+++ b/typescript-pinia-cypress/vite.config.ts
@@ -0,0 +1,21 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/typescript-pinia-vitest-cypress/.gitignore b/typescript-pinia-vitest-cypress/.gitignore
new file mode 100644
index 00000000..133da84e
--- /dev/null
+++ b/typescript-pinia-vitest-cypress/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/typescript-pinia-vitest-cypress/README.md b/typescript-pinia-vitest-cypress/README.md
new file mode 100644
index 00000000..53a2afe8
--- /dev/null
+++ b/typescript-pinia-vitest-cypress/README.md
@@ -0,0 +1,53 @@
+# typescript-pinia-vitest-cypress
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[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).
+
+## Type Support for `.vue` Imports in TS
+
+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.
+
+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:
+
+1. Disable the built-in TypeScript Extension
+ 1) Run `Extensions: Show Built-in Extensions` from VSCode's command palette
+ 2) Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)`
+2. Reload the VSCode window by running `Developer: Reload Window` from the command palette.
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Type-Check, Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Unit Tests with [Vitest](https://vitest.dev/)
+
+```sh
+pnpm test:unit
+```
+
+### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
+
+```sh
+pnpm build
+pnpm test:e2e # or `pnpm test:e2e:ci` for headless testing
+```
diff --git a/typescript-pinia-vitest-cypress/cypress.config.ts b/typescript-pinia-vitest-cypress/cypress.config.ts
new file mode 100644
index 00000000..0f66080f
--- /dev/null
+++ b/typescript-pinia-vitest-cypress/cypress.config.ts
@@ -0,0 +1,8 @@
+import { defineConfig } from 'cypress'
+
+export default defineConfig({
+ e2e: {
+ specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
+ baseUrl: 'http://localhost:4173/'
+ }
+})
diff --git a/typescript-pinia-vitest-cypress/cypress/e2e/example.cy.ts b/typescript-pinia-vitest-cypress/cypress/e2e/example.cy.ts
new file mode 100644
index 00000000..7a8c909f
--- /dev/null
+++ b/typescript-pinia-vitest-cypress/cypress/e2e/example.cy.ts
@@ -0,0 +1,8 @@
+// https://docs.cypress.io/api/introduction/api.html
+
+describe('My First Test', () => {
+ it('visits the app root url', () => {
+ cy.visit('/')
+ cy.contains('h1', 'You did it!')
+ })
+})
diff --git a/typescript-pinia-vitest-cypress/cypress/e2e/tsconfig.json b/typescript-pinia-vitest-cypress/cypress/e2e/tsconfig.json
new file mode 100644
index 00000000..be213aef
--- /dev/null
+++ b/typescript-pinia-vitest-cypress/cypress/e2e/tsconfig.json
@@ -0,0 +1,10 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["./**/*", "../support/**/*"],
+ "compilerOptions": {
+ "isolatedModules": false,
+ "target": "es5",
+ "lib": ["es5", "dom"],
+ "types": ["cypress"]
+ }
+}
diff --git a/typescript-pinia-vitest-cypress/cypress/fixtures/example.json b/typescript-pinia-vitest-cypress/cypress/fixtures/example.json
new file mode 100644
index 00000000..02e42543
--- /dev/null
+++ b/typescript-pinia-vitest-cypress/cypress/fixtures/example.json
@@ -0,0 +1,5 @@
+{
+ "name": "Using fixtures to represent data",
+ "email": "hello@cypress.io",
+ "body": "Fixtures are a great way to mock data for responses to routes"
+}
diff --git a/typescript-pinia-vitest-cypress/cypress/support/commands.ts b/typescript-pinia-vitest-cypress/cypress/support/commands.ts
new file mode 100644
index 00000000..95857aea
--- /dev/null
+++ b/typescript-pinia-vitest-cypress/cypress/support/commands.ts
@@ -0,0 +1,37 @@
+///
+// ***********************************************
+// This example commands.ts shows you how to
+// create various custom commands and overwrite
+// existing commands.
+//
+// For more comprehensive examples of custom
+// commands please read more here:
+// https://on.cypress.io/custom-commands
+// ***********************************************
+//
+//
+// -- This is a parent command --
+// Cypress.Commands.add('login', (email, password) => { ... })
+//
+//
+// -- This is a child command --
+// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
+//
+//
+// -- This is a dual command --
+// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
+//
+//
+// -- This will overwrite an existing command --
+// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
+//
+// declare global {
+// namespace Cypress {
+// interface Chainable {
+// login(email: string, password: string): Chainable
+// drag(subject: string, options?: Partial): Chainable
+// dismiss(subject: string, options?: Partial): Chainable
+// visit(originalFn: CommandOriginalFn, url: string, options: Partial): Chainable
+// }
+// }
+// }
diff --git a/typescript-pinia-vitest-cypress/cypress/support/e2e.ts b/typescript-pinia-vitest-cypress/cypress/support/e2e.ts
new file mode 100644
index 00000000..d68db96d
--- /dev/null
+++ b/typescript-pinia-vitest-cypress/cypress/support/e2e.ts
@@ -0,0 +1,20 @@
+// ***********************************************************
+// This example support/index.js is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
diff --git a/typescript-pinia-vitest-cypress/env.d.ts b/typescript-pinia-vitest-cypress/env.d.ts
new file mode 100644
index 00000000..11f02fe2
--- /dev/null
+++ b/typescript-pinia-vitest-cypress/env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/typescript-pinia-vitest-cypress/index.html b/typescript-pinia-vitest-cypress/index.html
new file mode 100644
index 00000000..11603f87
--- /dev/null
+++ b/typescript-pinia-vitest-cypress/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/typescript-pinia-vitest-cypress/package.json b/typescript-pinia-vitest-cypress/package.json
new file mode 100644
index 00000000..fc154e82
--- /dev/null
+++ b/typescript-pinia-vitest-cypress/package.json
@@ -0,0 +1,36 @@
+{
+ "name": "typescript-pinia-vitest-cypress",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "run-p type-check build-only",
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom",
+ "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
+ "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'",
+ "build-only": "vite build",
+ "type-check": "vue-tsc --noEmit -p tsconfig.vitest.json --composite false"
+ },
+ "dependencies": {
+ "pinia": "^2.0.16",
+ "vue": "^2.7.7"
+ },
+ "devDependencies": {
+ "@types/jsdom": "^16.2.14",
+ "@types/node": "^16.11.45",
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vue/test-utils": "^1.3.0",
+ "@vue/tsconfig": "^0.1.3",
+ "cypress": "^10.3.0",
+ "jsdom": "^20.0.0",
+ "npm-run-all": "^4.1.5",
+ "start-server-and-test": "^1.14.0",
+ "terser": "^5.14.2",
+ "typescript": "~4.7.4",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7",
+ "vue-tsc": "^0.38.8"
+ }
+}
diff --git a/typescript-pinia-vitest-cypress/public/favicon.ico b/typescript-pinia-vitest-cypress/public/favicon.ico
new file mode 100644
index 00000000..df36fcfb
Binary files /dev/null and b/typescript-pinia-vitest-cypress/public/favicon.ico differ
diff --git a/typescript-pinia-vitest-cypress/src/App.vue b/typescript-pinia-vitest-cypress/src/App.vue
new file mode 100644
index 00000000..70c911b5
--- /dev/null
+++ b/typescript-pinia-vitest-cypress/src/App.vue
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/typescript-pinia-vitest-cypress/src/assets/base.css b/typescript-pinia-vitest-cypress/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/typescript-pinia-vitest-cypress/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/typescript-pinia-vitest-cypress/src/assets/logo.svg b/typescript-pinia-vitest-cypress/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/typescript-pinia-vitest-cypress/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/typescript-pinia-vitest-cypress/src/assets/main.css b/typescript-pinia-vitest-cypress/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/typescript-pinia-vitest-cypress/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/typescript-pinia-vitest-cypress/src/components/HelloWorld.vue b/typescript-pinia-vitest-cypress/src/components/HelloWorld.vue
new file mode 100644
index 00000000..624fb3e0
--- /dev/null
+++ b/typescript-pinia-vitest-cypress/src/components/HelloWorld.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 .
+
+
+
+
+
diff --git a/typescript-pinia-vitest-cypress/src/components/TheWelcome.vue b/typescript-pinia-vitest-cypress/src/components/TheWelcome.vue
new file mode 100644
index 00000000..51d12392
--- /dev/null
+++ b/typescript-pinia-vitest-cypress/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/typescript-pinia-vitest-cypress/src/components/WelcomeItem.vue b/typescript-pinia-vitest-cypress/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/typescript-pinia-vitest-cypress/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/typescript-pinia-vitest-cypress/src/components/__tests__/HelloWorld.spec.ts b/typescript-pinia-vitest-cypress/src/components/__tests__/HelloWorld.spec.ts
new file mode 100644
index 00000000..293bf197
--- /dev/null
+++ b/typescript-pinia-vitest-cypress/src/components/__tests__/HelloWorld.spec.ts
@@ -0,0 +1,11 @@
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('renders properly', () => {
+ const wrapper = mount(HelloWorld, { propsData: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
+ })
+})
diff --git a/typescript-pinia-vitest-cypress/src/components/icons/IconCommunity.vue b/typescript-pinia-vitest-cypress/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/typescript-pinia-vitest-cypress/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-pinia-vitest-cypress/src/components/icons/IconDocumentation.vue b/typescript-pinia-vitest-cypress/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/typescript-pinia-vitest-cypress/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-pinia-vitest-cypress/src/components/icons/IconEcosystem.vue b/typescript-pinia-vitest-cypress/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/typescript-pinia-vitest-cypress/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-pinia-vitest-cypress/src/components/icons/IconSupport.vue b/typescript-pinia-vitest-cypress/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/typescript-pinia-vitest-cypress/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-pinia-vitest-cypress/src/components/icons/IconTooling.vue b/typescript-pinia-vitest-cypress/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/typescript-pinia-vitest-cypress/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/typescript-pinia-vitest-cypress/src/main.ts b/typescript-pinia-vitest-cypress/src/main.ts
new file mode 100644
index 00000000..febe0dbe
--- /dev/null
+++ b/typescript-pinia-vitest-cypress/src/main.ts
@@ -0,0 +1,13 @@
+import Vue from 'vue'
+import { createPinia, PiniaVuePlugin } from 'pinia'
+
+import App from './App.vue'
+
+import './assets/main.css'
+
+Vue.use(PiniaVuePlugin)
+
+new Vue({
+ pinia: createPinia(),
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/typescript-pinia-vitest-cypress/src/stores/counter.ts b/typescript-pinia-vitest-cypress/src/stores/counter.ts
new file mode 100644
index 00000000..4a2d2427
--- /dev/null
+++ b/typescript-pinia-vitest-cypress/src/stores/counter.ts
@@ -0,0 +1,16 @@
+import { defineStore } from 'pinia'
+
+export const useCounterStore = defineStore({
+ id: 'counter',
+ state: () => ({
+ counter: 0
+ }),
+ getters: {
+ doubleCount: (state) => state.counter * 2
+ },
+ actions: {
+ increment() {
+ this.counter++
+ }
+ }
+})
diff --git a/typescript-pinia-vitest-cypress/tsconfig.app.json b/typescript-pinia-vitest-cypress/tsconfig.app.json
new file mode 100644
index 00000000..cdbea1d7
--- /dev/null
+++ b/typescript-pinia-vitest-cypress/tsconfig.app.json
@@ -0,0 +1,12 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
+ "exclude": ["src/**/__tests__/*"],
+ "compilerOptions": {
+ "composite": true,
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ }
+}
diff --git a/typescript-pinia-vitest-cypress/tsconfig.config.json b/typescript-pinia-vitest-cypress/tsconfig.config.json
new file mode 100644
index 00000000..c2d3a309
--- /dev/null
+++ b/typescript-pinia-vitest-cypress/tsconfig.config.json
@@ -0,0 +1,8 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.node.json",
+ "include": ["vite.config.*", "vitest.config.*", "cypress.config.*"],
+ "compilerOptions": {
+ "composite": true,
+ "types": ["node"]
+ }
+}
diff --git a/typescript-pinia-vitest-cypress/tsconfig.json b/typescript-pinia-vitest-cypress/tsconfig.json
new file mode 100644
index 00000000..31f90037
--- /dev/null
+++ b/typescript-pinia-vitest-cypress/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "files": [],
+ "references": [
+ {
+ "path": "./tsconfig.config.json"
+ },
+ {
+ "path": "./tsconfig.app.json"
+ },
+ {
+ "path": "./tsconfig.vitest.json"
+ }
+ ]
+}
diff --git a/typescript-pinia-vitest-cypress/tsconfig.vitest.json b/typescript-pinia-vitest-cypress/tsconfig.vitest.json
new file mode 100644
index 00000000..d080d611
--- /dev/null
+++ b/typescript-pinia-vitest-cypress/tsconfig.vitest.json
@@ -0,0 +1,9 @@
+{
+ "extends": "./tsconfig.app.json",
+ "exclude": [],
+ "compilerOptions": {
+ "composite": true,
+ "lib": [],
+ "types": ["node", "jsdom"]
+ }
+}
diff --git a/typescript-pinia-vitest-cypress/vite.config.ts b/typescript-pinia-vitest-cypress/vite.config.ts
new file mode 100644
index 00000000..d4945079
--- /dev/null
+++ b/typescript-pinia-vitest-cypress/vite.config.ts
@@ -0,0 +1,21 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/typescript-pinia-vitest/.gitignore b/typescript-pinia-vitest/.gitignore
new file mode 100644
index 00000000..133da84e
--- /dev/null
+++ b/typescript-pinia-vitest/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/typescript-pinia-vitest/README.md b/typescript-pinia-vitest/README.md
new file mode 100644
index 00000000..fbe43309
--- /dev/null
+++ b/typescript-pinia-vitest/README.md
@@ -0,0 +1,46 @@
+# typescript-pinia-vitest
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[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).
+
+## Type Support for `.vue` Imports in TS
+
+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.
+
+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:
+
+1. Disable the built-in TypeScript Extension
+ 1) Run `Extensions: Show Built-in Extensions` from VSCode's command palette
+ 2) Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)`
+2. Reload the VSCode window by running `Developer: Reload Window` from the command palette.
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Type-Check, Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Unit Tests with [Vitest](https://vitest.dev/)
+
+```sh
+pnpm test:unit
+```
diff --git a/typescript-pinia-vitest/env.d.ts b/typescript-pinia-vitest/env.d.ts
new file mode 100644
index 00000000..11f02fe2
--- /dev/null
+++ b/typescript-pinia-vitest/env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/typescript-pinia-vitest/index.html b/typescript-pinia-vitest/index.html
new file mode 100644
index 00000000..11603f87
--- /dev/null
+++ b/typescript-pinia-vitest/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/typescript-pinia-vitest/package.json b/typescript-pinia-vitest/package.json
new file mode 100644
index 00000000..da17a2b4
--- /dev/null
+++ b/typescript-pinia-vitest/package.json
@@ -0,0 +1,32 @@
+{
+ "name": "typescript-pinia-vitest",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "run-p type-check build-only",
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom",
+ "build-only": "vite build",
+ "type-check": "vue-tsc --noEmit -p tsconfig.vitest.json --composite false"
+ },
+ "dependencies": {
+ "pinia": "^2.0.16",
+ "vue": "^2.7.7"
+ },
+ "devDependencies": {
+ "@types/jsdom": "^16.2.14",
+ "@types/node": "^16.11.45",
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vue/test-utils": "^1.3.0",
+ "@vue/tsconfig": "^0.1.3",
+ "jsdom": "^20.0.0",
+ "npm-run-all": "^4.1.5",
+ "terser": "^5.14.2",
+ "typescript": "~4.7.4",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7",
+ "vue-tsc": "^0.38.8"
+ }
+}
diff --git a/typescript-pinia-vitest/public/favicon.ico b/typescript-pinia-vitest/public/favicon.ico
new file mode 100644
index 00000000..df36fcfb
Binary files /dev/null and b/typescript-pinia-vitest/public/favicon.ico differ
diff --git a/typescript-pinia-vitest/src/App.vue b/typescript-pinia-vitest/src/App.vue
new file mode 100644
index 00000000..70c911b5
--- /dev/null
+++ b/typescript-pinia-vitest/src/App.vue
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/typescript-pinia-vitest/src/assets/base.css b/typescript-pinia-vitest/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/typescript-pinia-vitest/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/typescript-pinia-vitest/src/assets/logo.svg b/typescript-pinia-vitest/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/typescript-pinia-vitest/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/typescript-pinia-vitest/src/assets/main.css b/typescript-pinia-vitest/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/typescript-pinia-vitest/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/typescript-pinia-vitest/src/components/HelloWorld.vue b/typescript-pinia-vitest/src/components/HelloWorld.vue
new file mode 100644
index 00000000..624fb3e0
--- /dev/null
+++ b/typescript-pinia-vitest/src/components/HelloWorld.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 .
+
+
+
+
+
diff --git a/typescript-pinia-vitest/src/components/TheWelcome.vue b/typescript-pinia-vitest/src/components/TheWelcome.vue
new file mode 100644
index 00000000..51d12392
--- /dev/null
+++ b/typescript-pinia-vitest/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/typescript-pinia-vitest/src/components/WelcomeItem.vue b/typescript-pinia-vitest/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/typescript-pinia-vitest/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/typescript-pinia-vitest/src/components/__tests__/HelloWorld.spec.ts b/typescript-pinia-vitest/src/components/__tests__/HelloWorld.spec.ts
new file mode 100644
index 00000000..293bf197
--- /dev/null
+++ b/typescript-pinia-vitest/src/components/__tests__/HelloWorld.spec.ts
@@ -0,0 +1,11 @@
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('renders properly', () => {
+ const wrapper = mount(HelloWorld, { propsData: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
+ })
+})
diff --git a/typescript-pinia-vitest/src/components/icons/IconCommunity.vue b/typescript-pinia-vitest/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/typescript-pinia-vitest/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-pinia-vitest/src/components/icons/IconDocumentation.vue b/typescript-pinia-vitest/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/typescript-pinia-vitest/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-pinia-vitest/src/components/icons/IconEcosystem.vue b/typescript-pinia-vitest/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/typescript-pinia-vitest/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-pinia-vitest/src/components/icons/IconSupport.vue b/typescript-pinia-vitest/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/typescript-pinia-vitest/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-pinia-vitest/src/components/icons/IconTooling.vue b/typescript-pinia-vitest/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/typescript-pinia-vitest/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/typescript-pinia-vitest/src/main.ts b/typescript-pinia-vitest/src/main.ts
new file mode 100644
index 00000000..febe0dbe
--- /dev/null
+++ b/typescript-pinia-vitest/src/main.ts
@@ -0,0 +1,13 @@
+import Vue from 'vue'
+import { createPinia, PiniaVuePlugin } from 'pinia'
+
+import App from './App.vue'
+
+import './assets/main.css'
+
+Vue.use(PiniaVuePlugin)
+
+new Vue({
+ pinia: createPinia(),
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/typescript-pinia-vitest/src/stores/counter.ts b/typescript-pinia-vitest/src/stores/counter.ts
new file mode 100644
index 00000000..4a2d2427
--- /dev/null
+++ b/typescript-pinia-vitest/src/stores/counter.ts
@@ -0,0 +1,16 @@
+import { defineStore } from 'pinia'
+
+export const useCounterStore = defineStore({
+ id: 'counter',
+ state: () => ({
+ counter: 0
+ }),
+ getters: {
+ doubleCount: (state) => state.counter * 2
+ },
+ actions: {
+ increment() {
+ this.counter++
+ }
+ }
+})
diff --git a/typescript-pinia-vitest/tsconfig.app.json b/typescript-pinia-vitest/tsconfig.app.json
new file mode 100644
index 00000000..cdbea1d7
--- /dev/null
+++ b/typescript-pinia-vitest/tsconfig.app.json
@@ -0,0 +1,12 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
+ "exclude": ["src/**/__tests__/*"],
+ "compilerOptions": {
+ "composite": true,
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ }
+}
diff --git a/typescript-pinia-vitest/tsconfig.config.json b/typescript-pinia-vitest/tsconfig.config.json
new file mode 100644
index 00000000..c2d3a309
--- /dev/null
+++ b/typescript-pinia-vitest/tsconfig.config.json
@@ -0,0 +1,8 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.node.json",
+ "include": ["vite.config.*", "vitest.config.*", "cypress.config.*"],
+ "compilerOptions": {
+ "composite": true,
+ "types": ["node"]
+ }
+}
diff --git a/typescript-pinia-vitest/tsconfig.json b/typescript-pinia-vitest/tsconfig.json
new file mode 100644
index 00000000..31f90037
--- /dev/null
+++ b/typescript-pinia-vitest/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "files": [],
+ "references": [
+ {
+ "path": "./tsconfig.config.json"
+ },
+ {
+ "path": "./tsconfig.app.json"
+ },
+ {
+ "path": "./tsconfig.vitest.json"
+ }
+ ]
+}
diff --git a/typescript-pinia-vitest/tsconfig.vitest.json b/typescript-pinia-vitest/tsconfig.vitest.json
new file mode 100644
index 00000000..d080d611
--- /dev/null
+++ b/typescript-pinia-vitest/tsconfig.vitest.json
@@ -0,0 +1,9 @@
+{
+ "extends": "./tsconfig.app.json",
+ "exclude": [],
+ "compilerOptions": {
+ "composite": true,
+ "lib": [],
+ "types": ["node", "jsdom"]
+ }
+}
diff --git a/typescript-pinia-vitest/vite.config.ts b/typescript-pinia-vitest/vite.config.ts
new file mode 100644
index 00000000..d4945079
--- /dev/null
+++ b/typescript-pinia-vitest/vite.config.ts
@@ -0,0 +1,21 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/typescript-pinia-with-tests/README.md b/typescript-pinia-with-tests/README.md
index 8eaca70b..408722e3 100644
--- a/typescript-pinia-with-tests/README.md
+++ b/typescript-pinia-with-tests/README.md
@@ -4,13 +4,18 @@ This template should help get you started developing with Vue 3 in Vite.
## Recommended IDE Setup
-[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=johnsoncodehk.volar) (and disable Vetur).
+[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).
## Type Support for `.vue` Imports in TS
-Since TypeScript cannot handle type information for `.vue` imports, they are shimmed to be a generic Vue component type by default. In most cases this is fine if you don't really care about component prop types outside of templates.
+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.
-However, if you wish to get actual prop types in `.vue` imports (for example to get props validation when using manual `h(...)` calls), you can run `Volar: Switch TS Plugin on/off` from VSCode command palette.
+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:
+
+1. Disable the built-in TypeScript Extension
+ 1) Run `Extensions: Show Built-in Extensions` from VSCode's command palette
+ 2) Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)`
+2. Reload the VSCode window by running `Developer: Reload Window` from the command palette.
## Customize configuration
@@ -34,10 +39,10 @@ pnpm dev
pnpm build
```
-### Run Unit Tests with [Cypress Component Testing](https://docs.cypress.io/guides/component-testing/introduction)
+### Run Unit Tests with [Vitest](https://vitest.dev/)
```sh
-pnpm test:unit # or `pnpm test:unit:ci` for headless testing
+pnpm test:unit
```
### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
diff --git a/typescript-pinia-with-tests/cypress.config.ts b/typescript-pinia-with-tests/cypress.config.ts
new file mode 100644
index 00000000..0f66080f
--- /dev/null
+++ b/typescript-pinia-with-tests/cypress.config.ts
@@ -0,0 +1,8 @@
+import { defineConfig } from 'cypress'
+
+export default defineConfig({
+ e2e: {
+ specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
+ baseUrl: 'http://localhost:4173/'
+ }
+})
diff --git a/typescript-pinia-with-tests/cypress.json b/typescript-pinia-with-tests/cypress.json
deleted file mode 100644
index 3d372252..00000000
--- a/typescript-pinia-with-tests/cypress.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "baseUrl": "http://localhost:5050/",
- "component": {
- "componentFolder": "src",
- "testFiles": "**/__tests__/*.spec.{js,ts,jsx,tsx}"
- }
-}
diff --git a/typescript-pinia-with-tests/cypress/e2e/example.cy.ts b/typescript-pinia-with-tests/cypress/e2e/example.cy.ts
new file mode 100644
index 00000000..7a8c909f
--- /dev/null
+++ b/typescript-pinia-with-tests/cypress/e2e/example.cy.ts
@@ -0,0 +1,8 @@
+// https://docs.cypress.io/api/introduction/api.html
+
+describe('My First Test', () => {
+ it('visits the app root url', () => {
+ cy.visit('/')
+ cy.contains('h1', 'You did it!')
+ })
+})
diff --git a/typescript-pinia-with-tests/cypress/e2e/tsconfig.json b/typescript-pinia-with-tests/cypress/e2e/tsconfig.json
new file mode 100644
index 00000000..be213aef
--- /dev/null
+++ b/typescript-pinia-with-tests/cypress/e2e/tsconfig.json
@@ -0,0 +1,10 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["./**/*", "../support/**/*"],
+ "compilerOptions": {
+ "isolatedModules": false,
+ "target": "es5",
+ "lib": ["es5", "dom"],
+ "types": ["cypress"]
+ }
+}
diff --git a/typescript-pinia-with-tests/cypress/plugins/index.ts b/typescript-pinia-with-tests/cypress/plugins/index.ts
deleted file mode 100644
index ad2e351d..00000000
--- a/typescript-pinia-with-tests/cypress/plugins/index.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-///
-// ***********************************************************
-// This example plugins/index.js can be used to load plugins
-//
-// You can change the location of this file or turn off loading
-// the plugins file with the 'pluginsFile' configuration option.
-//
-// You can read more here:
-// https://on.cypress.io/plugins-guide
-// ***********************************************************
-
-// This function is called when a project is opened or re-opened (e.g. due to
-// the project's config changing)
-
-const { startDevServer } = require('@cypress/vite-dev-server')
-
-/**
- * @type {Cypress.PluginConfig}
- */
-// eslint-disable-next-line no-unused-vars
-module.exports = (on, config) => {
- // `on` is used to hook into various events Cypress emits
- // `config` is the resolved Cypress config
- on('dev-server:start', (options) => {
- return startDevServer({ options })
- })
- return config
-}
diff --git a/typescript-pinia-with-tests/cypress/support/commands.ts b/typescript-pinia-with-tests/cypress/support/commands.ts
index 119ab03f..95857aea 100644
--- a/typescript-pinia-with-tests/cypress/support/commands.ts
+++ b/typescript-pinia-with-tests/cypress/support/commands.ts
@@ -1,5 +1,6 @@
+///
// ***********************************************
-// This example commands.js shows you how to
+// This example commands.ts shows you how to
// create various custom commands and overwrite
// existing commands.
//
@@ -23,3 +24,14 @@
//
// -- This will overwrite an existing command --
// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
+//
+// declare global {
+// namespace Cypress {
+// interface Chainable {
+// login(email: string, password: string): Chainable
+// drag(subject: string, options?: Partial): Chainable
+// dismiss(subject: string, options?: Partial): Chainable
+// visit(originalFn: CommandOriginalFn, url: string, options: Partial): Chainable
+// }
+// }
+// }
diff --git a/typescript-pinia-with-tests/cypress/support/e2e.ts b/typescript-pinia-with-tests/cypress/support/e2e.ts
new file mode 100644
index 00000000..d68db96d
--- /dev/null
+++ b/typescript-pinia-with-tests/cypress/support/e2e.ts
@@ -0,0 +1,20 @@
+// ***********************************************************
+// This example support/index.js is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
diff --git a/typescript-pinia-with-tests/cypress/tsconfig.json b/typescript-pinia-with-tests/cypress/tsconfig.json
deleted file mode 100644
index b5b2f972..00000000
--- a/typescript-pinia-with-tests/cypress/tsconfig.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "compilerOptions": {
- "target": "es5",
- "lib": ["es5", "dom"],
- "types": ["cypress"]
- },
- "include": ["./**/*"]
-}
diff --git a/typescript-pinia-with-tests/env.d.ts b/typescript-pinia-with-tests/env.d.ts
index 636d9c3f..11f02fe2 100644
--- a/typescript-pinia-with-tests/env.d.ts
+++ b/typescript-pinia-with-tests/env.d.ts
@@ -1,8 +1 @@
///
-
-declare module '*.vue' {
- import { DefineComponent } from 'vue'
- // eslint-disable-next-line
- const component: DefineComponent<{}, {}, any>
- export default component
-}
diff --git a/typescript-pinia-with-tests/package.json b/typescript-pinia-with-tests/package.json
index 405f42e2..dca95f72 100644
--- a/typescript-pinia-with-tests/package.json
+++ b/typescript-pinia-with-tests/package.json
@@ -3,27 +3,34 @@
"version": "0.0.0",
"scripts": {
"dev": "vite",
- "build": "vue-tsc --noEmit && vite build",
- "preview": "vite preview --port 5050",
- "test:unit": "cypress open-ct",
- "test:unit:ci": "cypress run-ct --quiet --reporter spec",
- "test:e2e": "start-server-and-test preview http://127.0.0.1:5050/ 'cypress open'",
- "test:e2e:ci": "start-server-and-test preview http://127.0.0.1:5050/ 'cypress run'",
- "typecheck": "vue-tsc --noEmit"
+ "build": "run-p type-check build-only",
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom",
+ "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
+ "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'",
+ "build-only": "vite build",
+ "type-check": "vue-tsc --noEmit -p tsconfig.vitest.json --composite false"
},
"dependencies": {
- "pinia": "^2.0.4",
- "vue": "^3.2.22"
+ "pinia": "^2.0.16",
+ "vue": "^2.7.7"
},
"devDependencies": {
- "@cypress/vite-dev-server": "^2.2.1",
- "@cypress/vue": "^3.0.5",
- "@types/node": "^16.11.10",
- "@vitejs/plugin-vue": "^1.10.0",
- "cypress": "^8.7.0",
+ "@types/jsdom": "^16.2.14",
+ "@types/node": "^16.11.45",
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vue/test-utils": "^1.3.0",
+ "@vue/tsconfig": "^0.1.3",
+ "cypress": "^10.3.0",
+ "jsdom": "^20.0.0",
+ "npm-run-all": "^4.1.5",
"start-server-and-test": "^1.14.0",
- "typescript": "~4.4.4",
- "vite": "^2.6.14",
- "vue-tsc": "^0.29.6"
+ "terser": "^5.14.2",
+ "typescript": "~4.7.4",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7",
+ "vue-tsc": "^0.38.8"
}
}
diff --git a/typescript-pinia-with-tests/src/App.vue b/typescript-pinia-with-tests/src/App.vue
index d91eefc4..70c911b5 100644
--- a/typescript-pinia-with-tests/src/App.vue
+++ b/typescript-pinia-with-tests/src/App.vue
@@ -4,30 +4,22 @@ import TheWelcome from './components/TheWelcome.vue'
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/typescript-pinia-with-tests/src/assets/main.css b/typescript-pinia-with-tests/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/typescript-pinia-with-tests/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/typescript-pinia-with-tests/src/components/HelloWorld.vue b/typescript-pinia-with-tests/src/components/HelloWorld.vue
index 01118cd9..624fb3e0 100644
--- a/typescript-pinia-with-tests/src/components/HelloWorld.vue
+++ b/typescript-pinia-with-tests/src/components/HelloWorld.vue
@@ -10,7 +10,7 @@ defineProps<{
You’ve successfully created a project with
Vite +
- Vue 3 .
+ Vue 2 .
diff --git a/typescript-pinia-with-tests/src/components/TheWelcome.vue b/typescript-pinia-with-tests/src/components/TheWelcome.vue
index b91a8edd..51d12392 100644
--- a/typescript-pinia-with-tests/src/components/TheWelcome.vue
+++ b/typescript-pinia-with-tests/src/components/TheWelcome.vue
@@ -8,77 +8,79 @@ import SupportIcon from './icons/IconSupport.vue'
-
-
-
-
- Documentation
+
+
+
+
+
+ Documentation
- Vue’s
- official documentation
- provides you with all information you need to get started.
-
+ Vue’s
+
official documentation
+ provides you with all information you need to get started.
+
-
-
-
-
- Tooling
+
+
+
+
+ Tooling
- This project is served and bundled with
- Vite . The recommended IDE
- setup is VSCode +
- Volar . If you need to test
- your components and web pages, check out
- Cypress and
- Cypress Component Testing .
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
-
+
- More instructions are available in README.md
.
-
+ More instructions are available in README.md
.
+
-
-
-
-
- Ecosystem
+
+
+
+
+ Ecosystem
- Get official tools and libraries for your project:
- Vuex ,
- Vue Router ,
- Vue Test Utils , and
- Vue Dev Tools . If you need more
- resources, we suggest paying
- Awesome Vue
- a visit.
-
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
-
-
-
-
- Community
+
+
+
+
+ Community
- Got stuck? Ask your question on
- Vue Land , our official Discord server, or
- StackOverflow .
- You should also subscribe to
- our mailing list and follow the official
- @vuejs
- twitter account for latest news in the Vue world.
-
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
-
-
-
-
- Support Vue
+
+
+
+
+ Support Vue
- As an independent project, Vue relies on community backing for its sustainability. You can help
- us by
- becoming a sponsor .
-
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
diff --git a/typescript-pinia-with-tests/src/components/__tests__/HelloWorld.spec.ts b/typescript-pinia-with-tests/src/components/__tests__/HelloWorld.spec.ts
index a69f3a9d..293bf197 100644
--- a/typescript-pinia-with-tests/src/components/__tests__/HelloWorld.spec.ts
+++ b/typescript-pinia-with-tests/src/components/__tests__/HelloWorld.spec.ts
@@ -1,13 +1,11 @@
-import { mount } from '@cypress/vue'
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
import HelloWorld from '../HelloWorld.vue'
describe('HelloWorld', () => {
- it('playground', () => {
- mount(HelloWorld, { props: { msg: 'Hello Cypress' } })
- })
-
it('renders properly', () => {
- mount(HelloWorld, { props: { msg: 'Hello Cypress' } })
- cy.get('h1').should('contain', 'Hello Cypress')
+ const wrapper = mount(HelloWorld, { propsData: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
})
})
diff --git a/typescript-pinia-with-tests/src/components/icons/IconTooling.vue b/typescript-pinia-with-tests/src/components/icons/IconTooling.vue
index 660598d7..07dc46b0 100644
--- a/typescript-pinia-with-tests/src/components/icons/IconTooling.vue
+++ b/typescript-pinia-with-tests/src/components/icons/IconTooling.vue
@@ -2,8 +2,6 @@
h(App)
+}).$mount('#app')
diff --git a/typescript-pinia-with-tests/tsconfig.app.json b/typescript-pinia-with-tests/tsconfig.app.json
new file mode 100644
index 00000000..cdbea1d7
--- /dev/null
+++ b/typescript-pinia-with-tests/tsconfig.app.json
@@ -0,0 +1,12 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
+ "exclude": ["src/**/__tests__/*"],
+ "compilerOptions": {
+ "composite": true,
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ }
+}
diff --git a/typescript-pinia-with-tests/tsconfig.config.json b/typescript-pinia-with-tests/tsconfig.config.json
new file mode 100644
index 00000000..c2d3a309
--- /dev/null
+++ b/typescript-pinia-with-tests/tsconfig.config.json
@@ -0,0 +1,8 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.node.json",
+ "include": ["vite.config.*", "vitest.config.*", "cypress.config.*"],
+ "compilerOptions": {
+ "composite": true,
+ "types": ["node"]
+ }
+}
diff --git a/typescript-pinia-with-tests/tsconfig.json b/typescript-pinia-with-tests/tsconfig.json
index 8c707192..31f90037 100644
--- a/typescript-pinia-with-tests/tsconfig.json
+++ b/typescript-pinia-with-tests/tsconfig.json
@@ -1,21 +1,14 @@
{
- "compilerOptions": {
- "baseUrl": "./",
- "target": "esnext",
- "useDefineForClassFields": true,
- "module": "esnext",
- "moduleResolution": "node",
- "isolatedModules": true,
- "strict": true,
- "jsx": "preserve",
- "sourceMap": true,
- "resolveJsonModule": true,
- "esModuleInterop": true,
- "paths": {
- "@/*": ["src/*"]
+ "files": [],
+ "references": [
+ {
+ "path": "./tsconfig.config.json"
},
- "lib": ["esnext", "dom", "dom.iterable", "scripthost"],
- "skipLibCheck": true
- },
- "include": ["vite.config.*", "env.d.ts", "src/**/*", "src/**/*.vue"]
+ {
+ "path": "./tsconfig.app.json"
+ },
+ {
+ "path": "./tsconfig.vitest.json"
+ }
+ ]
}
diff --git a/typescript-pinia-with-tests/tsconfig.vitest.json b/typescript-pinia-with-tests/tsconfig.vitest.json
new file mode 100644
index 00000000..d080d611
--- /dev/null
+++ b/typescript-pinia-with-tests/tsconfig.vitest.json
@@ -0,0 +1,9 @@
+{
+ "extends": "./tsconfig.app.json",
+ "exclude": [],
+ "compilerOptions": {
+ "composite": true,
+ "lib": [],
+ "types": ["node", "jsdom"]
+ }
+}
diff --git a/typescript-pinia-with-tests/vite.config.ts b/typescript-pinia-with-tests/vite.config.ts
index 5cd06c63..d4945079 100644
--- a/typescript-pinia-with-tests/vite.config.ts
+++ b/typescript-pinia-with-tests/vite.config.ts
@@ -1,11 +1,18 @@
-import { fileURLToPath } from 'url'
+import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vite'
-import vue from '@vitejs/plugin-vue'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
// https://vitejs.dev/config/
export default defineConfig({
- plugins: [vue()],
+ plugins: [
+ vue2(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
diff --git a/typescript-pinia/README.md b/typescript-pinia/README.md
index fd295742..47428c44 100644
--- a/typescript-pinia/README.md
+++ b/typescript-pinia/README.md
@@ -4,13 +4,18 @@ This template should help get you started developing with Vue 3 in Vite.
## Recommended IDE Setup
-[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=johnsoncodehk.volar) (and disable Vetur).
+[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).
## Type Support for `.vue` Imports in TS
-Since TypeScript cannot handle type information for `.vue` imports, they are shimmed to be a generic Vue component type by default. In most cases this is fine if you don't really care about component prop types outside of templates.
+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.
-However, if you wish to get actual prop types in `.vue` imports (for example to get props validation when using manual `h(...)` calls), you can run `Volar: Switch TS Plugin on/off` from VSCode command palette.
+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:
+
+1. Disable the built-in TypeScript Extension
+ 1) Run `Extensions: Show Built-in Extensions` from VSCode's command palette
+ 2) Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)`
+2. Reload the VSCode window by running `Developer: Reload Window` from the command palette.
## Customize configuration
diff --git a/typescript-pinia/env.d.ts b/typescript-pinia/env.d.ts
index 636d9c3f..11f02fe2 100644
--- a/typescript-pinia/env.d.ts
+++ b/typescript-pinia/env.d.ts
@@ -1,8 +1 @@
///
-
-declare module '*.vue' {
- import { DefineComponent } from 'vue'
- // eslint-disable-next-line
- const component: DefineComponent<{}, {}, any>
- export default component
-}
diff --git a/typescript-pinia/package.json b/typescript-pinia/package.json
index 256e1751..b35d2a62 100644
--- a/typescript-pinia/package.json
+++ b/typescript-pinia/package.json
@@ -3,19 +3,24 @@
"version": "0.0.0",
"scripts": {
"dev": "vite",
- "build": "vue-tsc --noEmit && vite build",
- "preview": "vite preview --port 5050",
- "typecheck": "vue-tsc --noEmit"
+ "build": "run-p type-check build-only",
+ "preview": "vite preview --port 4173",
+ "build-only": "vite build",
+ "type-check": "vue-tsc --noEmit"
},
"dependencies": {
- "pinia": "^2.0.4",
- "vue": "^3.2.22"
+ "pinia": "^2.0.16",
+ "vue": "^2.7.7"
},
"devDependencies": {
- "@types/node": "^16.11.10",
- "@vitejs/plugin-vue": "^1.10.0",
- "typescript": "~4.4.4",
- "vite": "^2.6.14",
- "vue-tsc": "^0.29.6"
+ "@types/node": "^16.11.45",
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vue/tsconfig": "^0.1.3",
+ "npm-run-all": "^4.1.5",
+ "terser": "^5.14.2",
+ "typescript": "~4.7.4",
+ "vite": "^3.0.2",
+ "vue-tsc": "^0.38.8"
}
}
diff --git a/typescript-pinia/src/App.vue b/typescript-pinia/src/App.vue
index d91eefc4..70c911b5 100644
--- a/typescript-pinia/src/App.vue
+++ b/typescript-pinia/src/App.vue
@@ -4,30 +4,22 @@ import TheWelcome from './components/TheWelcome.vue'
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/typescript-pinia/src/assets/main.css b/typescript-pinia/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/typescript-pinia/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/typescript-pinia/src/components/HelloWorld.vue b/typescript-pinia/src/components/HelloWorld.vue
index 01118cd9..624fb3e0 100644
--- a/typescript-pinia/src/components/HelloWorld.vue
+++ b/typescript-pinia/src/components/HelloWorld.vue
@@ -10,7 +10,7 @@ defineProps<{
You’ve successfully created a project with
Vite +
- Vue 3 .
+ Vue 2 .
diff --git a/typescript-pinia/src/components/TheWelcome.vue b/typescript-pinia/src/components/TheWelcome.vue
index b91a8edd..51d12392 100644
--- a/typescript-pinia/src/components/TheWelcome.vue
+++ b/typescript-pinia/src/components/TheWelcome.vue
@@ -8,77 +8,79 @@ import SupportIcon from './icons/IconSupport.vue'
-
-
-
-
- Documentation
+
+
+
+
+
+ Documentation
- Vue’s
- official documentation
- provides you with all information you need to get started.
-
+ Vue’s
+
official documentation
+ provides you with all information you need to get started.
+
-
-
-
-
- Tooling
+
+
+
+
+ Tooling
- This project is served and bundled with
- Vite . The recommended IDE
- setup is VSCode +
- Volar . If you need to test
- your components and web pages, check out
- Cypress and
- Cypress Component Testing .
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
-
+
- More instructions are available in README.md
.
-
+ More instructions are available in README.md
.
+
-
-
-
-
- Ecosystem
+
+
+
+
+ Ecosystem
- Get official tools and libraries for your project:
- Vuex ,
- Vue Router ,
- Vue Test Utils , and
- Vue Dev Tools . If you need more
- resources, we suggest paying
- Awesome Vue
- a visit.
-
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
-
-
-
-
- Community
+
+
+
+
+ Community
- Got stuck? Ask your question on
- Vue Land , our official Discord server, or
- StackOverflow .
- You should also subscribe to
- our mailing list and follow the official
- @vuejs
- twitter account for latest news in the Vue world.
-
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
-
-
-
-
- Support Vue
+
+
+
+
+ Support Vue
- As an independent project, Vue relies on community backing for its sustainability. You can help
- us by
- becoming a sponsor .
-
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
diff --git a/typescript-pinia/src/components/icons/IconTooling.vue b/typescript-pinia/src/components/icons/IconTooling.vue
index 660598d7..07dc46b0 100644
--- a/typescript-pinia/src/components/icons/IconTooling.vue
+++ b/typescript-pinia/src/components/icons/IconTooling.vue
@@ -2,8 +2,6 @@
h(App)
+}).$mount('#app')
diff --git a/typescript-pinia/tsconfig.config.json b/typescript-pinia/tsconfig.config.json
new file mode 100644
index 00000000..c2d3a309
--- /dev/null
+++ b/typescript-pinia/tsconfig.config.json
@@ -0,0 +1,8 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.node.json",
+ "include": ["vite.config.*", "vitest.config.*", "cypress.config.*"],
+ "compilerOptions": {
+ "composite": true,
+ "types": ["node"]
+ }
+}
diff --git a/typescript-pinia/tsconfig.json b/typescript-pinia/tsconfig.json
index 8c707192..8d235999 100644
--- a/typescript-pinia/tsconfig.json
+++ b/typescript-pinia/tsconfig.json
@@ -1,21 +1,16 @@
{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
"compilerOptions": {
- "baseUrl": "./",
- "target": "esnext",
- "useDefineForClassFields": true,
- "module": "esnext",
- "moduleResolution": "node",
- "isolatedModules": true,
- "strict": true,
- "jsx": "preserve",
- "sourceMap": true,
- "resolveJsonModule": true,
- "esModuleInterop": true,
+ "baseUrl": ".",
"paths": {
- "@/*": ["src/*"]
- },
- "lib": ["esnext", "dom", "dom.iterable", "scripthost"],
- "skipLibCheck": true
+ "@/*": ["./src/*"]
+ }
},
- "include": ["vite.config.*", "env.d.ts", "src/**/*", "src/**/*.vue"]
+
+ "references": [
+ {
+ "path": "./tsconfig.config.json"
+ }
+ ]
}
diff --git a/typescript-pinia/vite.config.ts b/typescript-pinia/vite.config.ts
index 5cd06c63..d4945079 100644
--- a/typescript-pinia/vite.config.ts
+++ b/typescript-pinia/vite.config.ts
@@ -1,11 +1,18 @@
-import { fileURLToPath } from 'url'
+import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vite'
-import vue from '@vitejs/plugin-vue'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
// https://vitejs.dev/config/
export default defineConfig({
- plugins: [vue()],
+ plugins: [
+ vue2(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
diff --git a/typescript-router-cypress/.gitignore b/typescript-router-cypress/.gitignore
new file mode 100644
index 00000000..133da84e
--- /dev/null
+++ b/typescript-router-cypress/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/typescript-router-cypress/README.md b/typescript-router-cypress/README.md
new file mode 100644
index 00000000..84f73d07
--- /dev/null
+++ b/typescript-router-cypress/README.md
@@ -0,0 +1,53 @@
+# typescript-router-cypress
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[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).
+
+## Type Support for `.vue` Imports in TS
+
+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.
+
+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:
+
+1. Disable the built-in TypeScript Extension
+ 1) Run `Extensions: Show Built-in Extensions` from VSCode's command palette
+ 2) Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)`
+2. Reload the VSCode window by running `Developer: Reload Window` from the command palette.
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Type-Check, Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Headed Component Tests with [Cypress Component Testing](https://on.cypress.io/component)
+
+```sh
+pnpm test:unit # or `pnpm test:unit:ci` for headless testing
+```
+
+### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
+
+```sh
+pnpm build
+pnpm test:e2e # or `pnpm test:e2e:ci` for headless testing
+```
diff --git a/typescript-router-cypress/cypress.config.ts b/typescript-router-cypress/cypress.config.ts
new file mode 100644
index 00000000..c8fac129
--- /dev/null
+++ b/typescript-router-cypress/cypress.config.ts
@@ -0,0 +1,15 @@
+import { defineConfig } from 'cypress'
+
+export default defineConfig({
+ e2e: {
+ specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
+ baseUrl: 'http://localhost:4173/'
+ },
+ component: {
+ specPattern: 'src/**/__tests__/*.{cy,spec}.{js,ts,jsx,tsx}',
+ devServer: {
+ framework: 'vue',
+ bundler: 'vite'
+ }
+ }
+})
diff --git a/typescript-router-cypress/cypress/e2e/example.cy.ts b/typescript-router-cypress/cypress/e2e/example.cy.ts
new file mode 100644
index 00000000..7a8c909f
--- /dev/null
+++ b/typescript-router-cypress/cypress/e2e/example.cy.ts
@@ -0,0 +1,8 @@
+// https://docs.cypress.io/api/introduction/api.html
+
+describe('My First Test', () => {
+ it('visits the app root url', () => {
+ cy.visit('/')
+ cy.contains('h1', 'You did it!')
+ })
+})
diff --git a/typescript-router-cypress/cypress/e2e/tsconfig.json b/typescript-router-cypress/cypress/e2e/tsconfig.json
new file mode 100644
index 00000000..be213aef
--- /dev/null
+++ b/typescript-router-cypress/cypress/e2e/tsconfig.json
@@ -0,0 +1,10 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["./**/*", "../support/**/*"],
+ "compilerOptions": {
+ "isolatedModules": false,
+ "target": "es5",
+ "lib": ["es5", "dom"],
+ "types": ["cypress"]
+ }
+}
diff --git a/typescript-router-cypress/cypress/fixtures/example.json b/typescript-router-cypress/cypress/fixtures/example.json
new file mode 100644
index 00000000..02e42543
--- /dev/null
+++ b/typescript-router-cypress/cypress/fixtures/example.json
@@ -0,0 +1,5 @@
+{
+ "name": "Using fixtures to represent data",
+ "email": "hello@cypress.io",
+ "body": "Fixtures are a great way to mock data for responses to routes"
+}
diff --git a/typescript-router-cypress/cypress/support/commands.ts b/typescript-router-cypress/cypress/support/commands.ts
new file mode 100644
index 00000000..95857aea
--- /dev/null
+++ b/typescript-router-cypress/cypress/support/commands.ts
@@ -0,0 +1,37 @@
+///
+// ***********************************************
+// This example commands.ts shows you how to
+// create various custom commands and overwrite
+// existing commands.
+//
+// For more comprehensive examples of custom
+// commands please read more here:
+// https://on.cypress.io/custom-commands
+// ***********************************************
+//
+//
+// -- This is a parent command --
+// Cypress.Commands.add('login', (email, password) => { ... })
+//
+//
+// -- This is a child command --
+// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
+//
+//
+// -- This is a dual command --
+// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
+//
+//
+// -- This will overwrite an existing command --
+// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
+//
+// declare global {
+// namespace Cypress {
+// interface Chainable {
+// login(email: string, password: string): Chainable
+// drag(subject: string, options?: Partial): Chainable
+// dismiss(subject: string, options?: Partial): Chainable
+// visit(originalFn: CommandOriginalFn, url: string, options: Partial): Chainable
+// }
+// }
+// }
diff --git a/typescript-router-cypress/cypress/support/component-index.html b/typescript-router-cypress/cypress/support/component-index.html
new file mode 100644
index 00000000..5f9622ae
--- /dev/null
+++ b/typescript-router-cypress/cypress/support/component-index.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+ Components App
+
+
+
+
+
diff --git a/typescript-router-cypress/cypress/support/component.ts b/typescript-router-cypress/cypress/support/component.ts
new file mode 100644
index 00000000..f3d667e0
--- /dev/null
+++ b/typescript-router-cypress/cypress/support/component.ts
@@ -0,0 +1,42 @@
+// ***********************************************************
+// This example support/component.ts is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
+
+// Import global styles
+import '@/assets/main.css'
+
+import { mount } from 'cypress/vue2'
+
+// Augment the Cypress namespace to include type definitions for
+// your custom command.
+// Alternatively, can be defined in cypress/support/component.d.ts
+// with a at the top of your spec.
+declare global {
+ namespace Cypress {
+ interface Chainable {
+ mount: typeof mount
+ }
+ }
+}
+
+Cypress.Commands.add('mount', mount)
+
+// Example use:
+// cy.mount(MyComponent)
diff --git a/typescript-router-cypress/cypress/support/e2e.ts b/typescript-router-cypress/cypress/support/e2e.ts
new file mode 100644
index 00000000..d68db96d
--- /dev/null
+++ b/typescript-router-cypress/cypress/support/e2e.ts
@@ -0,0 +1,20 @@
+// ***********************************************************
+// This example support/index.js is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
diff --git a/typescript-router-cypress/env.d.ts b/typescript-router-cypress/env.d.ts
new file mode 100644
index 00000000..11f02fe2
--- /dev/null
+++ b/typescript-router-cypress/env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/typescript-router-cypress/index.html b/typescript-router-cypress/index.html
new file mode 100644
index 00000000..11603f87
--- /dev/null
+++ b/typescript-router-cypress/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/typescript-router-cypress/package.json b/typescript-router-cypress/package.json
new file mode 100644
index 00000000..4f0de86d
--- /dev/null
+++ b/typescript-router-cypress/package.json
@@ -0,0 +1,32 @@
+{
+ "name": "typescript-router-cypress",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "run-p type-check build-only",
+ "preview": "vite preview --port 4173",
+ "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
+ "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'",
+ "test:unit": "cypress open --component",
+ "test:unit:ci": "cypress run --component --quiet --reporter spec",
+ "build-only": "vite build",
+ "type-check": "vue-tsc --noEmit"
+ },
+ "dependencies": {
+ "vue": "^2.7.7",
+ "vue-router": "^3.5.4"
+ },
+ "devDependencies": {
+ "@types/node": "^16.11.45",
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vue/tsconfig": "^0.1.3",
+ "cypress": "^10.3.0",
+ "npm-run-all": "^4.1.5",
+ "start-server-and-test": "^1.14.0",
+ "terser": "^5.14.2",
+ "typescript": "~4.7.4",
+ "vite": "^3.0.2",
+ "vue-tsc": "^0.38.8"
+ }
+}
diff --git a/typescript-router-cypress/public/favicon.ico b/typescript-router-cypress/public/favicon.ico
new file mode 100644
index 00000000..df36fcfb
Binary files /dev/null and b/typescript-router-cypress/public/favicon.ico differ
diff --git a/typescript-router-cypress/src/App.vue b/typescript-router-cypress/src/App.vue
new file mode 100644
index 00000000..2745f550
--- /dev/null
+++ b/typescript-router-cypress/src/App.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+ Home
+ About
+
+
+
+
+
+
+
+
+
diff --git a/typescript-router-cypress/src/assets/base.css b/typescript-router-cypress/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/typescript-router-cypress/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/typescript-router-cypress/src/assets/logo.svg b/typescript-router-cypress/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/typescript-router-cypress/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/typescript-router-cypress/src/assets/main.css b/typescript-router-cypress/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/typescript-router-cypress/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/typescript-router-cypress/src/components/HelloWorld.vue b/typescript-router-cypress/src/components/HelloWorld.vue
new file mode 100644
index 00000000..bf0a052f
--- /dev/null
+++ b/typescript-router-cypress/src/components/HelloWorld.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 . What's next?
+
+
+
+
+
diff --git a/typescript-router-cypress/src/components/TheWelcome.vue b/typescript-router-cypress/src/components/TheWelcome.vue
new file mode 100644
index 00000000..51d12392
--- /dev/null
+++ b/typescript-router-cypress/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/typescript-router-cypress/src/components/WelcomeItem.vue b/typescript-router-cypress/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/typescript-router-cypress/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/typescript-router-cypress/src/components/__tests__/HelloWorld.cy.ts b/typescript-router-cypress/src/components/__tests__/HelloWorld.cy.ts
new file mode 100644
index 00000000..0e0c065a
--- /dev/null
+++ b/typescript-router-cypress/src/components/__tests__/HelloWorld.cy.ts
@@ -0,0 +1,12 @@
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('playground', () => {
+ cy.mount(HelloWorld, { propsData: { msg: 'Hello Cypress' } })
+ })
+
+ it('renders properly', () => {
+ cy.mount(HelloWorld, { propsData: { msg: 'Hello Cypress' } })
+ cy.get('h1').should('contain', 'Hello Cypress')
+ })
+})
diff --git a/typescript-router-cypress/src/components/icons/IconCommunity.vue b/typescript-router-cypress/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/typescript-router-cypress/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-router-cypress/src/components/icons/IconDocumentation.vue b/typescript-router-cypress/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/typescript-router-cypress/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-router-cypress/src/components/icons/IconEcosystem.vue b/typescript-router-cypress/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/typescript-router-cypress/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-router-cypress/src/components/icons/IconSupport.vue b/typescript-router-cypress/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/typescript-router-cypress/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-router-cypress/src/components/icons/IconTooling.vue b/typescript-router-cypress/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/typescript-router-cypress/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/typescript-router-cypress/src/main.ts b/typescript-router-cypress/src/main.ts
new file mode 100644
index 00000000..4919cf77
--- /dev/null
+++ b/typescript-router-cypress/src/main.ts
@@ -0,0 +1,11 @@
+import Vue from 'vue'
+
+import App from './App.vue'
+import router from './router'
+
+import './assets/main.css'
+
+new Vue({
+ router,
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/typescript-router-cypress/src/router/index.ts b/typescript-router-cypress/src/router/index.ts
new file mode 100644
index 00000000..cf9820b0
--- /dev/null
+++ b/typescript-router-cypress/src/router/index.ts
@@ -0,0 +1,27 @@
+import Vue from 'vue'
+import VueRouter from 'vue-router'
+import HomeView from '../views/HomeView.vue'
+
+Vue.use(VueRouter)
+
+const router = new VueRouter({
+ mode: 'history',
+ base: import.meta.env.BASE_URL,
+ routes: [
+ {
+ path: '/',
+ name: 'home',
+ component: HomeView
+ },
+ {
+ path: '/about',
+ name: 'about',
+ // route level code-splitting
+ // this generates a separate chunk (About.[hash].js) for this route
+ // which is lazy-loaded when the route is visited.
+ component: () => import('../views/AboutView.vue')
+ }
+ ]
+})
+
+export default router
diff --git a/typescript-router-cypress/src/views/AboutView.vue b/typescript-router-cypress/src/views/AboutView.vue
new file mode 100644
index 00000000..756ad2a1
--- /dev/null
+++ b/typescript-router-cypress/src/views/AboutView.vue
@@ -0,0 +1,15 @@
+
+
+
This is an about page
+
+
+
+
diff --git a/typescript-router-cypress/src/views/HomeView.vue b/typescript-router-cypress/src/views/HomeView.vue
new file mode 100644
index 00000000..6555a646
--- /dev/null
+++ b/typescript-router-cypress/src/views/HomeView.vue
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/typescript-router-cypress/tsconfig.app.json b/typescript-router-cypress/tsconfig.app.json
new file mode 100644
index 00000000..cdbea1d7
--- /dev/null
+++ b/typescript-router-cypress/tsconfig.app.json
@@ -0,0 +1,12 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
+ "exclude": ["src/**/__tests__/*"],
+ "compilerOptions": {
+ "composite": true,
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ }
+}
diff --git a/typescript-router-cypress/tsconfig.config.json b/typescript-router-cypress/tsconfig.config.json
new file mode 100644
index 00000000..c2d3a309
--- /dev/null
+++ b/typescript-router-cypress/tsconfig.config.json
@@ -0,0 +1,8 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.node.json",
+ "include": ["vite.config.*", "vitest.config.*", "cypress.config.*"],
+ "compilerOptions": {
+ "composite": true,
+ "types": ["node"]
+ }
+}
diff --git a/typescript-router-cypress/tsconfig.cypress-ct.json b/typescript-router-cypress/tsconfig.cypress-ct.json
new file mode 100644
index 00000000..29cbaa47
--- /dev/null
+++ b/typescript-router-cypress/tsconfig.cypress-ct.json
@@ -0,0 +1,8 @@
+{
+ "extends": "./tsconfig.app.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue", "cypress/support/component.*"],
+ "exclude": [],
+ "compilerOptions": {
+ "composite": true
+ }
+}
diff --git a/typescript-router-cypress/tsconfig.json b/typescript-router-cypress/tsconfig.json
new file mode 100644
index 00000000..040665bb
--- /dev/null
+++ b/typescript-router-cypress/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "files": [],
+ "references": [
+ {
+ "path": "./tsconfig.config.json"
+ },
+ {
+ "path": "./tsconfig.app.json"
+ },
+ {
+ "path": "./tsconfig.cypress-ct.json"
+ }
+ ]
+}
diff --git a/typescript-router-cypress/vite.config.ts b/typescript-router-cypress/vite.config.ts
new file mode 100644
index 00000000..d4945079
--- /dev/null
+++ b/typescript-router-cypress/vite.config.ts
@@ -0,0 +1,21 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/typescript-router-pinia-cypress/.gitignore b/typescript-router-pinia-cypress/.gitignore
new file mode 100644
index 00000000..133da84e
--- /dev/null
+++ b/typescript-router-pinia-cypress/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/typescript-router-pinia-cypress/README.md b/typescript-router-pinia-cypress/README.md
new file mode 100644
index 00000000..2bf32fb6
--- /dev/null
+++ b/typescript-router-pinia-cypress/README.md
@@ -0,0 +1,53 @@
+# typescript-router-pinia-cypress
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[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).
+
+## Type Support for `.vue` Imports in TS
+
+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.
+
+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:
+
+1. Disable the built-in TypeScript Extension
+ 1) Run `Extensions: Show Built-in Extensions` from VSCode's command palette
+ 2) Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)`
+2. Reload the VSCode window by running `Developer: Reload Window` from the command palette.
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Type-Check, Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Headed Component Tests with [Cypress Component Testing](https://on.cypress.io/component)
+
+```sh
+pnpm test:unit # or `pnpm test:unit:ci` for headless testing
+```
+
+### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
+
+```sh
+pnpm build
+pnpm test:e2e # or `pnpm test:e2e:ci` for headless testing
+```
diff --git a/typescript-router-pinia-cypress/cypress.config.ts b/typescript-router-pinia-cypress/cypress.config.ts
new file mode 100644
index 00000000..c8fac129
--- /dev/null
+++ b/typescript-router-pinia-cypress/cypress.config.ts
@@ -0,0 +1,15 @@
+import { defineConfig } from 'cypress'
+
+export default defineConfig({
+ e2e: {
+ specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
+ baseUrl: 'http://localhost:4173/'
+ },
+ component: {
+ specPattern: 'src/**/__tests__/*.{cy,spec}.{js,ts,jsx,tsx}',
+ devServer: {
+ framework: 'vue',
+ bundler: 'vite'
+ }
+ }
+})
diff --git a/typescript-router-pinia-cypress/cypress/e2e/example.cy.ts b/typescript-router-pinia-cypress/cypress/e2e/example.cy.ts
new file mode 100644
index 00000000..7a8c909f
--- /dev/null
+++ b/typescript-router-pinia-cypress/cypress/e2e/example.cy.ts
@@ -0,0 +1,8 @@
+// https://docs.cypress.io/api/introduction/api.html
+
+describe('My First Test', () => {
+ it('visits the app root url', () => {
+ cy.visit('/')
+ cy.contains('h1', 'You did it!')
+ })
+})
diff --git a/typescript-router-pinia-cypress/cypress/e2e/tsconfig.json b/typescript-router-pinia-cypress/cypress/e2e/tsconfig.json
new file mode 100644
index 00000000..be213aef
--- /dev/null
+++ b/typescript-router-pinia-cypress/cypress/e2e/tsconfig.json
@@ -0,0 +1,10 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["./**/*", "../support/**/*"],
+ "compilerOptions": {
+ "isolatedModules": false,
+ "target": "es5",
+ "lib": ["es5", "dom"],
+ "types": ["cypress"]
+ }
+}
diff --git a/typescript-router-pinia-cypress/cypress/fixtures/example.json b/typescript-router-pinia-cypress/cypress/fixtures/example.json
new file mode 100644
index 00000000..02e42543
--- /dev/null
+++ b/typescript-router-pinia-cypress/cypress/fixtures/example.json
@@ -0,0 +1,5 @@
+{
+ "name": "Using fixtures to represent data",
+ "email": "hello@cypress.io",
+ "body": "Fixtures are a great way to mock data for responses to routes"
+}
diff --git a/typescript-router-pinia-cypress/cypress/support/commands.ts b/typescript-router-pinia-cypress/cypress/support/commands.ts
new file mode 100644
index 00000000..95857aea
--- /dev/null
+++ b/typescript-router-pinia-cypress/cypress/support/commands.ts
@@ -0,0 +1,37 @@
+///
+// ***********************************************
+// This example commands.ts shows you how to
+// create various custom commands and overwrite
+// existing commands.
+//
+// For more comprehensive examples of custom
+// commands please read more here:
+// https://on.cypress.io/custom-commands
+// ***********************************************
+//
+//
+// -- This is a parent command --
+// Cypress.Commands.add('login', (email, password) => { ... })
+//
+//
+// -- This is a child command --
+// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
+//
+//
+// -- This is a dual command --
+// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
+//
+//
+// -- This will overwrite an existing command --
+// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
+//
+// declare global {
+// namespace Cypress {
+// interface Chainable {
+// login(email: string, password: string): Chainable
+// drag(subject: string, options?: Partial): Chainable
+// dismiss(subject: string, options?: Partial): Chainable
+// visit(originalFn: CommandOriginalFn, url: string, options: Partial): Chainable
+// }
+// }
+// }
diff --git a/typescript-router-pinia-cypress/cypress/support/component-index.html b/typescript-router-pinia-cypress/cypress/support/component-index.html
new file mode 100644
index 00000000..5f9622ae
--- /dev/null
+++ b/typescript-router-pinia-cypress/cypress/support/component-index.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+ Components App
+
+
+
+
+
diff --git a/typescript-router-pinia-cypress/cypress/support/component.ts b/typescript-router-pinia-cypress/cypress/support/component.ts
new file mode 100644
index 00000000..f3d667e0
--- /dev/null
+++ b/typescript-router-pinia-cypress/cypress/support/component.ts
@@ -0,0 +1,42 @@
+// ***********************************************************
+// This example support/component.ts is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
+
+// Import global styles
+import '@/assets/main.css'
+
+import { mount } from 'cypress/vue2'
+
+// Augment the Cypress namespace to include type definitions for
+// your custom command.
+// Alternatively, can be defined in cypress/support/component.d.ts
+// with a at the top of your spec.
+declare global {
+ namespace Cypress {
+ interface Chainable {
+ mount: typeof mount
+ }
+ }
+}
+
+Cypress.Commands.add('mount', mount)
+
+// Example use:
+// cy.mount(MyComponent)
diff --git a/typescript-router-pinia-cypress/cypress/support/e2e.ts b/typescript-router-pinia-cypress/cypress/support/e2e.ts
new file mode 100644
index 00000000..d68db96d
--- /dev/null
+++ b/typescript-router-pinia-cypress/cypress/support/e2e.ts
@@ -0,0 +1,20 @@
+// ***********************************************************
+// This example support/index.js is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
diff --git a/typescript-router-pinia-cypress/env.d.ts b/typescript-router-pinia-cypress/env.d.ts
new file mode 100644
index 00000000..11f02fe2
--- /dev/null
+++ b/typescript-router-pinia-cypress/env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/typescript-router-pinia-cypress/index.html b/typescript-router-pinia-cypress/index.html
new file mode 100644
index 00000000..11603f87
--- /dev/null
+++ b/typescript-router-pinia-cypress/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/typescript-router-pinia-cypress/package.json b/typescript-router-pinia-cypress/package.json
new file mode 100644
index 00000000..e2434d08
--- /dev/null
+++ b/typescript-router-pinia-cypress/package.json
@@ -0,0 +1,33 @@
+{
+ "name": "typescript-router-pinia-cypress",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "run-p type-check build-only",
+ "preview": "vite preview --port 4173",
+ "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
+ "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'",
+ "test:unit": "cypress open --component",
+ "test:unit:ci": "cypress run --component --quiet --reporter spec",
+ "build-only": "vite build",
+ "type-check": "vue-tsc --noEmit"
+ },
+ "dependencies": {
+ "pinia": "^2.0.16",
+ "vue": "^2.7.7",
+ "vue-router": "^3.5.4"
+ },
+ "devDependencies": {
+ "@types/node": "^16.11.45",
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vue/tsconfig": "^0.1.3",
+ "cypress": "^10.3.0",
+ "npm-run-all": "^4.1.5",
+ "start-server-and-test": "^1.14.0",
+ "terser": "^5.14.2",
+ "typescript": "~4.7.4",
+ "vite": "^3.0.2",
+ "vue-tsc": "^0.38.8"
+ }
+}
diff --git a/typescript-router-pinia-cypress/public/favicon.ico b/typescript-router-pinia-cypress/public/favicon.ico
new file mode 100644
index 00000000..df36fcfb
Binary files /dev/null and b/typescript-router-pinia-cypress/public/favicon.ico differ
diff --git a/typescript-router-pinia-cypress/src/App.vue b/typescript-router-pinia-cypress/src/App.vue
new file mode 100644
index 00000000..2745f550
--- /dev/null
+++ b/typescript-router-pinia-cypress/src/App.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+ Home
+ About
+
+
+
+
+
+
+
+
+
diff --git a/typescript-router-pinia-cypress/src/assets/base.css b/typescript-router-pinia-cypress/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/typescript-router-pinia-cypress/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/typescript-router-pinia-cypress/src/assets/logo.svg b/typescript-router-pinia-cypress/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/typescript-router-pinia-cypress/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/typescript-router-pinia-cypress/src/assets/main.css b/typescript-router-pinia-cypress/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/typescript-router-pinia-cypress/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/typescript-router-pinia-cypress/src/components/HelloWorld.vue b/typescript-router-pinia-cypress/src/components/HelloWorld.vue
new file mode 100644
index 00000000..bf0a052f
--- /dev/null
+++ b/typescript-router-pinia-cypress/src/components/HelloWorld.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 . What's next?
+
+
+
+
+
diff --git a/typescript-router-pinia-cypress/src/components/TheWelcome.vue b/typescript-router-pinia-cypress/src/components/TheWelcome.vue
new file mode 100644
index 00000000..51d12392
--- /dev/null
+++ b/typescript-router-pinia-cypress/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/typescript-router-pinia-cypress/src/components/WelcomeItem.vue b/typescript-router-pinia-cypress/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/typescript-router-pinia-cypress/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/typescript-router-pinia-cypress/src/components/__tests__/HelloWorld.cy.ts b/typescript-router-pinia-cypress/src/components/__tests__/HelloWorld.cy.ts
new file mode 100644
index 00000000..0e0c065a
--- /dev/null
+++ b/typescript-router-pinia-cypress/src/components/__tests__/HelloWorld.cy.ts
@@ -0,0 +1,12 @@
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('playground', () => {
+ cy.mount(HelloWorld, { propsData: { msg: 'Hello Cypress' } })
+ })
+
+ it('renders properly', () => {
+ cy.mount(HelloWorld, { propsData: { msg: 'Hello Cypress' } })
+ cy.get('h1').should('contain', 'Hello Cypress')
+ })
+})
diff --git a/typescript-router-pinia-cypress/src/components/icons/IconCommunity.vue b/typescript-router-pinia-cypress/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/typescript-router-pinia-cypress/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-router-pinia-cypress/src/components/icons/IconDocumentation.vue b/typescript-router-pinia-cypress/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/typescript-router-pinia-cypress/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-router-pinia-cypress/src/components/icons/IconEcosystem.vue b/typescript-router-pinia-cypress/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/typescript-router-pinia-cypress/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-router-pinia-cypress/src/components/icons/IconSupport.vue b/typescript-router-pinia-cypress/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/typescript-router-pinia-cypress/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-router-pinia-cypress/src/components/icons/IconTooling.vue b/typescript-router-pinia-cypress/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/typescript-router-pinia-cypress/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/typescript-router-pinia-cypress/src/main.ts b/typescript-router-pinia-cypress/src/main.ts
new file mode 100644
index 00000000..e11e78e0
--- /dev/null
+++ b/typescript-router-pinia-cypress/src/main.ts
@@ -0,0 +1,15 @@
+import Vue from 'vue'
+import { createPinia, PiniaVuePlugin } from 'pinia'
+
+import App from './App.vue'
+import router from './router'
+
+import './assets/main.css'
+
+Vue.use(PiniaVuePlugin)
+
+new Vue({
+ router,
+ pinia: createPinia(),
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/typescript-router-pinia-cypress/src/router/index.ts b/typescript-router-pinia-cypress/src/router/index.ts
new file mode 100644
index 00000000..cf9820b0
--- /dev/null
+++ b/typescript-router-pinia-cypress/src/router/index.ts
@@ -0,0 +1,27 @@
+import Vue from 'vue'
+import VueRouter from 'vue-router'
+import HomeView from '../views/HomeView.vue'
+
+Vue.use(VueRouter)
+
+const router = new VueRouter({
+ mode: 'history',
+ base: import.meta.env.BASE_URL,
+ routes: [
+ {
+ path: '/',
+ name: 'home',
+ component: HomeView
+ },
+ {
+ path: '/about',
+ name: 'about',
+ // route level code-splitting
+ // this generates a separate chunk (About.[hash].js) for this route
+ // which is lazy-loaded when the route is visited.
+ component: () => import('../views/AboutView.vue')
+ }
+ ]
+})
+
+export default router
diff --git a/typescript-router-pinia-cypress/src/stores/counter.ts b/typescript-router-pinia-cypress/src/stores/counter.ts
new file mode 100644
index 00000000..4a2d2427
--- /dev/null
+++ b/typescript-router-pinia-cypress/src/stores/counter.ts
@@ -0,0 +1,16 @@
+import { defineStore } from 'pinia'
+
+export const useCounterStore = defineStore({
+ id: 'counter',
+ state: () => ({
+ counter: 0
+ }),
+ getters: {
+ doubleCount: (state) => state.counter * 2
+ },
+ actions: {
+ increment() {
+ this.counter++
+ }
+ }
+})
diff --git a/typescript-router-pinia-cypress/src/views/AboutView.vue b/typescript-router-pinia-cypress/src/views/AboutView.vue
new file mode 100644
index 00000000..756ad2a1
--- /dev/null
+++ b/typescript-router-pinia-cypress/src/views/AboutView.vue
@@ -0,0 +1,15 @@
+
+
+
This is an about page
+
+
+
+
diff --git a/typescript-router-pinia-cypress/src/views/HomeView.vue b/typescript-router-pinia-cypress/src/views/HomeView.vue
new file mode 100644
index 00000000..6555a646
--- /dev/null
+++ b/typescript-router-pinia-cypress/src/views/HomeView.vue
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/typescript-router-pinia-cypress/tsconfig.app.json b/typescript-router-pinia-cypress/tsconfig.app.json
new file mode 100644
index 00000000..cdbea1d7
--- /dev/null
+++ b/typescript-router-pinia-cypress/tsconfig.app.json
@@ -0,0 +1,12 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
+ "exclude": ["src/**/__tests__/*"],
+ "compilerOptions": {
+ "composite": true,
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ }
+}
diff --git a/typescript-router-pinia-cypress/tsconfig.config.json b/typescript-router-pinia-cypress/tsconfig.config.json
new file mode 100644
index 00000000..c2d3a309
--- /dev/null
+++ b/typescript-router-pinia-cypress/tsconfig.config.json
@@ -0,0 +1,8 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.node.json",
+ "include": ["vite.config.*", "vitest.config.*", "cypress.config.*"],
+ "compilerOptions": {
+ "composite": true,
+ "types": ["node"]
+ }
+}
diff --git a/typescript-router-pinia-cypress/tsconfig.cypress-ct.json b/typescript-router-pinia-cypress/tsconfig.cypress-ct.json
new file mode 100644
index 00000000..29cbaa47
--- /dev/null
+++ b/typescript-router-pinia-cypress/tsconfig.cypress-ct.json
@@ -0,0 +1,8 @@
+{
+ "extends": "./tsconfig.app.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue", "cypress/support/component.*"],
+ "exclude": [],
+ "compilerOptions": {
+ "composite": true
+ }
+}
diff --git a/typescript-router-pinia-cypress/tsconfig.json b/typescript-router-pinia-cypress/tsconfig.json
new file mode 100644
index 00000000..040665bb
--- /dev/null
+++ b/typescript-router-pinia-cypress/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "files": [],
+ "references": [
+ {
+ "path": "./tsconfig.config.json"
+ },
+ {
+ "path": "./tsconfig.app.json"
+ },
+ {
+ "path": "./tsconfig.cypress-ct.json"
+ }
+ ]
+}
diff --git a/typescript-router-pinia-cypress/vite.config.ts b/typescript-router-pinia-cypress/vite.config.ts
new file mode 100644
index 00000000..d4945079
--- /dev/null
+++ b/typescript-router-pinia-cypress/vite.config.ts
@@ -0,0 +1,21 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/typescript-router-pinia-vitest-cypress/.gitignore b/typescript-router-pinia-vitest-cypress/.gitignore
new file mode 100644
index 00000000..133da84e
--- /dev/null
+++ b/typescript-router-pinia-vitest-cypress/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/typescript-router-pinia-vitest-cypress/README.md b/typescript-router-pinia-vitest-cypress/README.md
new file mode 100644
index 00000000..a97b797b
--- /dev/null
+++ b/typescript-router-pinia-vitest-cypress/README.md
@@ -0,0 +1,53 @@
+# typescript-router-pinia-vitest-cypress
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[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).
+
+## Type Support for `.vue` Imports in TS
+
+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.
+
+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:
+
+1. Disable the built-in TypeScript Extension
+ 1) Run `Extensions: Show Built-in Extensions` from VSCode's command palette
+ 2) Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)`
+2. Reload the VSCode window by running `Developer: Reload Window` from the command palette.
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Type-Check, Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Unit Tests with [Vitest](https://vitest.dev/)
+
+```sh
+pnpm test:unit
+```
+
+### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
+
+```sh
+pnpm build
+pnpm test:e2e # or `pnpm test:e2e:ci` for headless testing
+```
diff --git a/typescript-router-pinia-vitest-cypress/cypress.config.ts b/typescript-router-pinia-vitest-cypress/cypress.config.ts
new file mode 100644
index 00000000..0f66080f
--- /dev/null
+++ b/typescript-router-pinia-vitest-cypress/cypress.config.ts
@@ -0,0 +1,8 @@
+import { defineConfig } from 'cypress'
+
+export default defineConfig({
+ e2e: {
+ specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
+ baseUrl: 'http://localhost:4173/'
+ }
+})
diff --git a/typescript-router-pinia-vitest-cypress/cypress/e2e/example.cy.ts b/typescript-router-pinia-vitest-cypress/cypress/e2e/example.cy.ts
new file mode 100644
index 00000000..7a8c909f
--- /dev/null
+++ b/typescript-router-pinia-vitest-cypress/cypress/e2e/example.cy.ts
@@ -0,0 +1,8 @@
+// https://docs.cypress.io/api/introduction/api.html
+
+describe('My First Test', () => {
+ it('visits the app root url', () => {
+ cy.visit('/')
+ cy.contains('h1', 'You did it!')
+ })
+})
diff --git a/typescript-router-pinia-vitest-cypress/cypress/e2e/tsconfig.json b/typescript-router-pinia-vitest-cypress/cypress/e2e/tsconfig.json
new file mode 100644
index 00000000..be213aef
--- /dev/null
+++ b/typescript-router-pinia-vitest-cypress/cypress/e2e/tsconfig.json
@@ -0,0 +1,10 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["./**/*", "../support/**/*"],
+ "compilerOptions": {
+ "isolatedModules": false,
+ "target": "es5",
+ "lib": ["es5", "dom"],
+ "types": ["cypress"]
+ }
+}
diff --git a/typescript-router-pinia-vitest-cypress/cypress/fixtures/example.json b/typescript-router-pinia-vitest-cypress/cypress/fixtures/example.json
new file mode 100644
index 00000000..02e42543
--- /dev/null
+++ b/typescript-router-pinia-vitest-cypress/cypress/fixtures/example.json
@@ -0,0 +1,5 @@
+{
+ "name": "Using fixtures to represent data",
+ "email": "hello@cypress.io",
+ "body": "Fixtures are a great way to mock data for responses to routes"
+}
diff --git a/typescript-router-pinia-vitest-cypress/cypress/support/commands.ts b/typescript-router-pinia-vitest-cypress/cypress/support/commands.ts
new file mode 100644
index 00000000..95857aea
--- /dev/null
+++ b/typescript-router-pinia-vitest-cypress/cypress/support/commands.ts
@@ -0,0 +1,37 @@
+///
+// ***********************************************
+// This example commands.ts shows you how to
+// create various custom commands and overwrite
+// existing commands.
+//
+// For more comprehensive examples of custom
+// commands please read more here:
+// https://on.cypress.io/custom-commands
+// ***********************************************
+//
+//
+// -- This is a parent command --
+// Cypress.Commands.add('login', (email, password) => { ... })
+//
+//
+// -- This is a child command --
+// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
+//
+//
+// -- This is a dual command --
+// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
+//
+//
+// -- This will overwrite an existing command --
+// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
+//
+// declare global {
+// namespace Cypress {
+// interface Chainable {
+// login(email: string, password: string): Chainable
+// drag(subject: string, options?: Partial): Chainable
+// dismiss(subject: string, options?: Partial): Chainable
+// visit(originalFn: CommandOriginalFn, url: string, options: Partial): Chainable
+// }
+// }
+// }
diff --git a/typescript-router-pinia-vitest-cypress/cypress/support/e2e.ts b/typescript-router-pinia-vitest-cypress/cypress/support/e2e.ts
new file mode 100644
index 00000000..d68db96d
--- /dev/null
+++ b/typescript-router-pinia-vitest-cypress/cypress/support/e2e.ts
@@ -0,0 +1,20 @@
+// ***********************************************************
+// This example support/index.js is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
diff --git a/typescript-router-pinia-vitest-cypress/env.d.ts b/typescript-router-pinia-vitest-cypress/env.d.ts
new file mode 100644
index 00000000..11f02fe2
--- /dev/null
+++ b/typescript-router-pinia-vitest-cypress/env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/typescript-router-pinia-vitest-cypress/index.html b/typescript-router-pinia-vitest-cypress/index.html
new file mode 100644
index 00000000..11603f87
--- /dev/null
+++ b/typescript-router-pinia-vitest-cypress/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/typescript-router-pinia-vitest-cypress/package.json b/typescript-router-pinia-vitest-cypress/package.json
new file mode 100644
index 00000000..6b5c4d48
--- /dev/null
+++ b/typescript-router-pinia-vitest-cypress/package.json
@@ -0,0 +1,37 @@
+{
+ "name": "typescript-router-pinia-vitest-cypress",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "run-p type-check build-only",
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom",
+ "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
+ "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'",
+ "build-only": "vite build",
+ "type-check": "vue-tsc --noEmit -p tsconfig.vitest.json --composite false"
+ },
+ "dependencies": {
+ "pinia": "^2.0.16",
+ "vue": "^2.7.7",
+ "vue-router": "^3.5.4"
+ },
+ "devDependencies": {
+ "@types/jsdom": "^16.2.14",
+ "@types/node": "^16.11.45",
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vue/test-utils": "^1.3.0",
+ "@vue/tsconfig": "^0.1.3",
+ "cypress": "^10.3.0",
+ "jsdom": "^20.0.0",
+ "npm-run-all": "^4.1.5",
+ "start-server-and-test": "^1.14.0",
+ "terser": "^5.14.2",
+ "typescript": "~4.7.4",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7",
+ "vue-tsc": "^0.38.8"
+ }
+}
diff --git a/typescript-router-pinia-vitest-cypress/public/favicon.ico b/typescript-router-pinia-vitest-cypress/public/favicon.ico
new file mode 100644
index 00000000..df36fcfb
Binary files /dev/null and b/typescript-router-pinia-vitest-cypress/public/favicon.ico differ
diff --git a/typescript-router-pinia-vitest-cypress/src/App.vue b/typescript-router-pinia-vitest-cypress/src/App.vue
new file mode 100644
index 00000000..2745f550
--- /dev/null
+++ b/typescript-router-pinia-vitest-cypress/src/App.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+ Home
+ About
+
+
+
+
+
+
+
+
+
diff --git a/typescript-router-pinia-vitest-cypress/src/assets/base.css b/typescript-router-pinia-vitest-cypress/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/typescript-router-pinia-vitest-cypress/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/typescript-router-pinia-vitest-cypress/src/assets/logo.svg b/typescript-router-pinia-vitest-cypress/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/typescript-router-pinia-vitest-cypress/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/typescript-router-pinia-vitest-cypress/src/assets/main.css b/typescript-router-pinia-vitest-cypress/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/typescript-router-pinia-vitest-cypress/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/typescript-router-pinia-vitest-cypress/src/components/HelloWorld.vue b/typescript-router-pinia-vitest-cypress/src/components/HelloWorld.vue
new file mode 100644
index 00000000..bf0a052f
--- /dev/null
+++ b/typescript-router-pinia-vitest-cypress/src/components/HelloWorld.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 . What's next?
+
+
+
+
+
diff --git a/typescript-router-pinia-vitest-cypress/src/components/TheWelcome.vue b/typescript-router-pinia-vitest-cypress/src/components/TheWelcome.vue
new file mode 100644
index 00000000..51d12392
--- /dev/null
+++ b/typescript-router-pinia-vitest-cypress/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/typescript-router-pinia-vitest-cypress/src/components/WelcomeItem.vue b/typescript-router-pinia-vitest-cypress/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/typescript-router-pinia-vitest-cypress/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/typescript-router-pinia-vitest-cypress/src/components/__tests__/HelloWorld.spec.ts b/typescript-router-pinia-vitest-cypress/src/components/__tests__/HelloWorld.spec.ts
new file mode 100644
index 00000000..293bf197
--- /dev/null
+++ b/typescript-router-pinia-vitest-cypress/src/components/__tests__/HelloWorld.spec.ts
@@ -0,0 +1,11 @@
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('renders properly', () => {
+ const wrapper = mount(HelloWorld, { propsData: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
+ })
+})
diff --git a/typescript-router-pinia-vitest-cypress/src/components/icons/IconCommunity.vue b/typescript-router-pinia-vitest-cypress/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/typescript-router-pinia-vitest-cypress/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-router-pinia-vitest-cypress/src/components/icons/IconDocumentation.vue b/typescript-router-pinia-vitest-cypress/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/typescript-router-pinia-vitest-cypress/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-router-pinia-vitest-cypress/src/components/icons/IconEcosystem.vue b/typescript-router-pinia-vitest-cypress/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/typescript-router-pinia-vitest-cypress/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-router-pinia-vitest-cypress/src/components/icons/IconSupport.vue b/typescript-router-pinia-vitest-cypress/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/typescript-router-pinia-vitest-cypress/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-router-pinia-vitest-cypress/src/components/icons/IconTooling.vue b/typescript-router-pinia-vitest-cypress/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/typescript-router-pinia-vitest-cypress/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/typescript-router-pinia-vitest-cypress/src/main.ts b/typescript-router-pinia-vitest-cypress/src/main.ts
new file mode 100644
index 00000000..e11e78e0
--- /dev/null
+++ b/typescript-router-pinia-vitest-cypress/src/main.ts
@@ -0,0 +1,15 @@
+import Vue from 'vue'
+import { createPinia, PiniaVuePlugin } from 'pinia'
+
+import App from './App.vue'
+import router from './router'
+
+import './assets/main.css'
+
+Vue.use(PiniaVuePlugin)
+
+new Vue({
+ router,
+ pinia: createPinia(),
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/typescript-router-pinia-vitest-cypress/src/router/index.ts b/typescript-router-pinia-vitest-cypress/src/router/index.ts
new file mode 100644
index 00000000..cf9820b0
--- /dev/null
+++ b/typescript-router-pinia-vitest-cypress/src/router/index.ts
@@ -0,0 +1,27 @@
+import Vue from 'vue'
+import VueRouter from 'vue-router'
+import HomeView from '../views/HomeView.vue'
+
+Vue.use(VueRouter)
+
+const router = new VueRouter({
+ mode: 'history',
+ base: import.meta.env.BASE_URL,
+ routes: [
+ {
+ path: '/',
+ name: 'home',
+ component: HomeView
+ },
+ {
+ path: '/about',
+ name: 'about',
+ // route level code-splitting
+ // this generates a separate chunk (About.[hash].js) for this route
+ // which is lazy-loaded when the route is visited.
+ component: () => import('../views/AboutView.vue')
+ }
+ ]
+})
+
+export default router
diff --git a/typescript-router-pinia-vitest-cypress/src/stores/counter.ts b/typescript-router-pinia-vitest-cypress/src/stores/counter.ts
new file mode 100644
index 00000000..4a2d2427
--- /dev/null
+++ b/typescript-router-pinia-vitest-cypress/src/stores/counter.ts
@@ -0,0 +1,16 @@
+import { defineStore } from 'pinia'
+
+export const useCounterStore = defineStore({
+ id: 'counter',
+ state: () => ({
+ counter: 0
+ }),
+ getters: {
+ doubleCount: (state) => state.counter * 2
+ },
+ actions: {
+ increment() {
+ this.counter++
+ }
+ }
+})
diff --git a/typescript-router-pinia-vitest-cypress/src/views/AboutView.vue b/typescript-router-pinia-vitest-cypress/src/views/AboutView.vue
new file mode 100644
index 00000000..756ad2a1
--- /dev/null
+++ b/typescript-router-pinia-vitest-cypress/src/views/AboutView.vue
@@ -0,0 +1,15 @@
+
+
+
This is an about page
+
+
+
+
diff --git a/typescript-router-pinia-vitest-cypress/src/views/HomeView.vue b/typescript-router-pinia-vitest-cypress/src/views/HomeView.vue
new file mode 100644
index 00000000..6555a646
--- /dev/null
+++ b/typescript-router-pinia-vitest-cypress/src/views/HomeView.vue
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/typescript-router-pinia-vitest-cypress/tsconfig.app.json b/typescript-router-pinia-vitest-cypress/tsconfig.app.json
new file mode 100644
index 00000000..cdbea1d7
--- /dev/null
+++ b/typescript-router-pinia-vitest-cypress/tsconfig.app.json
@@ -0,0 +1,12 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
+ "exclude": ["src/**/__tests__/*"],
+ "compilerOptions": {
+ "composite": true,
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ }
+}
diff --git a/typescript-router-pinia-vitest-cypress/tsconfig.config.json b/typescript-router-pinia-vitest-cypress/tsconfig.config.json
new file mode 100644
index 00000000..c2d3a309
--- /dev/null
+++ b/typescript-router-pinia-vitest-cypress/tsconfig.config.json
@@ -0,0 +1,8 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.node.json",
+ "include": ["vite.config.*", "vitest.config.*", "cypress.config.*"],
+ "compilerOptions": {
+ "composite": true,
+ "types": ["node"]
+ }
+}
diff --git a/typescript-router-pinia-vitest-cypress/tsconfig.json b/typescript-router-pinia-vitest-cypress/tsconfig.json
new file mode 100644
index 00000000..31f90037
--- /dev/null
+++ b/typescript-router-pinia-vitest-cypress/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "files": [],
+ "references": [
+ {
+ "path": "./tsconfig.config.json"
+ },
+ {
+ "path": "./tsconfig.app.json"
+ },
+ {
+ "path": "./tsconfig.vitest.json"
+ }
+ ]
+}
diff --git a/typescript-router-pinia-vitest-cypress/tsconfig.vitest.json b/typescript-router-pinia-vitest-cypress/tsconfig.vitest.json
new file mode 100644
index 00000000..d080d611
--- /dev/null
+++ b/typescript-router-pinia-vitest-cypress/tsconfig.vitest.json
@@ -0,0 +1,9 @@
+{
+ "extends": "./tsconfig.app.json",
+ "exclude": [],
+ "compilerOptions": {
+ "composite": true,
+ "lib": [],
+ "types": ["node", "jsdom"]
+ }
+}
diff --git a/typescript-router-pinia-vitest-cypress/vite.config.ts b/typescript-router-pinia-vitest-cypress/vite.config.ts
new file mode 100644
index 00000000..d4945079
--- /dev/null
+++ b/typescript-router-pinia-vitest-cypress/vite.config.ts
@@ -0,0 +1,21 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/typescript-router-pinia-vitest/.gitignore b/typescript-router-pinia-vitest/.gitignore
new file mode 100644
index 00000000..133da84e
--- /dev/null
+++ b/typescript-router-pinia-vitest/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/typescript-router-pinia-vitest/README.md b/typescript-router-pinia-vitest/README.md
new file mode 100644
index 00000000..5277cebf
--- /dev/null
+++ b/typescript-router-pinia-vitest/README.md
@@ -0,0 +1,46 @@
+# typescript-router-pinia-vitest
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[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).
+
+## Type Support for `.vue` Imports in TS
+
+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.
+
+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:
+
+1. Disable the built-in TypeScript Extension
+ 1) Run `Extensions: Show Built-in Extensions` from VSCode's command palette
+ 2) Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)`
+2. Reload the VSCode window by running `Developer: Reload Window` from the command palette.
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Type-Check, Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Unit Tests with [Vitest](https://vitest.dev/)
+
+```sh
+pnpm test:unit
+```
diff --git a/typescript-router-pinia-vitest/env.d.ts b/typescript-router-pinia-vitest/env.d.ts
new file mode 100644
index 00000000..11f02fe2
--- /dev/null
+++ b/typescript-router-pinia-vitest/env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/typescript-router-pinia-vitest/index.html b/typescript-router-pinia-vitest/index.html
new file mode 100644
index 00000000..11603f87
--- /dev/null
+++ b/typescript-router-pinia-vitest/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/typescript-router-pinia-vitest/package.json b/typescript-router-pinia-vitest/package.json
new file mode 100644
index 00000000..b3cb6e4f
--- /dev/null
+++ b/typescript-router-pinia-vitest/package.json
@@ -0,0 +1,33 @@
+{
+ "name": "typescript-router-pinia-vitest",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "run-p type-check build-only",
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom",
+ "build-only": "vite build",
+ "type-check": "vue-tsc --noEmit -p tsconfig.vitest.json --composite false"
+ },
+ "dependencies": {
+ "pinia": "^2.0.16",
+ "vue": "^2.7.7",
+ "vue-router": "^3.5.4"
+ },
+ "devDependencies": {
+ "@types/jsdom": "^16.2.14",
+ "@types/node": "^16.11.45",
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vue/test-utils": "^1.3.0",
+ "@vue/tsconfig": "^0.1.3",
+ "jsdom": "^20.0.0",
+ "npm-run-all": "^4.1.5",
+ "terser": "^5.14.2",
+ "typescript": "~4.7.4",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7",
+ "vue-tsc": "^0.38.8"
+ }
+}
diff --git a/typescript-router-pinia-vitest/public/favicon.ico b/typescript-router-pinia-vitest/public/favicon.ico
new file mode 100644
index 00000000..df36fcfb
Binary files /dev/null and b/typescript-router-pinia-vitest/public/favicon.ico differ
diff --git a/typescript-router-pinia-vitest/src/App.vue b/typescript-router-pinia-vitest/src/App.vue
new file mode 100644
index 00000000..2745f550
--- /dev/null
+++ b/typescript-router-pinia-vitest/src/App.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+ Home
+ About
+
+
+
+
+
+
+
+
+
diff --git a/typescript-router-pinia-vitest/src/assets/base.css b/typescript-router-pinia-vitest/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/typescript-router-pinia-vitest/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/typescript-router-pinia-vitest/src/assets/logo.svg b/typescript-router-pinia-vitest/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/typescript-router-pinia-vitest/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/typescript-router-pinia-vitest/src/assets/main.css b/typescript-router-pinia-vitest/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/typescript-router-pinia-vitest/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/typescript-router-pinia-vitest/src/components/HelloWorld.vue b/typescript-router-pinia-vitest/src/components/HelloWorld.vue
new file mode 100644
index 00000000..bf0a052f
--- /dev/null
+++ b/typescript-router-pinia-vitest/src/components/HelloWorld.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 . What's next?
+
+
+
+
+
diff --git a/typescript-router-pinia-vitest/src/components/TheWelcome.vue b/typescript-router-pinia-vitest/src/components/TheWelcome.vue
new file mode 100644
index 00000000..51d12392
--- /dev/null
+++ b/typescript-router-pinia-vitest/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/typescript-router-pinia-vitest/src/components/WelcomeItem.vue b/typescript-router-pinia-vitest/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/typescript-router-pinia-vitest/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/typescript-router-pinia-vitest/src/components/__tests__/HelloWorld.spec.ts b/typescript-router-pinia-vitest/src/components/__tests__/HelloWorld.spec.ts
new file mode 100644
index 00000000..293bf197
--- /dev/null
+++ b/typescript-router-pinia-vitest/src/components/__tests__/HelloWorld.spec.ts
@@ -0,0 +1,11 @@
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('renders properly', () => {
+ const wrapper = mount(HelloWorld, { propsData: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
+ })
+})
diff --git a/typescript-router-pinia-vitest/src/components/icons/IconCommunity.vue b/typescript-router-pinia-vitest/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/typescript-router-pinia-vitest/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-router-pinia-vitest/src/components/icons/IconDocumentation.vue b/typescript-router-pinia-vitest/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/typescript-router-pinia-vitest/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-router-pinia-vitest/src/components/icons/IconEcosystem.vue b/typescript-router-pinia-vitest/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/typescript-router-pinia-vitest/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-router-pinia-vitest/src/components/icons/IconSupport.vue b/typescript-router-pinia-vitest/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/typescript-router-pinia-vitest/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-router-pinia-vitest/src/components/icons/IconTooling.vue b/typescript-router-pinia-vitest/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/typescript-router-pinia-vitest/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/typescript-router-pinia-vitest/src/main.ts b/typescript-router-pinia-vitest/src/main.ts
new file mode 100644
index 00000000..e11e78e0
--- /dev/null
+++ b/typescript-router-pinia-vitest/src/main.ts
@@ -0,0 +1,15 @@
+import Vue from 'vue'
+import { createPinia, PiniaVuePlugin } from 'pinia'
+
+import App from './App.vue'
+import router from './router'
+
+import './assets/main.css'
+
+Vue.use(PiniaVuePlugin)
+
+new Vue({
+ router,
+ pinia: createPinia(),
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/typescript-router-pinia-vitest/src/router/index.ts b/typescript-router-pinia-vitest/src/router/index.ts
new file mode 100644
index 00000000..cf9820b0
--- /dev/null
+++ b/typescript-router-pinia-vitest/src/router/index.ts
@@ -0,0 +1,27 @@
+import Vue from 'vue'
+import VueRouter from 'vue-router'
+import HomeView from '../views/HomeView.vue'
+
+Vue.use(VueRouter)
+
+const router = new VueRouter({
+ mode: 'history',
+ base: import.meta.env.BASE_URL,
+ routes: [
+ {
+ path: '/',
+ name: 'home',
+ component: HomeView
+ },
+ {
+ path: '/about',
+ name: 'about',
+ // route level code-splitting
+ // this generates a separate chunk (About.[hash].js) for this route
+ // which is lazy-loaded when the route is visited.
+ component: () => import('../views/AboutView.vue')
+ }
+ ]
+})
+
+export default router
diff --git a/typescript-router-pinia-vitest/src/stores/counter.ts b/typescript-router-pinia-vitest/src/stores/counter.ts
new file mode 100644
index 00000000..4a2d2427
--- /dev/null
+++ b/typescript-router-pinia-vitest/src/stores/counter.ts
@@ -0,0 +1,16 @@
+import { defineStore } from 'pinia'
+
+export const useCounterStore = defineStore({
+ id: 'counter',
+ state: () => ({
+ counter: 0
+ }),
+ getters: {
+ doubleCount: (state) => state.counter * 2
+ },
+ actions: {
+ increment() {
+ this.counter++
+ }
+ }
+})
diff --git a/typescript-router-pinia-vitest/src/views/AboutView.vue b/typescript-router-pinia-vitest/src/views/AboutView.vue
new file mode 100644
index 00000000..756ad2a1
--- /dev/null
+++ b/typescript-router-pinia-vitest/src/views/AboutView.vue
@@ -0,0 +1,15 @@
+
+
+
This is an about page
+
+
+
+
diff --git a/typescript-router-pinia-vitest/src/views/HomeView.vue b/typescript-router-pinia-vitest/src/views/HomeView.vue
new file mode 100644
index 00000000..6555a646
--- /dev/null
+++ b/typescript-router-pinia-vitest/src/views/HomeView.vue
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/typescript-router-pinia-vitest/tsconfig.app.json b/typescript-router-pinia-vitest/tsconfig.app.json
new file mode 100644
index 00000000..cdbea1d7
--- /dev/null
+++ b/typescript-router-pinia-vitest/tsconfig.app.json
@@ -0,0 +1,12 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
+ "exclude": ["src/**/__tests__/*"],
+ "compilerOptions": {
+ "composite": true,
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ }
+}
diff --git a/typescript-router-pinia-vitest/tsconfig.config.json b/typescript-router-pinia-vitest/tsconfig.config.json
new file mode 100644
index 00000000..c2d3a309
--- /dev/null
+++ b/typescript-router-pinia-vitest/tsconfig.config.json
@@ -0,0 +1,8 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.node.json",
+ "include": ["vite.config.*", "vitest.config.*", "cypress.config.*"],
+ "compilerOptions": {
+ "composite": true,
+ "types": ["node"]
+ }
+}
diff --git a/typescript-router-pinia-vitest/tsconfig.json b/typescript-router-pinia-vitest/tsconfig.json
new file mode 100644
index 00000000..31f90037
--- /dev/null
+++ b/typescript-router-pinia-vitest/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "files": [],
+ "references": [
+ {
+ "path": "./tsconfig.config.json"
+ },
+ {
+ "path": "./tsconfig.app.json"
+ },
+ {
+ "path": "./tsconfig.vitest.json"
+ }
+ ]
+}
diff --git a/typescript-router-pinia-vitest/tsconfig.vitest.json b/typescript-router-pinia-vitest/tsconfig.vitest.json
new file mode 100644
index 00000000..d080d611
--- /dev/null
+++ b/typescript-router-pinia-vitest/tsconfig.vitest.json
@@ -0,0 +1,9 @@
+{
+ "extends": "./tsconfig.app.json",
+ "exclude": [],
+ "compilerOptions": {
+ "composite": true,
+ "lib": [],
+ "types": ["node", "jsdom"]
+ }
+}
diff --git a/typescript-router-pinia-vitest/vite.config.ts b/typescript-router-pinia-vitest/vite.config.ts
new file mode 100644
index 00000000..d4945079
--- /dev/null
+++ b/typescript-router-pinia-vitest/vite.config.ts
@@ -0,0 +1,21 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/typescript-router-pinia-with-tests/README.md b/typescript-router-pinia-with-tests/README.md
index f9fb0035..1e1597b4 100644
--- a/typescript-router-pinia-with-tests/README.md
+++ b/typescript-router-pinia-with-tests/README.md
@@ -4,13 +4,18 @@ This template should help get you started developing with Vue 3 in Vite.
## Recommended IDE Setup
-[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=johnsoncodehk.volar) (and disable Vetur).
+[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).
## Type Support for `.vue` Imports in TS
-Since TypeScript cannot handle type information for `.vue` imports, they are shimmed to be a generic Vue component type by default. In most cases this is fine if you don't really care about component prop types outside of templates.
+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.
-However, if you wish to get actual prop types in `.vue` imports (for example to get props validation when using manual `h(...)` calls), you can run `Volar: Switch TS Plugin on/off` from VSCode command palette.
+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:
+
+1. Disable the built-in TypeScript Extension
+ 1) Run `Extensions: Show Built-in Extensions` from VSCode's command palette
+ 2) Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)`
+2. Reload the VSCode window by running `Developer: Reload Window` from the command palette.
## Customize configuration
@@ -34,10 +39,10 @@ pnpm dev
pnpm build
```
-### Run Unit Tests with [Cypress Component Testing](https://docs.cypress.io/guides/component-testing/introduction)
+### Run Unit Tests with [Vitest](https://vitest.dev/)
```sh
-pnpm test:unit # or `pnpm test:unit:ci` for headless testing
+pnpm test:unit
```
### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
diff --git a/typescript-router-pinia-with-tests/cypress.config.ts b/typescript-router-pinia-with-tests/cypress.config.ts
new file mode 100644
index 00000000..0f66080f
--- /dev/null
+++ b/typescript-router-pinia-with-tests/cypress.config.ts
@@ -0,0 +1,8 @@
+import { defineConfig } from 'cypress'
+
+export default defineConfig({
+ e2e: {
+ specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
+ baseUrl: 'http://localhost:4173/'
+ }
+})
diff --git a/typescript-router-pinia-with-tests/cypress.json b/typescript-router-pinia-with-tests/cypress.json
deleted file mode 100644
index 3d372252..00000000
--- a/typescript-router-pinia-with-tests/cypress.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "baseUrl": "http://localhost:5050/",
- "component": {
- "componentFolder": "src",
- "testFiles": "**/__tests__/*.spec.{js,ts,jsx,tsx}"
- }
-}
diff --git a/typescript-router-pinia-with-tests/cypress/e2e/example.cy.ts b/typescript-router-pinia-with-tests/cypress/e2e/example.cy.ts
new file mode 100644
index 00000000..7a8c909f
--- /dev/null
+++ b/typescript-router-pinia-with-tests/cypress/e2e/example.cy.ts
@@ -0,0 +1,8 @@
+// https://docs.cypress.io/api/introduction/api.html
+
+describe('My First Test', () => {
+ it('visits the app root url', () => {
+ cy.visit('/')
+ cy.contains('h1', 'You did it!')
+ })
+})
diff --git a/typescript-router-pinia-with-tests/cypress/e2e/tsconfig.json b/typescript-router-pinia-with-tests/cypress/e2e/tsconfig.json
new file mode 100644
index 00000000..be213aef
--- /dev/null
+++ b/typescript-router-pinia-with-tests/cypress/e2e/tsconfig.json
@@ -0,0 +1,10 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["./**/*", "../support/**/*"],
+ "compilerOptions": {
+ "isolatedModules": false,
+ "target": "es5",
+ "lib": ["es5", "dom"],
+ "types": ["cypress"]
+ }
+}
diff --git a/typescript-router-pinia-with-tests/cypress/integration/example.spec.ts b/typescript-router-pinia-with-tests/cypress/integration/example.spec.ts
deleted file mode 100644
index 13a2922b..00000000
--- a/typescript-router-pinia-with-tests/cypress/integration/example.spec.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-// https://docs.cypress.io/api/introduction/api.html
-
-describe('My First Test', () => {
- it('visits the app root url', () => {
- cy.visit('/')
- cy.contains('h1', 'You did it!')
- })
-
- it('navigates to the about page', () => {
- cy.visit('/about')
- cy.contains('h1', 'This is an about page')
- })
-})
diff --git a/typescript-router-pinia-with-tests/cypress/plugins/index.ts b/typescript-router-pinia-with-tests/cypress/plugins/index.ts
deleted file mode 100644
index ad2e351d..00000000
--- a/typescript-router-pinia-with-tests/cypress/plugins/index.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-///
-// ***********************************************************
-// This example plugins/index.js can be used to load plugins
-//
-// You can change the location of this file or turn off loading
-// the plugins file with the 'pluginsFile' configuration option.
-//
-// You can read more here:
-// https://on.cypress.io/plugins-guide
-// ***********************************************************
-
-// This function is called when a project is opened or re-opened (e.g. due to
-// the project's config changing)
-
-const { startDevServer } = require('@cypress/vite-dev-server')
-
-/**
- * @type {Cypress.PluginConfig}
- */
-// eslint-disable-next-line no-unused-vars
-module.exports = (on, config) => {
- // `on` is used to hook into various events Cypress emits
- // `config` is the resolved Cypress config
- on('dev-server:start', (options) => {
- return startDevServer({ options })
- })
- return config
-}
diff --git a/typescript-router-pinia-with-tests/cypress/support/commands.ts b/typescript-router-pinia-with-tests/cypress/support/commands.ts
index 119ab03f..95857aea 100644
--- a/typescript-router-pinia-with-tests/cypress/support/commands.ts
+++ b/typescript-router-pinia-with-tests/cypress/support/commands.ts
@@ -1,5 +1,6 @@
+///
// ***********************************************
-// This example commands.js shows you how to
+// This example commands.ts shows you how to
// create various custom commands and overwrite
// existing commands.
//
@@ -23,3 +24,14 @@
//
// -- This will overwrite an existing command --
// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
+//
+// declare global {
+// namespace Cypress {
+// interface Chainable {
+// login(email: string, password: string): Chainable
+// drag(subject: string, options?: Partial): Chainable
+// dismiss(subject: string, options?: Partial): Chainable
+// visit(originalFn: CommandOriginalFn, url: string, options: Partial): Chainable
+// }
+// }
+// }
diff --git a/typescript-router-pinia-with-tests/cypress/support/e2e.ts b/typescript-router-pinia-with-tests/cypress/support/e2e.ts
new file mode 100644
index 00000000..d68db96d
--- /dev/null
+++ b/typescript-router-pinia-with-tests/cypress/support/e2e.ts
@@ -0,0 +1,20 @@
+// ***********************************************************
+// This example support/index.js is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
diff --git a/typescript-router-pinia-with-tests/cypress/tsconfig.json b/typescript-router-pinia-with-tests/cypress/tsconfig.json
deleted file mode 100644
index b5b2f972..00000000
--- a/typescript-router-pinia-with-tests/cypress/tsconfig.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "compilerOptions": {
- "target": "es5",
- "lib": ["es5", "dom"],
- "types": ["cypress"]
- },
- "include": ["./**/*"]
-}
diff --git a/typescript-router-pinia-with-tests/env.d.ts b/typescript-router-pinia-with-tests/env.d.ts
index 636d9c3f..11f02fe2 100644
--- a/typescript-router-pinia-with-tests/env.d.ts
+++ b/typescript-router-pinia-with-tests/env.d.ts
@@ -1,8 +1 @@
///
-
-declare module '*.vue' {
- import { DefineComponent } from 'vue'
- // eslint-disable-next-line
- const component: DefineComponent<{}, {}, any>
- export default component
-}
diff --git a/typescript-router-pinia-with-tests/package.json b/typescript-router-pinia-with-tests/package.json
index 45296aeb..ed7746a2 100644
--- a/typescript-router-pinia-with-tests/package.json
+++ b/typescript-router-pinia-with-tests/package.json
@@ -3,28 +3,35 @@
"version": "0.0.0",
"scripts": {
"dev": "vite",
- "build": "vue-tsc --noEmit && vite build",
- "preview": "vite preview --port 5050",
- "test:unit": "cypress open-ct",
- "test:unit:ci": "cypress run-ct --quiet --reporter spec",
- "test:e2e": "start-server-and-test preview http://127.0.0.1:5050/ 'cypress open'",
- "test:e2e:ci": "start-server-and-test preview http://127.0.0.1:5050/ 'cypress run'",
- "typecheck": "vue-tsc --noEmit"
+ "build": "run-p type-check build-only",
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom",
+ "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
+ "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'",
+ "build-only": "vite build",
+ "type-check": "vue-tsc --noEmit -p tsconfig.vitest.json --composite false"
},
"dependencies": {
- "pinia": "^2.0.4",
- "vue": "^3.2.22",
- "vue-router": "^4.0.12"
+ "pinia": "^2.0.16",
+ "vue": "^2.7.7",
+ "vue-router": "^3.5.4"
},
"devDependencies": {
- "@cypress/vite-dev-server": "^2.2.1",
- "@cypress/vue": "^3.0.5",
- "@types/node": "^16.11.10",
- "@vitejs/plugin-vue": "^1.10.0",
- "cypress": "^8.7.0",
+ "@types/jsdom": "^16.2.14",
+ "@types/node": "^16.11.45",
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vue/test-utils": "^1.3.0",
+ "@vue/tsconfig": "^0.1.3",
+ "cypress": "^10.3.0",
+ "jsdom": "^20.0.0",
+ "npm-run-all": "^4.1.5",
"start-server-and-test": "^1.14.0",
- "typescript": "~4.4.4",
- "vite": "^2.6.14",
- "vue-tsc": "^0.29.6"
+ "terser": "^5.14.2",
+ "typescript": "~4.7.4",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7",
+ "vue-tsc": "^0.38.8"
}
}
diff --git a/typescript-router-pinia-with-tests/src/App.vue b/typescript-router-pinia-with-tests/src/App.vue
index 8a1e9b19..2745f550 100644
--- a/typescript-router-pinia-with-tests/src/App.vue
+++ b/typescript-router-pinia-with-tests/src/App.vue
@@ -1,35 +1,27 @@
-
-
-
-
-
-
-
- Home
- About
-
-
-
-
-
+
+
+
+
+
+
+
+
+ Home
+ About
+
+
+
+
+
+
-
diff --git a/typescript-router-vitest-cypress/src/assets/base.css b/typescript-router-vitest-cypress/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/typescript-router-vitest-cypress/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/typescript-router-vitest-cypress/src/assets/logo.svg b/typescript-router-vitest-cypress/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/typescript-router-vitest-cypress/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/typescript-router-vitest-cypress/src/assets/main.css b/typescript-router-vitest-cypress/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/typescript-router-vitest-cypress/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/typescript-router-vitest-cypress/src/components/HelloWorld.vue b/typescript-router-vitest-cypress/src/components/HelloWorld.vue
new file mode 100644
index 00000000..bf0a052f
--- /dev/null
+++ b/typescript-router-vitest-cypress/src/components/HelloWorld.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 . What's next?
+
+
+
+
+
diff --git a/typescript-router-vitest-cypress/src/components/TheWelcome.vue b/typescript-router-vitest-cypress/src/components/TheWelcome.vue
new file mode 100644
index 00000000..51d12392
--- /dev/null
+++ b/typescript-router-vitest-cypress/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/typescript-router-vitest-cypress/src/components/WelcomeItem.vue b/typescript-router-vitest-cypress/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/typescript-router-vitest-cypress/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/typescript-router-vitest-cypress/src/components/__tests__/HelloWorld.spec.ts b/typescript-router-vitest-cypress/src/components/__tests__/HelloWorld.spec.ts
new file mode 100644
index 00000000..293bf197
--- /dev/null
+++ b/typescript-router-vitest-cypress/src/components/__tests__/HelloWorld.spec.ts
@@ -0,0 +1,11 @@
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('renders properly', () => {
+ const wrapper = mount(HelloWorld, { propsData: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
+ })
+})
diff --git a/typescript-router-vitest-cypress/src/components/icons/IconCommunity.vue b/typescript-router-vitest-cypress/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/typescript-router-vitest-cypress/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-router-vitest-cypress/src/components/icons/IconDocumentation.vue b/typescript-router-vitest-cypress/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/typescript-router-vitest-cypress/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-router-vitest-cypress/src/components/icons/IconEcosystem.vue b/typescript-router-vitest-cypress/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/typescript-router-vitest-cypress/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-router-vitest-cypress/src/components/icons/IconSupport.vue b/typescript-router-vitest-cypress/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/typescript-router-vitest-cypress/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-router-vitest-cypress/src/components/icons/IconTooling.vue b/typescript-router-vitest-cypress/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/typescript-router-vitest-cypress/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/typescript-router-vitest-cypress/src/main.ts b/typescript-router-vitest-cypress/src/main.ts
new file mode 100644
index 00000000..4919cf77
--- /dev/null
+++ b/typescript-router-vitest-cypress/src/main.ts
@@ -0,0 +1,11 @@
+import Vue from 'vue'
+
+import App from './App.vue'
+import router from './router'
+
+import './assets/main.css'
+
+new Vue({
+ router,
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/typescript-router-vitest-cypress/src/router/index.ts b/typescript-router-vitest-cypress/src/router/index.ts
new file mode 100644
index 00000000..cf9820b0
--- /dev/null
+++ b/typescript-router-vitest-cypress/src/router/index.ts
@@ -0,0 +1,27 @@
+import Vue from 'vue'
+import VueRouter from 'vue-router'
+import HomeView from '../views/HomeView.vue'
+
+Vue.use(VueRouter)
+
+const router = new VueRouter({
+ mode: 'history',
+ base: import.meta.env.BASE_URL,
+ routes: [
+ {
+ path: '/',
+ name: 'home',
+ component: HomeView
+ },
+ {
+ path: '/about',
+ name: 'about',
+ // route level code-splitting
+ // this generates a separate chunk (About.[hash].js) for this route
+ // which is lazy-loaded when the route is visited.
+ component: () => import('../views/AboutView.vue')
+ }
+ ]
+})
+
+export default router
diff --git a/typescript-router-vitest-cypress/src/views/AboutView.vue b/typescript-router-vitest-cypress/src/views/AboutView.vue
new file mode 100644
index 00000000..756ad2a1
--- /dev/null
+++ b/typescript-router-vitest-cypress/src/views/AboutView.vue
@@ -0,0 +1,15 @@
+
+
+
This is an about page
+
+
+
+
diff --git a/typescript-router-vitest-cypress/src/views/HomeView.vue b/typescript-router-vitest-cypress/src/views/HomeView.vue
new file mode 100644
index 00000000..6555a646
--- /dev/null
+++ b/typescript-router-vitest-cypress/src/views/HomeView.vue
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/typescript-router-vitest-cypress/tsconfig.app.json b/typescript-router-vitest-cypress/tsconfig.app.json
new file mode 100644
index 00000000..cdbea1d7
--- /dev/null
+++ b/typescript-router-vitest-cypress/tsconfig.app.json
@@ -0,0 +1,12 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
+ "exclude": ["src/**/__tests__/*"],
+ "compilerOptions": {
+ "composite": true,
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ }
+}
diff --git a/typescript-router-vitest-cypress/tsconfig.config.json b/typescript-router-vitest-cypress/tsconfig.config.json
new file mode 100644
index 00000000..c2d3a309
--- /dev/null
+++ b/typescript-router-vitest-cypress/tsconfig.config.json
@@ -0,0 +1,8 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.node.json",
+ "include": ["vite.config.*", "vitest.config.*", "cypress.config.*"],
+ "compilerOptions": {
+ "composite": true,
+ "types": ["node"]
+ }
+}
diff --git a/typescript-router-vitest-cypress/tsconfig.json b/typescript-router-vitest-cypress/tsconfig.json
new file mode 100644
index 00000000..31f90037
--- /dev/null
+++ b/typescript-router-vitest-cypress/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "files": [],
+ "references": [
+ {
+ "path": "./tsconfig.config.json"
+ },
+ {
+ "path": "./tsconfig.app.json"
+ },
+ {
+ "path": "./tsconfig.vitest.json"
+ }
+ ]
+}
diff --git a/typescript-router-vitest-cypress/tsconfig.vitest.json b/typescript-router-vitest-cypress/tsconfig.vitest.json
new file mode 100644
index 00000000..d080d611
--- /dev/null
+++ b/typescript-router-vitest-cypress/tsconfig.vitest.json
@@ -0,0 +1,9 @@
+{
+ "extends": "./tsconfig.app.json",
+ "exclude": [],
+ "compilerOptions": {
+ "composite": true,
+ "lib": [],
+ "types": ["node", "jsdom"]
+ }
+}
diff --git a/typescript-router-vitest-cypress/vite.config.ts b/typescript-router-vitest-cypress/vite.config.ts
new file mode 100644
index 00000000..d4945079
--- /dev/null
+++ b/typescript-router-vitest-cypress/vite.config.ts
@@ -0,0 +1,21 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/typescript-router-vitest/.gitignore b/typescript-router-vitest/.gitignore
new file mode 100644
index 00000000..133da84e
--- /dev/null
+++ b/typescript-router-vitest/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/typescript-router-vitest/README.md b/typescript-router-vitest/README.md
new file mode 100644
index 00000000..730ad8fc
--- /dev/null
+++ b/typescript-router-vitest/README.md
@@ -0,0 +1,46 @@
+# typescript-router-vitest
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[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).
+
+## Type Support for `.vue` Imports in TS
+
+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.
+
+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:
+
+1. Disable the built-in TypeScript Extension
+ 1) Run `Extensions: Show Built-in Extensions` from VSCode's command palette
+ 2) Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)`
+2. Reload the VSCode window by running `Developer: Reload Window` from the command palette.
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Type-Check, Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Unit Tests with [Vitest](https://vitest.dev/)
+
+```sh
+pnpm test:unit
+```
diff --git a/typescript-router-vitest/env.d.ts b/typescript-router-vitest/env.d.ts
new file mode 100644
index 00000000..11f02fe2
--- /dev/null
+++ b/typescript-router-vitest/env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/typescript-router-vitest/index.html b/typescript-router-vitest/index.html
new file mode 100644
index 00000000..11603f87
--- /dev/null
+++ b/typescript-router-vitest/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/typescript-router-vitest/package.json b/typescript-router-vitest/package.json
new file mode 100644
index 00000000..640f05dc
--- /dev/null
+++ b/typescript-router-vitest/package.json
@@ -0,0 +1,32 @@
+{
+ "name": "typescript-router-vitest",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "run-p type-check build-only",
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom",
+ "build-only": "vite build",
+ "type-check": "vue-tsc --noEmit -p tsconfig.vitest.json --composite false"
+ },
+ "dependencies": {
+ "vue": "^2.7.7",
+ "vue-router": "^3.5.4"
+ },
+ "devDependencies": {
+ "@types/jsdom": "^16.2.14",
+ "@types/node": "^16.11.45",
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vue/test-utils": "^1.3.0",
+ "@vue/tsconfig": "^0.1.3",
+ "jsdom": "^20.0.0",
+ "npm-run-all": "^4.1.5",
+ "terser": "^5.14.2",
+ "typescript": "~4.7.4",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7",
+ "vue-tsc": "^0.38.8"
+ }
+}
diff --git a/typescript-router-vitest/public/favicon.ico b/typescript-router-vitest/public/favicon.ico
new file mode 100644
index 00000000..df36fcfb
Binary files /dev/null and b/typescript-router-vitest/public/favicon.ico differ
diff --git a/typescript-router-vitest/src/App.vue b/typescript-router-vitest/src/App.vue
new file mode 100644
index 00000000..2745f550
--- /dev/null
+++ b/typescript-router-vitest/src/App.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+ Home
+ About
+
+
+
+
+
+
+
+
+
diff --git a/typescript-router-vitest/src/assets/base.css b/typescript-router-vitest/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/typescript-router-vitest/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/typescript-router-vitest/src/assets/logo.svg b/typescript-router-vitest/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/typescript-router-vitest/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/typescript-router-vitest/src/assets/main.css b/typescript-router-vitest/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/typescript-router-vitest/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/typescript-router-vitest/src/components/HelloWorld.vue b/typescript-router-vitest/src/components/HelloWorld.vue
new file mode 100644
index 00000000..bf0a052f
--- /dev/null
+++ b/typescript-router-vitest/src/components/HelloWorld.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 . What's next?
+
+
+
+
+
diff --git a/typescript-router-vitest/src/components/TheWelcome.vue b/typescript-router-vitest/src/components/TheWelcome.vue
new file mode 100644
index 00000000..51d12392
--- /dev/null
+++ b/typescript-router-vitest/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/typescript-router-vitest/src/components/WelcomeItem.vue b/typescript-router-vitest/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/typescript-router-vitest/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/typescript-router-vitest/src/components/__tests__/HelloWorld.spec.ts b/typescript-router-vitest/src/components/__tests__/HelloWorld.spec.ts
new file mode 100644
index 00000000..293bf197
--- /dev/null
+++ b/typescript-router-vitest/src/components/__tests__/HelloWorld.spec.ts
@@ -0,0 +1,11 @@
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('renders properly', () => {
+ const wrapper = mount(HelloWorld, { propsData: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
+ })
+})
diff --git a/typescript-router-vitest/src/components/icons/IconCommunity.vue b/typescript-router-vitest/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/typescript-router-vitest/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-router-vitest/src/components/icons/IconDocumentation.vue b/typescript-router-vitest/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/typescript-router-vitest/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-router-vitest/src/components/icons/IconEcosystem.vue b/typescript-router-vitest/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/typescript-router-vitest/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-router-vitest/src/components/icons/IconSupport.vue b/typescript-router-vitest/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/typescript-router-vitest/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-router-vitest/src/components/icons/IconTooling.vue b/typescript-router-vitest/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/typescript-router-vitest/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/typescript-router-vitest/src/main.ts b/typescript-router-vitest/src/main.ts
new file mode 100644
index 00000000..4919cf77
--- /dev/null
+++ b/typescript-router-vitest/src/main.ts
@@ -0,0 +1,11 @@
+import Vue from 'vue'
+
+import App from './App.vue'
+import router from './router'
+
+import './assets/main.css'
+
+new Vue({
+ router,
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/typescript-router-vitest/src/router/index.ts b/typescript-router-vitest/src/router/index.ts
new file mode 100644
index 00000000..cf9820b0
--- /dev/null
+++ b/typescript-router-vitest/src/router/index.ts
@@ -0,0 +1,27 @@
+import Vue from 'vue'
+import VueRouter from 'vue-router'
+import HomeView from '../views/HomeView.vue'
+
+Vue.use(VueRouter)
+
+const router = new VueRouter({
+ mode: 'history',
+ base: import.meta.env.BASE_URL,
+ routes: [
+ {
+ path: '/',
+ name: 'home',
+ component: HomeView
+ },
+ {
+ path: '/about',
+ name: 'about',
+ // route level code-splitting
+ // this generates a separate chunk (About.[hash].js) for this route
+ // which is lazy-loaded when the route is visited.
+ component: () => import('../views/AboutView.vue')
+ }
+ ]
+})
+
+export default router
diff --git a/typescript-router-vitest/src/views/AboutView.vue b/typescript-router-vitest/src/views/AboutView.vue
new file mode 100644
index 00000000..756ad2a1
--- /dev/null
+++ b/typescript-router-vitest/src/views/AboutView.vue
@@ -0,0 +1,15 @@
+
+
+
This is an about page
+
+
+
+
diff --git a/typescript-router-vitest/src/views/HomeView.vue b/typescript-router-vitest/src/views/HomeView.vue
new file mode 100644
index 00000000..6555a646
--- /dev/null
+++ b/typescript-router-vitest/src/views/HomeView.vue
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/typescript-router-vitest/tsconfig.app.json b/typescript-router-vitest/tsconfig.app.json
new file mode 100644
index 00000000..cdbea1d7
--- /dev/null
+++ b/typescript-router-vitest/tsconfig.app.json
@@ -0,0 +1,12 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
+ "exclude": ["src/**/__tests__/*"],
+ "compilerOptions": {
+ "composite": true,
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ }
+}
diff --git a/typescript-router-vitest/tsconfig.config.json b/typescript-router-vitest/tsconfig.config.json
new file mode 100644
index 00000000..c2d3a309
--- /dev/null
+++ b/typescript-router-vitest/tsconfig.config.json
@@ -0,0 +1,8 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.node.json",
+ "include": ["vite.config.*", "vitest.config.*", "cypress.config.*"],
+ "compilerOptions": {
+ "composite": true,
+ "types": ["node"]
+ }
+}
diff --git a/typescript-router-vitest/tsconfig.json b/typescript-router-vitest/tsconfig.json
new file mode 100644
index 00000000..31f90037
--- /dev/null
+++ b/typescript-router-vitest/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "files": [],
+ "references": [
+ {
+ "path": "./tsconfig.config.json"
+ },
+ {
+ "path": "./tsconfig.app.json"
+ },
+ {
+ "path": "./tsconfig.vitest.json"
+ }
+ ]
+}
diff --git a/typescript-router-vitest/tsconfig.vitest.json b/typescript-router-vitest/tsconfig.vitest.json
new file mode 100644
index 00000000..d080d611
--- /dev/null
+++ b/typescript-router-vitest/tsconfig.vitest.json
@@ -0,0 +1,9 @@
+{
+ "extends": "./tsconfig.app.json",
+ "exclude": [],
+ "compilerOptions": {
+ "composite": true,
+ "lib": [],
+ "types": ["node", "jsdom"]
+ }
+}
diff --git a/typescript-router-vitest/vite.config.ts b/typescript-router-vitest/vite.config.ts
new file mode 100644
index 00000000..d4945079
--- /dev/null
+++ b/typescript-router-vitest/vite.config.ts
@@ -0,0 +1,21 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/typescript-router-with-tests/README.md b/typescript-router-with-tests/README.md
index 17ca1244..8465939b 100644
--- a/typescript-router-with-tests/README.md
+++ b/typescript-router-with-tests/README.md
@@ -4,13 +4,18 @@ This template should help get you started developing with Vue 3 in Vite.
## Recommended IDE Setup
-[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=johnsoncodehk.volar) (and disable Vetur).
+[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).
## Type Support for `.vue` Imports in TS
-Since TypeScript cannot handle type information for `.vue` imports, they are shimmed to be a generic Vue component type by default. In most cases this is fine if you don't really care about component prop types outside of templates.
+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.
-However, if you wish to get actual prop types in `.vue` imports (for example to get props validation when using manual `h(...)` calls), you can run `Volar: Switch TS Plugin on/off` from VSCode command palette.
+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:
+
+1. Disable the built-in TypeScript Extension
+ 1) Run `Extensions: Show Built-in Extensions` from VSCode's command palette
+ 2) Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)`
+2. Reload the VSCode window by running `Developer: Reload Window` from the command palette.
## Customize configuration
@@ -34,10 +39,10 @@ pnpm dev
pnpm build
```
-### Run Unit Tests with [Cypress Component Testing](https://docs.cypress.io/guides/component-testing/introduction)
+### Run Unit Tests with [Vitest](https://vitest.dev/)
```sh
-pnpm test:unit # or `pnpm test:unit:ci` for headless testing
+pnpm test:unit
```
### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
diff --git a/typescript-router-with-tests/cypress.config.ts b/typescript-router-with-tests/cypress.config.ts
new file mode 100644
index 00000000..0f66080f
--- /dev/null
+++ b/typescript-router-with-tests/cypress.config.ts
@@ -0,0 +1,8 @@
+import { defineConfig } from 'cypress'
+
+export default defineConfig({
+ e2e: {
+ specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
+ baseUrl: 'http://localhost:4173/'
+ }
+})
diff --git a/typescript-router-with-tests/cypress.json b/typescript-router-with-tests/cypress.json
deleted file mode 100644
index 3d372252..00000000
--- a/typescript-router-with-tests/cypress.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "baseUrl": "http://localhost:5050/",
- "component": {
- "componentFolder": "src",
- "testFiles": "**/__tests__/*.spec.{js,ts,jsx,tsx}"
- }
-}
diff --git a/typescript-router-with-tests/cypress/e2e/example.cy.ts b/typescript-router-with-tests/cypress/e2e/example.cy.ts
new file mode 100644
index 00000000..7a8c909f
--- /dev/null
+++ b/typescript-router-with-tests/cypress/e2e/example.cy.ts
@@ -0,0 +1,8 @@
+// https://docs.cypress.io/api/introduction/api.html
+
+describe('My First Test', () => {
+ it('visits the app root url', () => {
+ cy.visit('/')
+ cy.contains('h1', 'You did it!')
+ })
+})
diff --git a/typescript-router-with-tests/cypress/e2e/tsconfig.json b/typescript-router-with-tests/cypress/e2e/tsconfig.json
new file mode 100644
index 00000000..be213aef
--- /dev/null
+++ b/typescript-router-with-tests/cypress/e2e/tsconfig.json
@@ -0,0 +1,10 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["./**/*", "../support/**/*"],
+ "compilerOptions": {
+ "isolatedModules": false,
+ "target": "es5",
+ "lib": ["es5", "dom"],
+ "types": ["cypress"]
+ }
+}
diff --git a/typescript-router-with-tests/cypress/integration/example.spec.ts b/typescript-router-with-tests/cypress/integration/example.spec.ts
deleted file mode 100644
index 13a2922b..00000000
--- a/typescript-router-with-tests/cypress/integration/example.spec.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-// https://docs.cypress.io/api/introduction/api.html
-
-describe('My First Test', () => {
- it('visits the app root url', () => {
- cy.visit('/')
- cy.contains('h1', 'You did it!')
- })
-
- it('navigates to the about page', () => {
- cy.visit('/about')
- cy.contains('h1', 'This is an about page')
- })
-})
diff --git a/typescript-router-with-tests/cypress/plugins/index.ts b/typescript-router-with-tests/cypress/plugins/index.ts
deleted file mode 100644
index ad2e351d..00000000
--- a/typescript-router-with-tests/cypress/plugins/index.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-///
-// ***********************************************************
-// This example plugins/index.js can be used to load plugins
-//
-// You can change the location of this file or turn off loading
-// the plugins file with the 'pluginsFile' configuration option.
-//
-// You can read more here:
-// https://on.cypress.io/plugins-guide
-// ***********************************************************
-
-// This function is called when a project is opened or re-opened (e.g. due to
-// the project's config changing)
-
-const { startDevServer } = require('@cypress/vite-dev-server')
-
-/**
- * @type {Cypress.PluginConfig}
- */
-// eslint-disable-next-line no-unused-vars
-module.exports = (on, config) => {
- // `on` is used to hook into various events Cypress emits
- // `config` is the resolved Cypress config
- on('dev-server:start', (options) => {
- return startDevServer({ options })
- })
- return config
-}
diff --git a/typescript-router-with-tests/cypress/support/commands.ts b/typescript-router-with-tests/cypress/support/commands.ts
index 119ab03f..95857aea 100644
--- a/typescript-router-with-tests/cypress/support/commands.ts
+++ b/typescript-router-with-tests/cypress/support/commands.ts
@@ -1,5 +1,6 @@
+///
// ***********************************************
-// This example commands.js shows you how to
+// This example commands.ts shows you how to
// create various custom commands and overwrite
// existing commands.
//
@@ -23,3 +24,14 @@
//
// -- This will overwrite an existing command --
// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
+//
+// declare global {
+// namespace Cypress {
+// interface Chainable {
+// login(email: string, password: string): Chainable
+// drag(subject: string, options?: Partial): Chainable
+// dismiss(subject: string, options?: Partial): Chainable
+// visit(originalFn: CommandOriginalFn, url: string, options: Partial): Chainable
+// }
+// }
+// }
diff --git a/typescript-router-with-tests/cypress/support/e2e.ts b/typescript-router-with-tests/cypress/support/e2e.ts
new file mode 100644
index 00000000..d68db96d
--- /dev/null
+++ b/typescript-router-with-tests/cypress/support/e2e.ts
@@ -0,0 +1,20 @@
+// ***********************************************************
+// This example support/index.js is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
diff --git a/typescript-router-with-tests/cypress/tsconfig.json b/typescript-router-with-tests/cypress/tsconfig.json
deleted file mode 100644
index b5b2f972..00000000
--- a/typescript-router-with-tests/cypress/tsconfig.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "compilerOptions": {
- "target": "es5",
- "lib": ["es5", "dom"],
- "types": ["cypress"]
- },
- "include": ["./**/*"]
-}
diff --git a/typescript-router-with-tests/env.d.ts b/typescript-router-with-tests/env.d.ts
index 636d9c3f..11f02fe2 100644
--- a/typescript-router-with-tests/env.d.ts
+++ b/typescript-router-with-tests/env.d.ts
@@ -1,8 +1 @@
///
-
-declare module '*.vue' {
- import { DefineComponent } from 'vue'
- // eslint-disable-next-line
- const component: DefineComponent<{}, {}, any>
- export default component
-}
diff --git a/typescript-router-with-tests/package.json b/typescript-router-with-tests/package.json
index a310df69..7fbbe48f 100644
--- a/typescript-router-with-tests/package.json
+++ b/typescript-router-with-tests/package.json
@@ -3,27 +3,34 @@
"version": "0.0.0",
"scripts": {
"dev": "vite",
- "build": "vue-tsc --noEmit && vite build",
- "preview": "vite preview --port 5050",
- "test:unit": "cypress open-ct",
- "test:unit:ci": "cypress run-ct --quiet --reporter spec",
- "test:e2e": "start-server-and-test preview http://127.0.0.1:5050/ 'cypress open'",
- "test:e2e:ci": "start-server-and-test preview http://127.0.0.1:5050/ 'cypress run'",
- "typecheck": "vue-tsc --noEmit"
+ "build": "run-p type-check build-only",
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom",
+ "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
+ "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'",
+ "build-only": "vite build",
+ "type-check": "vue-tsc --noEmit -p tsconfig.vitest.json --composite false"
},
"dependencies": {
- "vue": "^3.2.22",
- "vue-router": "^4.0.12"
+ "vue": "^2.7.7",
+ "vue-router": "^3.5.4"
},
"devDependencies": {
- "@cypress/vite-dev-server": "^2.2.1",
- "@cypress/vue": "^3.0.5",
- "@types/node": "^16.11.10",
- "@vitejs/plugin-vue": "^1.10.0",
- "cypress": "^8.7.0",
+ "@types/jsdom": "^16.2.14",
+ "@types/node": "^16.11.45",
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vue/test-utils": "^1.3.0",
+ "@vue/tsconfig": "^0.1.3",
+ "cypress": "^10.3.0",
+ "jsdom": "^20.0.0",
+ "npm-run-all": "^4.1.5",
"start-server-and-test": "^1.14.0",
- "typescript": "~4.4.4",
- "vite": "^2.6.14",
- "vue-tsc": "^0.29.6"
+ "terser": "^5.14.2",
+ "typescript": "~4.7.4",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7",
+ "vue-tsc": "^0.38.8"
}
}
diff --git a/typescript-router-with-tests/src/App.vue b/typescript-router-with-tests/src/App.vue
index 8a1e9b19..2745f550 100644
--- a/typescript-router-with-tests/src/App.vue
+++ b/typescript-router-with-tests/src/App.vue
@@ -1,35 +1,27 @@
-
-
-
-
-
-
-
- Home
- About
-
-
-
-
-
+
+
+
+
+
+
+
+
+ Home
+ About
+
+
+
+
+
+
-
diff --git a/typescript-vitest-cypress/src/assets/base.css b/typescript-vitest-cypress/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/typescript-vitest-cypress/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/typescript-vitest-cypress/src/assets/logo.svg b/typescript-vitest-cypress/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/typescript-vitest-cypress/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/typescript-vitest-cypress/src/assets/main.css b/typescript-vitest-cypress/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/typescript-vitest-cypress/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/typescript-vitest-cypress/src/components/HelloWorld.vue b/typescript-vitest-cypress/src/components/HelloWorld.vue
new file mode 100644
index 00000000..624fb3e0
--- /dev/null
+++ b/typescript-vitest-cypress/src/components/HelloWorld.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 .
+
+
+
+
+
diff --git a/typescript-vitest-cypress/src/components/TheWelcome.vue b/typescript-vitest-cypress/src/components/TheWelcome.vue
new file mode 100644
index 00000000..51d12392
--- /dev/null
+++ b/typescript-vitest-cypress/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/typescript-vitest-cypress/src/components/WelcomeItem.vue b/typescript-vitest-cypress/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/typescript-vitest-cypress/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/typescript-vitest-cypress/src/components/__tests__/HelloWorld.spec.ts b/typescript-vitest-cypress/src/components/__tests__/HelloWorld.spec.ts
new file mode 100644
index 00000000..293bf197
--- /dev/null
+++ b/typescript-vitest-cypress/src/components/__tests__/HelloWorld.spec.ts
@@ -0,0 +1,11 @@
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('renders properly', () => {
+ const wrapper = mount(HelloWorld, { propsData: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
+ })
+})
diff --git a/typescript-vitest-cypress/src/components/icons/IconCommunity.vue b/typescript-vitest-cypress/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/typescript-vitest-cypress/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-vitest-cypress/src/components/icons/IconDocumentation.vue b/typescript-vitest-cypress/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/typescript-vitest-cypress/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-vitest-cypress/src/components/icons/IconEcosystem.vue b/typescript-vitest-cypress/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/typescript-vitest-cypress/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-vitest-cypress/src/components/icons/IconSupport.vue b/typescript-vitest-cypress/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/typescript-vitest-cypress/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-vitest-cypress/src/components/icons/IconTooling.vue b/typescript-vitest-cypress/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/typescript-vitest-cypress/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/typescript-vitest-cypress/src/main.ts b/typescript-vitest-cypress/src/main.ts
new file mode 100644
index 00000000..c5da47dc
--- /dev/null
+++ b/typescript-vitest-cypress/src/main.ts
@@ -0,0 +1,8 @@
+import Vue from 'vue'
+import App from './App.vue'
+
+import './assets/main.css'
+
+new Vue({
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/typescript-vitest-cypress/tsconfig.app.json b/typescript-vitest-cypress/tsconfig.app.json
new file mode 100644
index 00000000..cdbea1d7
--- /dev/null
+++ b/typescript-vitest-cypress/tsconfig.app.json
@@ -0,0 +1,12 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
+ "exclude": ["src/**/__tests__/*"],
+ "compilerOptions": {
+ "composite": true,
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ }
+}
diff --git a/typescript-vitest-cypress/tsconfig.config.json b/typescript-vitest-cypress/tsconfig.config.json
new file mode 100644
index 00000000..c2d3a309
--- /dev/null
+++ b/typescript-vitest-cypress/tsconfig.config.json
@@ -0,0 +1,8 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.node.json",
+ "include": ["vite.config.*", "vitest.config.*", "cypress.config.*"],
+ "compilerOptions": {
+ "composite": true,
+ "types": ["node"]
+ }
+}
diff --git a/typescript-vitest-cypress/tsconfig.json b/typescript-vitest-cypress/tsconfig.json
new file mode 100644
index 00000000..31f90037
--- /dev/null
+++ b/typescript-vitest-cypress/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "files": [],
+ "references": [
+ {
+ "path": "./tsconfig.config.json"
+ },
+ {
+ "path": "./tsconfig.app.json"
+ },
+ {
+ "path": "./tsconfig.vitest.json"
+ }
+ ]
+}
diff --git a/typescript-vitest-cypress/tsconfig.vitest.json b/typescript-vitest-cypress/tsconfig.vitest.json
new file mode 100644
index 00000000..d080d611
--- /dev/null
+++ b/typescript-vitest-cypress/tsconfig.vitest.json
@@ -0,0 +1,9 @@
+{
+ "extends": "./tsconfig.app.json",
+ "exclude": [],
+ "compilerOptions": {
+ "composite": true,
+ "lib": [],
+ "types": ["node", "jsdom"]
+ }
+}
diff --git a/typescript-vitest-cypress/vite.config.ts b/typescript-vitest-cypress/vite.config.ts
new file mode 100644
index 00000000..d4945079
--- /dev/null
+++ b/typescript-vitest-cypress/vite.config.ts
@@ -0,0 +1,21 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/typescript-vitest/.gitignore b/typescript-vitest/.gitignore
new file mode 100644
index 00000000..133da84e
--- /dev/null
+++ b/typescript-vitest/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/typescript-vitest/README.md b/typescript-vitest/README.md
new file mode 100644
index 00000000..1a8cd39b
--- /dev/null
+++ b/typescript-vitest/README.md
@@ -0,0 +1,46 @@
+# typescript-vitest
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[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).
+
+## Type Support for `.vue` Imports in TS
+
+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.
+
+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:
+
+1. Disable the built-in TypeScript Extension
+ 1) Run `Extensions: Show Built-in Extensions` from VSCode's command palette
+ 2) Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)`
+2. Reload the VSCode window by running `Developer: Reload Window` from the command palette.
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Type-Check, Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Unit Tests with [Vitest](https://vitest.dev/)
+
+```sh
+pnpm test:unit
+```
diff --git a/typescript-vitest/env.d.ts b/typescript-vitest/env.d.ts
new file mode 100644
index 00000000..11f02fe2
--- /dev/null
+++ b/typescript-vitest/env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/typescript-vitest/index.html b/typescript-vitest/index.html
new file mode 100644
index 00000000..11603f87
--- /dev/null
+++ b/typescript-vitest/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/typescript-vitest/package.json b/typescript-vitest/package.json
new file mode 100644
index 00000000..4741545c
--- /dev/null
+++ b/typescript-vitest/package.json
@@ -0,0 +1,31 @@
+{
+ "name": "typescript-vitest",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "run-p type-check build-only",
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom",
+ "build-only": "vite build",
+ "type-check": "vue-tsc --noEmit -p tsconfig.vitest.json --composite false"
+ },
+ "dependencies": {
+ "vue": "^2.7.7"
+ },
+ "devDependencies": {
+ "@types/jsdom": "^16.2.14",
+ "@types/node": "^16.11.45",
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vue/test-utils": "^1.3.0",
+ "@vue/tsconfig": "^0.1.3",
+ "jsdom": "^20.0.0",
+ "npm-run-all": "^4.1.5",
+ "terser": "^5.14.2",
+ "typescript": "~4.7.4",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7",
+ "vue-tsc": "^0.38.8"
+ }
+}
diff --git a/typescript-vitest/public/favicon.ico b/typescript-vitest/public/favicon.ico
new file mode 100644
index 00000000..df36fcfb
Binary files /dev/null and b/typescript-vitest/public/favicon.ico differ
diff --git a/typescript-vitest/src/App.vue b/typescript-vitest/src/App.vue
new file mode 100644
index 00000000..70c911b5
--- /dev/null
+++ b/typescript-vitest/src/App.vue
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/typescript-vitest/src/assets/base.css b/typescript-vitest/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/typescript-vitest/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/typescript-vitest/src/assets/logo.svg b/typescript-vitest/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/typescript-vitest/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/typescript-vitest/src/assets/main.css b/typescript-vitest/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/typescript-vitest/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/typescript-vitest/src/components/HelloWorld.vue b/typescript-vitest/src/components/HelloWorld.vue
new file mode 100644
index 00000000..624fb3e0
--- /dev/null
+++ b/typescript-vitest/src/components/HelloWorld.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 .
+
+
+
+
+
diff --git a/typescript-vitest/src/components/TheWelcome.vue b/typescript-vitest/src/components/TheWelcome.vue
new file mode 100644
index 00000000..51d12392
--- /dev/null
+++ b/typescript-vitest/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/typescript-vitest/src/components/WelcomeItem.vue b/typescript-vitest/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/typescript-vitest/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/typescript-vitest/src/components/__tests__/HelloWorld.spec.ts b/typescript-vitest/src/components/__tests__/HelloWorld.spec.ts
new file mode 100644
index 00000000..293bf197
--- /dev/null
+++ b/typescript-vitest/src/components/__tests__/HelloWorld.spec.ts
@@ -0,0 +1,11 @@
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('renders properly', () => {
+ const wrapper = mount(HelloWorld, { propsData: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
+ })
+})
diff --git a/typescript-vitest/src/components/icons/IconCommunity.vue b/typescript-vitest/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/typescript-vitest/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-vitest/src/components/icons/IconDocumentation.vue b/typescript-vitest/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/typescript-vitest/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-vitest/src/components/icons/IconEcosystem.vue b/typescript-vitest/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/typescript-vitest/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-vitest/src/components/icons/IconSupport.vue b/typescript-vitest/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/typescript-vitest/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/typescript-vitest/src/components/icons/IconTooling.vue b/typescript-vitest/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/typescript-vitest/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/typescript-vitest/src/main.ts b/typescript-vitest/src/main.ts
new file mode 100644
index 00000000..c5da47dc
--- /dev/null
+++ b/typescript-vitest/src/main.ts
@@ -0,0 +1,8 @@
+import Vue from 'vue'
+import App from './App.vue'
+
+import './assets/main.css'
+
+new Vue({
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/typescript-vitest/tsconfig.app.json b/typescript-vitest/tsconfig.app.json
new file mode 100644
index 00000000..cdbea1d7
--- /dev/null
+++ b/typescript-vitest/tsconfig.app.json
@@ -0,0 +1,12 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
+ "exclude": ["src/**/__tests__/*"],
+ "compilerOptions": {
+ "composite": true,
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ }
+}
diff --git a/typescript-vitest/tsconfig.config.json b/typescript-vitest/tsconfig.config.json
new file mode 100644
index 00000000..c2d3a309
--- /dev/null
+++ b/typescript-vitest/tsconfig.config.json
@@ -0,0 +1,8 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.node.json",
+ "include": ["vite.config.*", "vitest.config.*", "cypress.config.*"],
+ "compilerOptions": {
+ "composite": true,
+ "types": ["node"]
+ }
+}
diff --git a/typescript-vitest/tsconfig.json b/typescript-vitest/tsconfig.json
new file mode 100644
index 00000000..31f90037
--- /dev/null
+++ b/typescript-vitest/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "files": [],
+ "references": [
+ {
+ "path": "./tsconfig.config.json"
+ },
+ {
+ "path": "./tsconfig.app.json"
+ },
+ {
+ "path": "./tsconfig.vitest.json"
+ }
+ ]
+}
diff --git a/typescript-vitest/tsconfig.vitest.json b/typescript-vitest/tsconfig.vitest.json
new file mode 100644
index 00000000..d080d611
--- /dev/null
+++ b/typescript-vitest/tsconfig.vitest.json
@@ -0,0 +1,9 @@
+{
+ "extends": "./tsconfig.app.json",
+ "exclude": [],
+ "compilerOptions": {
+ "composite": true,
+ "lib": [],
+ "types": ["node", "jsdom"]
+ }
+}
diff --git a/typescript-vitest/vite.config.ts b/typescript-vitest/vite.config.ts
new file mode 100644
index 00000000..d4945079
--- /dev/null
+++ b/typescript-vitest/vite.config.ts
@@ -0,0 +1,21 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/typescript-with-tests/README.md b/typescript-with-tests/README.md
index b4972f0f..a0b4603e 100644
--- a/typescript-with-tests/README.md
+++ b/typescript-with-tests/README.md
@@ -4,13 +4,18 @@ This template should help get you started developing with Vue 3 in Vite.
## Recommended IDE Setup
-[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=johnsoncodehk.volar) (and disable Vetur).
+[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).
## Type Support for `.vue` Imports in TS
-Since TypeScript cannot handle type information for `.vue` imports, they are shimmed to be a generic Vue component type by default. In most cases this is fine if you don't really care about component prop types outside of templates.
+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.
-However, if you wish to get actual prop types in `.vue` imports (for example to get props validation when using manual `h(...)` calls), you can run `Volar: Switch TS Plugin on/off` from VSCode command palette.
+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:
+
+1. Disable the built-in TypeScript Extension
+ 1) Run `Extensions: Show Built-in Extensions` from VSCode's command palette
+ 2) Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)`
+2. Reload the VSCode window by running `Developer: Reload Window` from the command palette.
## Customize configuration
@@ -34,10 +39,10 @@ pnpm dev
pnpm build
```
-### Run Unit Tests with [Cypress Component Testing](https://docs.cypress.io/guides/component-testing/introduction)
+### Run Unit Tests with [Vitest](https://vitest.dev/)
```sh
-pnpm test:unit # or `pnpm test:unit:ci` for headless testing
+pnpm test:unit
```
### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
diff --git a/typescript-with-tests/cypress.config.ts b/typescript-with-tests/cypress.config.ts
new file mode 100644
index 00000000..0f66080f
--- /dev/null
+++ b/typescript-with-tests/cypress.config.ts
@@ -0,0 +1,8 @@
+import { defineConfig } from 'cypress'
+
+export default defineConfig({
+ e2e: {
+ specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
+ baseUrl: 'http://localhost:4173/'
+ }
+})
diff --git a/typescript-with-tests/cypress.json b/typescript-with-tests/cypress.json
deleted file mode 100644
index 3d372252..00000000
--- a/typescript-with-tests/cypress.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "baseUrl": "http://localhost:5050/",
- "component": {
- "componentFolder": "src",
- "testFiles": "**/__tests__/*.spec.{js,ts,jsx,tsx}"
- }
-}
diff --git a/typescript-with-tests/cypress/e2e/example.cy.ts b/typescript-with-tests/cypress/e2e/example.cy.ts
new file mode 100644
index 00000000..7a8c909f
--- /dev/null
+++ b/typescript-with-tests/cypress/e2e/example.cy.ts
@@ -0,0 +1,8 @@
+// https://docs.cypress.io/api/introduction/api.html
+
+describe('My First Test', () => {
+ it('visits the app root url', () => {
+ cy.visit('/')
+ cy.contains('h1', 'You did it!')
+ })
+})
diff --git a/typescript-with-tests/cypress/e2e/tsconfig.json b/typescript-with-tests/cypress/e2e/tsconfig.json
new file mode 100644
index 00000000..be213aef
--- /dev/null
+++ b/typescript-with-tests/cypress/e2e/tsconfig.json
@@ -0,0 +1,10 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["./**/*", "../support/**/*"],
+ "compilerOptions": {
+ "isolatedModules": false,
+ "target": "es5",
+ "lib": ["es5", "dom"],
+ "types": ["cypress"]
+ }
+}
diff --git a/typescript-with-tests/cypress/plugins/index.ts b/typescript-with-tests/cypress/plugins/index.ts
deleted file mode 100644
index ad2e351d..00000000
--- a/typescript-with-tests/cypress/plugins/index.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-///
-// ***********************************************************
-// This example plugins/index.js can be used to load plugins
-//
-// You can change the location of this file or turn off loading
-// the plugins file with the 'pluginsFile' configuration option.
-//
-// You can read more here:
-// https://on.cypress.io/plugins-guide
-// ***********************************************************
-
-// This function is called when a project is opened or re-opened (e.g. due to
-// the project's config changing)
-
-const { startDevServer } = require('@cypress/vite-dev-server')
-
-/**
- * @type {Cypress.PluginConfig}
- */
-// eslint-disable-next-line no-unused-vars
-module.exports = (on, config) => {
- // `on` is used to hook into various events Cypress emits
- // `config` is the resolved Cypress config
- on('dev-server:start', (options) => {
- return startDevServer({ options })
- })
- return config
-}
diff --git a/typescript-with-tests/cypress/support/commands.ts b/typescript-with-tests/cypress/support/commands.ts
index 119ab03f..95857aea 100644
--- a/typescript-with-tests/cypress/support/commands.ts
+++ b/typescript-with-tests/cypress/support/commands.ts
@@ -1,5 +1,6 @@
+///
// ***********************************************
-// This example commands.js shows you how to
+// This example commands.ts shows you how to
// create various custom commands and overwrite
// existing commands.
//
@@ -23,3 +24,14 @@
//
// -- This will overwrite an existing command --
// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
+//
+// declare global {
+// namespace Cypress {
+// interface Chainable {
+// login(email: string, password: string): Chainable
+// drag(subject: string, options?: Partial): Chainable
+// dismiss(subject: string, options?: Partial): Chainable
+// visit(originalFn: CommandOriginalFn, url: string, options: Partial): Chainable
+// }
+// }
+// }
diff --git a/typescript-with-tests/cypress/support/e2e.ts b/typescript-with-tests/cypress/support/e2e.ts
new file mode 100644
index 00000000..d68db96d
--- /dev/null
+++ b/typescript-with-tests/cypress/support/e2e.ts
@@ -0,0 +1,20 @@
+// ***********************************************************
+// This example support/index.js is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
diff --git a/typescript-with-tests/cypress/tsconfig.json b/typescript-with-tests/cypress/tsconfig.json
deleted file mode 100644
index b5b2f972..00000000
--- a/typescript-with-tests/cypress/tsconfig.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "compilerOptions": {
- "target": "es5",
- "lib": ["es5", "dom"],
- "types": ["cypress"]
- },
- "include": ["./**/*"]
-}
diff --git a/typescript-with-tests/env.d.ts b/typescript-with-tests/env.d.ts
index 636d9c3f..11f02fe2 100644
--- a/typescript-with-tests/env.d.ts
+++ b/typescript-with-tests/env.d.ts
@@ -1,8 +1 @@
///
-
-declare module '*.vue' {
- import { DefineComponent } from 'vue'
- // eslint-disable-next-line
- const component: DefineComponent<{}, {}, any>
- export default component
-}
diff --git a/typescript-with-tests/package.json b/typescript-with-tests/package.json
index e9d23e67..67845887 100644
--- a/typescript-with-tests/package.json
+++ b/typescript-with-tests/package.json
@@ -3,26 +3,33 @@
"version": "0.0.0",
"scripts": {
"dev": "vite",
- "build": "vue-tsc --noEmit && vite build",
- "preview": "vite preview --port 5050",
- "test:unit": "cypress open-ct",
- "test:unit:ci": "cypress run-ct --quiet --reporter spec",
- "test:e2e": "start-server-and-test preview http://127.0.0.1:5050/ 'cypress open'",
- "test:e2e:ci": "start-server-and-test preview http://127.0.0.1:5050/ 'cypress run'",
- "typecheck": "vue-tsc --noEmit"
+ "build": "run-p type-check build-only",
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom",
+ "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
+ "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'",
+ "build-only": "vite build",
+ "type-check": "vue-tsc --noEmit -p tsconfig.vitest.json --composite false"
},
"dependencies": {
- "vue": "^3.2.22"
+ "vue": "^2.7.7"
},
"devDependencies": {
- "@cypress/vite-dev-server": "^2.2.1",
- "@cypress/vue": "^3.0.5",
- "@types/node": "^16.11.10",
- "@vitejs/plugin-vue": "^1.10.0",
- "cypress": "^8.7.0",
+ "@types/jsdom": "^16.2.14",
+ "@types/node": "^16.11.45",
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vue/test-utils": "^1.3.0",
+ "@vue/tsconfig": "^0.1.3",
+ "cypress": "^10.3.0",
+ "jsdom": "^20.0.0",
+ "npm-run-all": "^4.1.5",
"start-server-and-test": "^1.14.0",
- "typescript": "~4.4.4",
- "vite": "^2.6.14",
- "vue-tsc": "^0.29.6"
+ "terser": "^5.14.2",
+ "typescript": "~4.7.4",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7",
+ "vue-tsc": "^0.38.8"
}
}
diff --git a/typescript-with-tests/src/App.vue b/typescript-with-tests/src/App.vue
index d91eefc4..70c911b5 100644
--- a/typescript-with-tests/src/App.vue
+++ b/typescript-with-tests/src/App.vue
@@ -4,30 +4,22 @@ import TheWelcome from './components/TheWelcome.vue'
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/typescript-with-tests/src/assets/main.css b/typescript-with-tests/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/typescript-with-tests/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/typescript-with-tests/src/components/HelloWorld.vue b/typescript-with-tests/src/components/HelloWorld.vue
index 01118cd9..624fb3e0 100644
--- a/typescript-with-tests/src/components/HelloWorld.vue
+++ b/typescript-with-tests/src/components/HelloWorld.vue
@@ -10,7 +10,7 @@ defineProps<{
You’ve successfully created a project with
Vite +
- Vue 3 .
+ Vue 2 .
diff --git a/typescript-with-tests/src/components/TheWelcome.vue b/typescript-with-tests/src/components/TheWelcome.vue
index b91a8edd..51d12392 100644
--- a/typescript-with-tests/src/components/TheWelcome.vue
+++ b/typescript-with-tests/src/components/TheWelcome.vue
@@ -8,77 +8,79 @@ import SupportIcon from './icons/IconSupport.vue'
-
-
-
-
- Documentation
+
+
+
+
+
+ Documentation
- Vue’s
- official documentation
- provides you with all information you need to get started.
-
+ Vue’s
+
official documentation
+ provides you with all information you need to get started.
+
-
-
-
-
- Tooling
+
+
+
+
+ Tooling
- This project is served and bundled with
- Vite . The recommended IDE
- setup is VSCode +
- Volar . If you need to test
- your components and web pages, check out
- Cypress and
- Cypress Component Testing .
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
-
+
- More instructions are available in README.md
.
-
+ More instructions are available in README.md
.
+
-
-
-
-
- Ecosystem
+
+
+
+
+ Ecosystem
- Get official tools and libraries for your project:
- Vuex ,
- Vue Router ,
- Vue Test Utils , and
- Vue Dev Tools . If you need more
- resources, we suggest paying
- Awesome Vue
- a visit.
-
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
-
-
-
-
- Community
+
+
+
+
+ Community
- Got stuck? Ask your question on
- Vue Land , our official Discord server, or
- StackOverflow .
- You should also subscribe to
- our mailing list and follow the official
- @vuejs
- twitter account for latest news in the Vue world.
-
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
-
-
-
-
- Support Vue
+
+
+
+
+ Support Vue
- As an independent project, Vue relies on community backing for its sustainability. You can help
- us by
- becoming a sponsor .
-
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
diff --git a/typescript-with-tests/src/components/__tests__/HelloWorld.spec.ts b/typescript-with-tests/src/components/__tests__/HelloWorld.spec.ts
index a69f3a9d..293bf197 100644
--- a/typescript-with-tests/src/components/__tests__/HelloWorld.spec.ts
+++ b/typescript-with-tests/src/components/__tests__/HelloWorld.spec.ts
@@ -1,13 +1,11 @@
-import { mount } from '@cypress/vue'
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
import HelloWorld from '../HelloWorld.vue'
describe('HelloWorld', () => {
- it('playground', () => {
- mount(HelloWorld, { props: { msg: 'Hello Cypress' } })
- })
-
it('renders properly', () => {
- mount(HelloWorld, { props: { msg: 'Hello Cypress' } })
- cy.get('h1').should('contain', 'Hello Cypress')
+ const wrapper = mount(HelloWorld, { propsData: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
})
})
diff --git a/typescript-with-tests/src/components/icons/IconTooling.vue b/typescript-with-tests/src/components/icons/IconTooling.vue
index 660598d7..07dc46b0 100644
--- a/typescript-with-tests/src/components/icons/IconTooling.vue
+++ b/typescript-with-tests/src/components/icons/IconTooling.vue
@@ -2,8 +2,6 @@
h(App)
+}).$mount('#app')
diff --git a/typescript-with-tests/tsconfig.app.json b/typescript-with-tests/tsconfig.app.json
new file mode 100644
index 00000000..cdbea1d7
--- /dev/null
+++ b/typescript-with-tests/tsconfig.app.json
@@ -0,0 +1,12 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
+ "exclude": ["src/**/__tests__/*"],
+ "compilerOptions": {
+ "composite": true,
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ }
+}
diff --git a/typescript-with-tests/tsconfig.config.json b/typescript-with-tests/tsconfig.config.json
new file mode 100644
index 00000000..c2d3a309
--- /dev/null
+++ b/typescript-with-tests/tsconfig.config.json
@@ -0,0 +1,8 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.node.json",
+ "include": ["vite.config.*", "vitest.config.*", "cypress.config.*"],
+ "compilerOptions": {
+ "composite": true,
+ "types": ["node"]
+ }
+}
diff --git a/typescript-with-tests/tsconfig.json b/typescript-with-tests/tsconfig.json
index 8c707192..31f90037 100644
--- a/typescript-with-tests/tsconfig.json
+++ b/typescript-with-tests/tsconfig.json
@@ -1,21 +1,14 @@
{
- "compilerOptions": {
- "baseUrl": "./",
- "target": "esnext",
- "useDefineForClassFields": true,
- "module": "esnext",
- "moduleResolution": "node",
- "isolatedModules": true,
- "strict": true,
- "jsx": "preserve",
- "sourceMap": true,
- "resolveJsonModule": true,
- "esModuleInterop": true,
- "paths": {
- "@/*": ["src/*"]
+ "files": [],
+ "references": [
+ {
+ "path": "./tsconfig.config.json"
},
- "lib": ["esnext", "dom", "dom.iterable", "scripthost"],
- "skipLibCheck": true
- },
- "include": ["vite.config.*", "env.d.ts", "src/**/*", "src/**/*.vue"]
+ {
+ "path": "./tsconfig.app.json"
+ },
+ {
+ "path": "./tsconfig.vitest.json"
+ }
+ ]
}
diff --git a/typescript-with-tests/tsconfig.vitest.json b/typescript-with-tests/tsconfig.vitest.json
new file mode 100644
index 00000000..d080d611
--- /dev/null
+++ b/typescript-with-tests/tsconfig.vitest.json
@@ -0,0 +1,9 @@
+{
+ "extends": "./tsconfig.app.json",
+ "exclude": [],
+ "compilerOptions": {
+ "composite": true,
+ "lib": [],
+ "types": ["node", "jsdom"]
+ }
+}
diff --git a/typescript-with-tests/vite.config.ts b/typescript-with-tests/vite.config.ts
index 5cd06c63..d4945079 100644
--- a/typescript-with-tests/vite.config.ts
+++ b/typescript-with-tests/vite.config.ts
@@ -1,11 +1,18 @@
-import { fileURLToPath } from 'url'
+import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vite'
-import vue from '@vitejs/plugin-vue'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
// https://vitejs.dev/config/
export default defineConfig({
- plugins: [vue()],
+ plugins: [
+ vue2(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
diff --git a/typescript/README.md b/typescript/README.md
index 5d2ef358..734ce2d1 100644
--- a/typescript/README.md
+++ b/typescript/README.md
@@ -4,13 +4,18 @@ This template should help get you started developing with Vue 3 in Vite.
## Recommended IDE Setup
-[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=johnsoncodehk.volar) (and disable Vetur).
+[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).
## Type Support for `.vue` Imports in TS
-Since TypeScript cannot handle type information for `.vue` imports, they are shimmed to be a generic Vue component type by default. In most cases this is fine if you don't really care about component prop types outside of templates.
+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.
-However, if you wish to get actual prop types in `.vue` imports (for example to get props validation when using manual `h(...)` calls), you can run `Volar: Switch TS Plugin on/off` from VSCode command palette.
+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:
+
+1. Disable the built-in TypeScript Extension
+ 1) Run `Extensions: Show Built-in Extensions` from VSCode's command palette
+ 2) Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)`
+2. Reload the VSCode window by running `Developer: Reload Window` from the command palette.
## Customize configuration
diff --git a/typescript/env.d.ts b/typescript/env.d.ts
index 636d9c3f..11f02fe2 100644
--- a/typescript/env.d.ts
+++ b/typescript/env.d.ts
@@ -1,8 +1 @@
///
-
-declare module '*.vue' {
- import { DefineComponent } from 'vue'
- // eslint-disable-next-line
- const component: DefineComponent<{}, {}, any>
- export default component
-}
diff --git a/typescript/package.json b/typescript/package.json
index f70d3e79..cff6e922 100644
--- a/typescript/package.json
+++ b/typescript/package.json
@@ -3,18 +3,23 @@
"version": "0.0.0",
"scripts": {
"dev": "vite",
- "build": "vue-tsc --noEmit && vite build",
- "preview": "vite preview --port 5050",
- "typecheck": "vue-tsc --noEmit"
+ "build": "run-p type-check build-only",
+ "preview": "vite preview --port 4173",
+ "build-only": "vite build",
+ "type-check": "vue-tsc --noEmit"
},
"dependencies": {
- "vue": "^3.2.22"
+ "vue": "^2.7.7"
},
"devDependencies": {
- "@types/node": "^16.11.10",
- "@vitejs/plugin-vue": "^1.10.0",
- "typescript": "~4.4.4",
- "vite": "^2.6.14",
- "vue-tsc": "^0.29.6"
+ "@types/node": "^16.11.45",
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vue/tsconfig": "^0.1.3",
+ "npm-run-all": "^4.1.5",
+ "terser": "^5.14.2",
+ "typescript": "~4.7.4",
+ "vite": "^3.0.2",
+ "vue-tsc": "^0.38.8"
}
}
diff --git a/typescript/src/App.vue b/typescript/src/App.vue
index d91eefc4..70c911b5 100644
--- a/typescript/src/App.vue
+++ b/typescript/src/App.vue
@@ -4,30 +4,22 @@ import TheWelcome from './components/TheWelcome.vue'
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/typescript/src/assets/main.css b/typescript/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/typescript/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/typescript/src/components/HelloWorld.vue b/typescript/src/components/HelloWorld.vue
index 01118cd9..624fb3e0 100644
--- a/typescript/src/components/HelloWorld.vue
+++ b/typescript/src/components/HelloWorld.vue
@@ -10,7 +10,7 @@ defineProps<{
You’ve successfully created a project with
Vite +
- Vue 3 .
+ Vue 2 .
diff --git a/typescript/src/components/TheWelcome.vue b/typescript/src/components/TheWelcome.vue
index b91a8edd..51d12392 100644
--- a/typescript/src/components/TheWelcome.vue
+++ b/typescript/src/components/TheWelcome.vue
@@ -8,77 +8,79 @@ import SupportIcon from './icons/IconSupport.vue'
-
-
-
-
- Documentation
+
+
+
+
+
+ Documentation
- Vue’s
- official documentation
- provides you with all information you need to get started.
-
+ Vue’s
+
official documentation
+ provides you with all information you need to get started.
+
-
-
-
-
- Tooling
+
+
+
+
+ Tooling
- This project is served and bundled with
- Vite . The recommended IDE
- setup is VSCode +
- Volar . If you need to test
- your components and web pages, check out
- Cypress and
- Cypress Component Testing .
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
-
+
- More instructions are available in README.md
.
-
+ More instructions are available in README.md
.
+
-
-
-
-
- Ecosystem
+
+
+
+
+ Ecosystem
- Get official tools and libraries for your project:
- Vuex ,
- Vue Router ,
- Vue Test Utils , and
- Vue Dev Tools . If you need more
- resources, we suggest paying
- Awesome Vue
- a visit.
-
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
-
-
-
-
- Community
+
+
+
+
+ Community
- Got stuck? Ask your question on
- Vue Land , our official Discord server, or
- StackOverflow .
- You should also subscribe to
- our mailing list and follow the official
- @vuejs
- twitter account for latest news in the Vue world.
-
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
-
-
-
-
- Support Vue
+
+
+
+
+ Support Vue
- As an independent project, Vue relies on community backing for its sustainability. You can help
- us by
- becoming a sponsor .
-
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
diff --git a/typescript/src/components/icons/IconTooling.vue b/typescript/src/components/icons/IconTooling.vue
index 660598d7..07dc46b0 100644
--- a/typescript/src/components/icons/IconTooling.vue
+++ b/typescript/src/components/icons/IconTooling.vue
@@ -2,8 +2,6 @@
h(App)
+}).$mount('#app')
diff --git a/typescript/tsconfig.config.json b/typescript/tsconfig.config.json
new file mode 100644
index 00000000..c2d3a309
--- /dev/null
+++ b/typescript/tsconfig.config.json
@@ -0,0 +1,8 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.node.json",
+ "include": ["vite.config.*", "vitest.config.*", "cypress.config.*"],
+ "compilerOptions": {
+ "composite": true,
+ "types": ["node"]
+ }
+}
diff --git a/typescript/tsconfig.json b/typescript/tsconfig.json
index 8c707192..8d235999 100644
--- a/typescript/tsconfig.json
+++ b/typescript/tsconfig.json
@@ -1,21 +1,16 @@
{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
"compilerOptions": {
- "baseUrl": "./",
- "target": "esnext",
- "useDefineForClassFields": true,
- "module": "esnext",
- "moduleResolution": "node",
- "isolatedModules": true,
- "strict": true,
- "jsx": "preserve",
- "sourceMap": true,
- "resolveJsonModule": true,
- "esModuleInterop": true,
+ "baseUrl": ".",
"paths": {
- "@/*": ["src/*"]
- },
- "lib": ["esnext", "dom", "dom.iterable", "scripthost"],
- "skipLibCheck": true
+ "@/*": ["./src/*"]
+ }
},
- "include": ["vite.config.*", "env.d.ts", "src/**/*", "src/**/*.vue"]
+
+ "references": [
+ {
+ "path": "./tsconfig.config.json"
+ }
+ ]
}
diff --git a/typescript/vite.config.ts b/typescript/vite.config.ts
index 5cd06c63..d4945079 100644
--- a/typescript/vite.config.ts
+++ b/typescript/vite.config.ts
@@ -1,11 +1,18 @@
-import { fileURLToPath } from 'url'
+import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vite'
-import vue from '@vitejs/plugin-vue'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
// https://vitejs.dev/config/
export default defineConfig({
- plugins: [vue()],
+ plugins: [
+ vue2(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
diff --git a/vitest-cypress/.gitignore b/vitest-cypress/.gitignore
new file mode 100644
index 00000000..133da84e
--- /dev/null
+++ b/vitest-cypress/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/vitest-cypress/README.md b/vitest-cypress/README.md
new file mode 100644
index 00000000..9c3381ee
--- /dev/null
+++ b/vitest-cypress/README.md
@@ -0,0 +1,42 @@
+# vitest-cypress
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[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).
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Unit Tests with [Vitest](https://vitest.dev/)
+
+```sh
+pnpm test:unit
+```
+
+### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
+
+```sh
+pnpm build
+pnpm test:e2e # or `pnpm test:e2e:ci` for headless testing
+```
diff --git a/vitest-cypress/cypress.config.js b/vitest-cypress/cypress.config.js
new file mode 100644
index 00000000..9cf6a199
--- /dev/null
+++ b/vitest-cypress/cypress.config.js
@@ -0,0 +1,8 @@
+const { defineConfig } = require('cypress')
+
+module.exports = defineConfig({
+ e2e: {
+ specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
+ baseUrl: 'http://localhost:4173/'
+ }
+})
diff --git a/vitest-cypress/cypress/e2e/example.cy.js b/vitest-cypress/cypress/e2e/example.cy.js
new file mode 100644
index 00000000..7a8c909f
--- /dev/null
+++ b/vitest-cypress/cypress/e2e/example.cy.js
@@ -0,0 +1,8 @@
+// https://docs.cypress.io/api/introduction/api.html
+
+describe('My First Test', () => {
+ it('visits the app root url', () => {
+ cy.visit('/')
+ cy.contains('h1', 'You did it!')
+ })
+})
diff --git a/vitest-cypress/cypress/e2e/jsconfig.json b/vitest-cypress/cypress/e2e/jsconfig.json
new file mode 100644
index 00000000..c790a70d
--- /dev/null
+++ b/vitest-cypress/cypress/e2e/jsconfig.json
@@ -0,0 +1,8 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "lib": ["es5", "dom"],
+ "types": ["cypress"]
+ },
+ "include": ["./**/*", "../support/**/*"]
+}
diff --git a/vitest-cypress/cypress/fixtures/example.json b/vitest-cypress/cypress/fixtures/example.json
new file mode 100644
index 00000000..02e42543
--- /dev/null
+++ b/vitest-cypress/cypress/fixtures/example.json
@@ -0,0 +1,5 @@
+{
+ "name": "Using fixtures to represent data",
+ "email": "hello@cypress.io",
+ "body": "Fixtures are a great way to mock data for responses to routes"
+}
diff --git a/vitest-cypress/cypress/support/commands.js b/vitest-cypress/cypress/support/commands.js
new file mode 100644
index 00000000..119ab03f
--- /dev/null
+++ b/vitest-cypress/cypress/support/commands.js
@@ -0,0 +1,25 @@
+// ***********************************************
+// This example commands.js shows you how to
+// create various custom commands and overwrite
+// existing commands.
+//
+// For more comprehensive examples of custom
+// commands please read more here:
+// https://on.cypress.io/custom-commands
+// ***********************************************
+//
+//
+// -- This is a parent command --
+// Cypress.Commands.add('login', (email, password) => { ... })
+//
+//
+// -- This is a child command --
+// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
+//
+//
+// -- This is a dual command --
+// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
+//
+//
+// -- This will overwrite an existing command --
+// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
diff --git a/vitest-cypress/cypress/support/e2e.js b/vitest-cypress/cypress/support/e2e.js
new file mode 100644
index 00000000..d68db96d
--- /dev/null
+++ b/vitest-cypress/cypress/support/e2e.js
@@ -0,0 +1,20 @@
+// ***********************************************************
+// This example support/index.js is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
diff --git a/vitest-cypress/index.html b/vitest-cypress/index.html
new file mode 100644
index 00000000..030a6ff5
--- /dev/null
+++ b/vitest-cypress/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/vitest-cypress/package.json b/vitest-cypress/package.json
new file mode 100644
index 00000000..7daf2104
--- /dev/null
+++ b/vitest-cypress/package.json
@@ -0,0 +1,27 @@
+{
+ "name": "vitest-cypress",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom",
+ "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
+ "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'"
+ },
+ "dependencies": {
+ "vue": "^2.7.7"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vue/test-utils": "^1.3.0",
+ "cypress": "^10.3.0",
+ "jsdom": "^20.0.0",
+ "start-server-and-test": "^1.14.0",
+ "terser": "^5.14.2",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7"
+ }
+}
diff --git a/vitest-cypress/public/favicon.ico b/vitest-cypress/public/favicon.ico
new file mode 100644
index 00000000..df36fcfb
Binary files /dev/null and b/vitest-cypress/public/favicon.ico differ
diff --git a/vitest-cypress/src/App.vue b/vitest-cypress/src/App.vue
new file mode 100644
index 00000000..45fbfd94
--- /dev/null
+++ b/vitest-cypress/src/App.vue
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/vitest-cypress/src/assets/base.css b/vitest-cypress/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/vitest-cypress/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/vitest-cypress/src/assets/logo.svg b/vitest-cypress/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/vitest-cypress/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/vitest-cypress/src/assets/main.css b/vitest-cypress/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/vitest-cypress/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/vitest-cypress/src/components/HelloWorld.vue b/vitest-cypress/src/components/HelloWorld.vue
new file mode 100644
index 00000000..de8b576a
--- /dev/null
+++ b/vitest-cypress/src/components/HelloWorld.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 .
+
+
+
+
+
diff --git a/vitest-cypress/src/components/TheWelcome.vue b/vitest-cypress/src/components/TheWelcome.vue
new file mode 100644
index 00000000..cccc38ef
--- /dev/null
+++ b/vitest-cypress/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/vitest-cypress/src/components/WelcomeItem.vue b/vitest-cypress/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/vitest-cypress/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/vitest-cypress/src/components/__tests__/HelloWorld.spec.js b/vitest-cypress/src/components/__tests__/HelloWorld.spec.js
new file mode 100644
index 00000000..293bf197
--- /dev/null
+++ b/vitest-cypress/src/components/__tests__/HelloWorld.spec.js
@@ -0,0 +1,11 @@
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('renders properly', () => {
+ const wrapper = mount(HelloWorld, { propsData: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
+ })
+})
diff --git a/vitest-cypress/src/components/icons/IconCommunity.vue b/vitest-cypress/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/vitest-cypress/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/vitest-cypress/src/components/icons/IconDocumentation.vue b/vitest-cypress/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/vitest-cypress/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/vitest-cypress/src/components/icons/IconEcosystem.vue b/vitest-cypress/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/vitest-cypress/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/vitest-cypress/src/components/icons/IconSupport.vue b/vitest-cypress/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/vitest-cypress/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/vitest-cypress/src/components/icons/IconTooling.vue b/vitest-cypress/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/vitest-cypress/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/vitest-cypress/src/main.js b/vitest-cypress/src/main.js
new file mode 100644
index 00000000..c5da47dc
--- /dev/null
+++ b/vitest-cypress/src/main.js
@@ -0,0 +1,8 @@
+import Vue from 'vue'
+import App from './App.vue'
+
+import './assets/main.css'
+
+new Vue({
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/vitest-cypress/vite.config.js b/vitest-cypress/vite.config.js
new file mode 100644
index 00000000..d4945079
--- /dev/null
+++ b/vitest-cypress/vite.config.js
@@ -0,0 +1,21 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/vitest/.gitignore b/vitest/.gitignore
new file mode 100644
index 00000000..133da84e
--- /dev/null
+++ b/vitest/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/vitest/README.md b/vitest/README.md
new file mode 100644
index 00000000..48871df5
--- /dev/null
+++ b/vitest/README.md
@@ -0,0 +1,35 @@
+# vitest
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[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).
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+pnpm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+pnpm dev
+```
+
+### Compile and Minify for Production
+
+```sh
+pnpm build
+```
+
+### Run Unit Tests with [Vitest](https://vitest.dev/)
+
+```sh
+pnpm test:unit
+```
diff --git a/vitest/index.html b/vitest/index.html
new file mode 100644
index 00000000..030a6ff5
--- /dev/null
+++ b/vitest/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/vitest/package.json b/vitest/package.json
new file mode 100644
index 00000000..c2616857
--- /dev/null
+++ b/vitest/package.json
@@ -0,0 +1,23 @@
+{
+ "name": "vitest",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom"
+ },
+ "dependencies": {
+ "vue": "^2.7.7"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vue/test-utils": "^1.3.0",
+ "jsdom": "^20.0.0",
+ "terser": "^5.14.2",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7"
+ }
+}
diff --git a/vitest/public/favicon.ico b/vitest/public/favicon.ico
new file mode 100644
index 00000000..df36fcfb
Binary files /dev/null and b/vitest/public/favicon.ico differ
diff --git a/vitest/src/App.vue b/vitest/src/App.vue
new file mode 100644
index 00000000..45fbfd94
--- /dev/null
+++ b/vitest/src/App.vue
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/vitest/src/assets/base.css b/vitest/src/assets/base.css
new file mode 100644
index 00000000..5427a030
--- /dev/null
+++ b/vitest/src/assets/base.css
@@ -0,0 +1,74 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dadarkrk-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ position: relative;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition: color 0.5s, background-color 0.5s;
+ line-height: 1.6;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/vitest/src/assets/logo.svg b/vitest/src/assets/logo.svg
new file mode 100644
index 00000000..bc826fed
--- /dev/null
+++ b/vitest/src/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/vitest/src/assets/main.css b/vitest/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/vitest/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/vitest/src/components/HelloWorld.vue b/vitest/src/components/HelloWorld.vue
new file mode 100644
index 00000000..de8b576a
--- /dev/null
+++ b/vitest/src/components/HelloWorld.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 2 .
+
+
+
+
+
diff --git a/vitest/src/components/TheWelcome.vue b/vitest/src/components/TheWelcome.vue
new file mode 100644
index 00000000..cccc38ef
--- /dev/null
+++ b/vitest/src/components/TheWelcome.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
+
+
+
+ More instructions are available in README.md
.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
+
diff --git a/vitest/src/components/WelcomeItem.vue b/vitest/src/components/WelcomeItem.vue
new file mode 100644
index 00000000..ba0def33
--- /dev/null
+++ b/vitest/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
diff --git a/vitest/src/components/__tests__/HelloWorld.spec.js b/vitest/src/components/__tests__/HelloWorld.spec.js
new file mode 100644
index 00000000..293bf197
--- /dev/null
+++ b/vitest/src/components/__tests__/HelloWorld.spec.js
@@ -0,0 +1,11 @@
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
+import HelloWorld from '../HelloWorld.vue'
+
+describe('HelloWorld', () => {
+ it('renders properly', () => {
+ const wrapper = mount(HelloWorld, { propsData: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
+ })
+})
diff --git a/vitest/src/components/icons/IconCommunity.vue b/vitest/src/components/icons/IconCommunity.vue
new file mode 100644
index 00000000..2dc8b055
--- /dev/null
+++ b/vitest/src/components/icons/IconCommunity.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/vitest/src/components/icons/IconDocumentation.vue b/vitest/src/components/icons/IconDocumentation.vue
new file mode 100644
index 00000000..6d4791cf
--- /dev/null
+++ b/vitest/src/components/icons/IconDocumentation.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/vitest/src/components/icons/IconEcosystem.vue b/vitest/src/components/icons/IconEcosystem.vue
new file mode 100644
index 00000000..c3a4f078
--- /dev/null
+++ b/vitest/src/components/icons/IconEcosystem.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/vitest/src/components/icons/IconSupport.vue b/vitest/src/components/icons/IconSupport.vue
new file mode 100644
index 00000000..7452834d
--- /dev/null
+++ b/vitest/src/components/icons/IconSupport.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/vitest/src/components/icons/IconTooling.vue b/vitest/src/components/icons/IconTooling.vue
new file mode 100644
index 00000000..07dc46b0
--- /dev/null
+++ b/vitest/src/components/icons/IconTooling.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/vitest/src/main.js b/vitest/src/main.js
new file mode 100644
index 00000000..c5da47dc
--- /dev/null
+++ b/vitest/src/main.js
@@ -0,0 +1,8 @@
+import Vue from 'vue'
+import App from './App.vue'
+
+import './assets/main.css'
+
+new Vue({
+ render: (h) => h(App)
+}).$mount('#app')
diff --git a/vitest/vite.config.js b/vitest/vite.config.js
new file mode 100644
index 00000000..d4945079
--- /dev/null
+++ b/vitest/vite.config.js
@@ -0,0 +1,21 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue2(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/with-tests/README.md b/with-tests/README.md
index ea2966b7..b6acbd80 100644
--- a/with-tests/README.md
+++ b/with-tests/README.md
@@ -4,7 +4,7 @@ This template should help get you started developing with Vue 3 in Vite.
## Recommended IDE Setup
-[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=johnsoncodehk.volar) (and disable Vetur).
+[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).
## Customize configuration
@@ -28,10 +28,10 @@ pnpm dev
pnpm build
```
-### Run Unit Tests with [Cypress Component Testing](https://docs.cypress.io/guides/component-testing/introduction)
+### Run Unit Tests with [Vitest](https://vitest.dev/)
```sh
-pnpm test:unit # or `pnpm test:unit:ci` for headless testing
+pnpm test:unit
```
### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
diff --git a/with-tests/cypress.config.js b/with-tests/cypress.config.js
new file mode 100644
index 00000000..9cf6a199
--- /dev/null
+++ b/with-tests/cypress.config.js
@@ -0,0 +1,8 @@
+const { defineConfig } = require('cypress')
+
+module.exports = defineConfig({
+ e2e: {
+ specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
+ baseUrl: 'http://localhost:4173/'
+ }
+})
diff --git a/with-tests/cypress.json b/with-tests/cypress.json
deleted file mode 100644
index 3d372252..00000000
--- a/with-tests/cypress.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "baseUrl": "http://localhost:5050/",
- "component": {
- "componentFolder": "src",
- "testFiles": "**/__tests__/*.spec.{js,ts,jsx,tsx}"
- }
-}
diff --git a/with-tests/cypress/e2e/example.cy.js b/with-tests/cypress/e2e/example.cy.js
new file mode 100644
index 00000000..7a8c909f
--- /dev/null
+++ b/with-tests/cypress/e2e/example.cy.js
@@ -0,0 +1,8 @@
+// https://docs.cypress.io/api/introduction/api.html
+
+describe('My First Test', () => {
+ it('visits the app root url', () => {
+ cy.visit('/')
+ cy.contains('h1', 'You did it!')
+ })
+})
diff --git a/with-tests/cypress/e2e/jsconfig.json b/with-tests/cypress/e2e/jsconfig.json
new file mode 100644
index 00000000..c790a70d
--- /dev/null
+++ b/with-tests/cypress/e2e/jsconfig.json
@@ -0,0 +1,8 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "lib": ["es5", "dom"],
+ "types": ["cypress"]
+ },
+ "include": ["./**/*", "../support/**/*"]
+}
diff --git a/with-tests/cypress/jsconfig.json b/with-tests/cypress/jsconfig.json
deleted file mode 100644
index b5b2f972..00000000
--- a/with-tests/cypress/jsconfig.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "compilerOptions": {
- "target": "es5",
- "lib": ["es5", "dom"],
- "types": ["cypress"]
- },
- "include": ["./**/*"]
-}
diff --git a/with-tests/cypress/plugins/index.js b/with-tests/cypress/plugins/index.js
deleted file mode 100644
index ad2e351d..00000000
--- a/with-tests/cypress/plugins/index.js
+++ /dev/null
@@ -1,28 +0,0 @@
-///
-// ***********************************************************
-// This example plugins/index.js can be used to load plugins
-//
-// You can change the location of this file or turn off loading
-// the plugins file with the 'pluginsFile' configuration option.
-//
-// You can read more here:
-// https://on.cypress.io/plugins-guide
-// ***********************************************************
-
-// This function is called when a project is opened or re-opened (e.g. due to
-// the project's config changing)
-
-const { startDevServer } = require('@cypress/vite-dev-server')
-
-/**
- * @type {Cypress.PluginConfig}
- */
-// eslint-disable-next-line no-unused-vars
-module.exports = (on, config) => {
- // `on` is used to hook into various events Cypress emits
- // `config` is the resolved Cypress config
- on('dev-server:start', (options) => {
- return startDevServer({ options })
- })
- return config
-}
diff --git a/with-tests/cypress/support/e2e.js b/with-tests/cypress/support/e2e.js
new file mode 100644
index 00000000..d68db96d
--- /dev/null
+++ b/with-tests/cypress/support/e2e.js
@@ -0,0 +1,20 @@
+// ***********************************************************
+// This example support/index.js is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
diff --git a/with-tests/package.json b/with-tests/package.json
index 4c32f83a..c5ae4c0b 100644
--- a/with-tests/package.json
+++ b/with-tests/package.json
@@ -4,21 +4,24 @@
"scripts": {
"dev": "vite",
"build": "vite build",
- "preview": "vite preview --port 5050",
- "test:unit": "cypress open-ct",
- "test:unit:ci": "cypress run-ct --quiet --reporter spec",
- "test:e2e": "start-server-and-test preview http://127.0.0.1:5050/ 'cypress open'",
- "test:e2e:ci": "start-server-and-test preview http://127.0.0.1:5050/ 'cypress run'"
+ "preview": "vite preview --port 4173",
+ "test:unit": "vitest --environment jsdom",
+ "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
+ "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'"
},
"dependencies": {
- "vue": "^3.2.22"
+ "vue": "^2.7.7"
},
"devDependencies": {
- "@cypress/vite-dev-server": "^2.2.1",
- "@cypress/vue": "^3.0.5",
- "@vitejs/plugin-vue": "^1.10.0",
- "cypress": "^8.7.0",
+ "@vitejs/plugin-legacy": "^2.0.0",
+ "@vitejs/plugin-vue2": "^1.1.2",
+ "@vue/test-utils": "^1.3.0",
+ "cypress": "^10.3.0",
+ "jsdom": "^20.0.0",
"start-server-and-test": "^1.14.0",
- "vite": "^2.6.14"
+ "terser": "^5.14.2",
+ "vite": "^3.0.2",
+ "vitest": "^0.18.1",
+ "vue-template-compiler": "^2.7.7"
}
}
diff --git a/with-tests/src/App.vue b/with-tests/src/App.vue
index b0b6901b..45fbfd94 100644
--- a/with-tests/src/App.vue
+++ b/with-tests/src/App.vue
@@ -4,30 +4,22 @@ import TheWelcome from './components/TheWelcome.vue'
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/with-tests/src/assets/main.css b/with-tests/src/assets/main.css
new file mode 100644
index 00000000..c133f915
--- /dev/null
+++ b/with-tests/src/assets/main.css
@@ -0,0 +1,35 @@
+@import "https://github.com/base.css";
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+
+ font-weight: normal;
+}
+
+a,
+.green {
+ text-decoration: none;
+ color: hsla(160, 100%, 37%, 1);
+ transition: 0.4s;
+}
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
+
+@media (min-width: 1024px) {
+ body {
+ display: flex;
+ place-items: center;
+ }
+
+ #app {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ padding: 0 2rem;
+ }
+}
diff --git a/with-tests/src/components/HelloWorld.vue b/with-tests/src/components/HelloWorld.vue
index aa16fa1f..de8b576a 100644
--- a/with-tests/src/components/HelloWorld.vue
+++ b/with-tests/src/components/HelloWorld.vue
@@ -13,7 +13,7 @@ defineProps({
You’ve successfully created a project with
Vite +
- Vue 3 .
+ Vue 2 .
diff --git a/with-tests/src/components/TheWelcome.vue b/with-tests/src/components/TheWelcome.vue
index 1d003f86..cccc38ef 100644
--- a/with-tests/src/components/TheWelcome.vue
+++ b/with-tests/src/components/TheWelcome.vue
@@ -8,77 +8,79 @@ import SupportIcon from './icons/IconSupport.vue'
-
-
-
-
- Documentation
+
+
+
+
+
+ Documentation
- Vue’s
- official documentation
- provides you with all information you need to get started.
-
+ Vue’s
+
official documentation
+ provides you with all information you need to get started.
+
-
-
-
-
- Tooling
+
+
+
+
+ Tooling
- This project is served and bundled with
- Vite . The recommended IDE
- setup is VSCode +
- Volar . If you need to test
- your components and web pages, check out
- Cypress and
- Cypress Component Testing .
+ This project is served and bundled with
+ Vite . The recommended IDE
+ setup is VSCode +
+ Volar . If you need to
+ test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing .
-
+
- More instructions are available in README.md
.
-
+ More instructions are available in README.md
.
+
-
-
-
-
- Ecosystem
+
+
+
+
+ Ecosystem
- Get official tools and libraries for your project:
- Vuex ,
- Vue Router ,
- Vue Test Utils , and
- Vue Dev Tools . If you need more
- resources, we suggest paying
- Awesome Vue
- a visit.
-
+ Get official tools and libraries for your project:
+ Pinia ,
+ Vue Router ,
+ Vue Test Utils , and
+ Vue Dev Tools . If you need
+ more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
-
-
-
-
- Community
+
+
+
+
+ Community
- Got stuck? Ask your question on
- Vue Land , our official Discord server, or
- StackOverflow .
- You should also subscribe to
- our mailing list and follow the official
- @vuejs
- twitter account for latest news in the Vue world.
-
+ Got stuck? Ask your question on
+ Vue Land , our official Discord server, or
+ StackOverflow .
+ You should also subscribe to
+ our mailing list and follow the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
-
-
-
-
- Support Vue
+
+
+
+
+ Support Vue
- As an independent project, Vue relies on community backing for its sustainability. You can help
- us by
- becoming a sponsor .
-
+ As an independent project, Vue relies on community backing for its sustainability. You can
+ help us by
+ becoming a sponsor .
+
+
diff --git a/with-tests/src/components/__tests__/HelloWorld.spec.js b/with-tests/src/components/__tests__/HelloWorld.spec.js
index a69f3a9d..293bf197 100644
--- a/with-tests/src/components/__tests__/HelloWorld.spec.js
+++ b/with-tests/src/components/__tests__/HelloWorld.spec.js
@@ -1,13 +1,11 @@
-import { mount } from '@cypress/vue'
+import { describe, it, expect } from 'vitest'
+
+import { mount } from '@vue/test-utils'
import HelloWorld from '../HelloWorld.vue'
describe('HelloWorld', () => {
- it('playground', () => {
- mount(HelloWorld, { props: { msg: 'Hello Cypress' } })
- })
-
it('renders properly', () => {
- mount(HelloWorld, { props: { msg: 'Hello Cypress' } })
- cy.get('h1').should('contain', 'Hello Cypress')
+ const wrapper = mount(HelloWorld, { propsData: { msg: 'Hello Vitest' } })
+ expect(wrapper.text()).toContain('Hello Vitest')
})
})
diff --git a/with-tests/src/components/icons/IconTooling.vue b/with-tests/src/components/icons/IconTooling.vue
index 660598d7..07dc46b0 100644
--- a/with-tests/src/components/icons/IconTooling.vue
+++ b/with-tests/src/components/icons/IconTooling.vue
@@ -2,8 +2,6 @@
h(App)
+}).$mount('#app')
diff --git a/with-tests/vite.config.js b/with-tests/vite.config.js
index 5cd06c63..d4945079 100644
--- a/with-tests/vite.config.js
+++ b/with-tests/vite.config.js
@@ -1,11 +1,18 @@
-import { fileURLToPath } from 'url'
+import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vite'
-import vue from '@vitejs/plugin-vue'
+import legacy from '@vitejs/plugin-legacy'
+import vue2 from '@vitejs/plugin-vue2'
// https://vitejs.dev/config/
export default defineConfig({
- plugins: [vue()],
+ plugins: [
+ vue2(),
+ legacy({
+ targets: ['ie >= 11'],
+ additionalLegacyPolyfills: ['regenerator-runtime/runtime']
+ })
+ ],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))