Compare commits

...

1 Commits

Author SHA1 Message Date
mutoe 75fe4ff962
[WIP] chore: migrate to vitest 2022-12-04 00:40:58 +08:00
16 changed files with 492 additions and 77 deletions

7
env.d.ts vendored
View File

@ -1,7 +0,0 @@
/// <reference types="vite/client" />
/* eslint-disable */
declare module '*.vue' {
import type { DefineComponent } from 'vue'
const component: DefineComponent<{}, {}, any>
export default component
}

View File

@ -27,24 +27,29 @@
"vue-router": "^4.1.6" "vue-router": "^4.1.6"
}, },
"devDependencies": { "devDependencies": {
"@cypress/vue": "^5.0.3",
"@mutoe/eslint-config-preset-vue": "~2.1.2", "@mutoe/eslint-config-preset-vue": "~2.1.2",
"@pinia/testing": "^0.0.14", "@pinia/testing": "^0.0.14",
"@testing-library/cypress": "^8.0.7", "@testing-library/cypress": "^8.0.7",
"@testing-library/vue": "^6.6.1",
"@types/marked": "^4.0.7", "@types/marked": "^4.0.7",
"@vitejs/plugin-vue": "^3.2.0", "@vitejs/plugin-vue": "^3.2.0",
"@vue/compiler-sfc": "^3.2.45",
"@vue/test-utils": "^2.2.5",
"@vue/tsconfig": "^0.1.3", "@vue/tsconfig": "^0.1.3",
"concurrently": "^7.6.0", "concurrently": "^7.6.0",
"cypress": "^11.2.0", "cypress": "^11.2.0",
"eslint": "^8.29.0", "eslint": "^8.29.0",
"eslint-plugin-chai-friendly": "^0.7.2", "eslint-plugin-chai-friendly": "^0.7.2",
"eslint-plugin-cypress": "^2.12.1", "eslint-plugin-cypress": "^2.12.1",
"happy-dom": "^7.7.0",
"husky": "^8.0.2", "husky": "^8.0.2",
"lint-staged": "^13.0.4", "lint-staged": "^13.0.4",
"rollup-plugin-analyzer": "^4.0.0", "rollup-plugin-analyzer": "^4.0.0",
"swagger-typescript-api": "^12.0.2", "swagger-typescript-api": "^12.0.2",
"typescript": "~4.9.3", "typescript": "~4.9.3",
"vite": "^3.2.4", "vite": "^3.2.4",
"vitest": "^0.25.3",
"vitest-fetch-mock": "^0.2.1",
"vue-tsc": "^1.0.11" "vue-tsc": "^1.0.11"
}, },
"lint-staged": { "lint-staged": {

View File

@ -1,18 +1,21 @@
lockfileVersion: 5.4 lockfileVersion: 5.4
specifiers: specifiers:
'@cypress/vue': ^5.0.3
'@mutoe/eslint-config-preset-vue': ~2.1.2 '@mutoe/eslint-config-preset-vue': ~2.1.2
'@pinia/testing': ^0.0.14 '@pinia/testing': ^0.0.14
'@testing-library/cypress': ^8.0.7 '@testing-library/cypress': ^8.0.7
'@testing-library/vue': ^6.6.1
'@types/marked': ^4.0.7 '@types/marked': ^4.0.7
'@vitejs/plugin-vue': ^3.2.0 '@vitejs/plugin-vue': ^3.2.0
'@vue/compiler-sfc': ^3.2.45
'@vue/test-utils': ^2.2.5
'@vue/tsconfig': ^0.1.3 '@vue/tsconfig': ^0.1.3
concurrently: ^7.6.0 concurrently: ^7.6.0
cypress: ^11.2.0 cypress: ^11.2.0
eslint: ^8.29.0 eslint: ^8.29.0
eslint-plugin-chai-friendly: ^0.7.2 eslint-plugin-chai-friendly: ^0.7.2
eslint-plugin-cypress: ^2.12.1 eslint-plugin-cypress: ^2.12.1
happy-dom: ^7.7.0
husky: ^8.0.2 husky: ^8.0.2
insane: ^2.6.2 insane: ^2.6.2
lint-staged: ^13.0.4 lint-staged: ^13.0.4
@ -22,6 +25,8 @@ specifiers:
swagger-typescript-api: ^12.0.2 swagger-typescript-api: ^12.0.2
typescript: ~4.9.3 typescript: ~4.9.3
vite: ^3.2.4 vite: ^3.2.4
vitest: ^0.25.3
vitest-fetch-mock: ^0.2.1
vue: ^3.2.45 vue: ^3.2.45
vue-router: ^4.1.6 vue-router: ^4.1.6
vue-tsc: ^1.0.11 vue-tsc: ^1.0.11
@ -34,24 +39,29 @@ dependencies:
vue-router: 4.1.6_vue@3.2.45 vue-router: 4.1.6_vue@3.2.45
devDependencies: devDependencies:
'@cypress/vue': 5.0.3_cypress@11.2.0+vue@3.2.45
'@mutoe/eslint-config-preset-vue': 2.1.2_5akckbu4tmbn6phmzmqezegkrq '@mutoe/eslint-config-preset-vue': 2.1.2_5akckbu4tmbn6phmzmqezegkrq
'@pinia/testing': 0.0.14_pinia@2.0.27+vue@3.2.45 '@pinia/testing': 0.0.14_pinia@2.0.27+vue@3.2.45
'@testing-library/cypress': 8.0.7_cypress@11.2.0 '@testing-library/cypress': 8.0.7_cypress@11.2.0
'@testing-library/vue': 6.6.1_tfvhctuaqmmqnirfl65c47tqwu
'@types/marked': 4.0.7 '@types/marked': 4.0.7
'@vitejs/plugin-vue': 3.2.0_vite@3.2.4+vue@3.2.45 '@vitejs/plugin-vue': 3.2.0_vite@3.2.4+vue@3.2.45
'@vue/compiler-sfc': 3.2.45
'@vue/test-utils': 2.2.5_vue@3.2.45
'@vue/tsconfig': 0.1.3 '@vue/tsconfig': 0.1.3
concurrently: 7.6.0 concurrently: 7.6.0
cypress: 11.2.0 cypress: 11.2.0
eslint: 8.29.0 eslint: 8.29.0
eslint-plugin-chai-friendly: 0.7.2_eslint@8.29.0 eslint-plugin-chai-friendly: 0.7.2_eslint@8.29.0
eslint-plugin-cypress: 2.12.1_eslint@8.29.0 eslint-plugin-cypress: 2.12.1_eslint@8.29.0
happy-dom: 7.7.0
husky: 8.0.2 husky: 8.0.2
lint-staged: 13.0.4 lint-staged: 13.0.4
rollup-plugin-analyzer: 4.0.0 rollup-plugin-analyzer: 4.0.0
swagger-typescript-api: 12.0.2 swagger-typescript-api: 12.0.2
typescript: 4.9.3 typescript: 4.9.3
vite: 3.2.4 vite: 3.2.4
vitest: 0.25.3_happy-dom@7.7.0
vitest-fetch-mock: 0.2.1_vitest@0.25.3
vue-tsc: 1.0.11_typescript@4.9.3 vue-tsc: 1.0.11_typescript@4.9.3
packages: packages:
@ -133,21 +143,6 @@ packages:
uuid: 8.3.2 uuid: 8.3.2
dev: true dev: true
/@cypress/vue/5.0.3_cypress@11.2.0+vue@3.2.45:
resolution: {integrity: sha512-wGOr/aI5KAwpbO44Anb0lgi3mdOUg8V+F16Mam7txBqSCIoX4nRHNDVOx6MR3fSUEsDRhYi3reF+mQgdZdc9rQ==}
engines: {node: '>=8'}
peerDependencies:
'@cypress/webpack-dev-server': '*'
cypress: '>=7.0.0'
vue: '>=3.0.0'
peerDependenciesMeta:
'@cypress/webpack-dev-server':
optional: true
dependencies:
cypress: 11.2.0
vue: 3.2.45
dev: true
/@cypress/xvfb/1.2.4_supports-color@8.1.1: /@cypress/xvfb/1.2.4_supports-color@8.1.1:
resolution: {integrity: sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==} resolution: {integrity: sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==}
dependencies: dependencies:
@ -345,10 +340,46 @@ packages:
pretty-format: 27.5.1 pretty-format: 27.5.1
dev: true dev: true
/@testing-library/vue/6.6.1_tfvhctuaqmmqnirfl65c47tqwu:
resolution: {integrity: sha512-vpyBPrHzKTwEGS7ehUC8/IXgnqTBEMk6jd52Gouf51arG2jUorPhmkbsxUwJOyxz6L0gj2ZcmWnznG1OJcTCDQ==}
engines: {node: '>=12'}
peerDependencies:
'@vue/compiler-sfc': '>= 3'
vue: '>= 3'
dependencies:
'@babel/runtime': 7.20.6
'@testing-library/dom': 8.19.0
'@vue/compiler-sfc': 3.2.45
'@vue/test-utils': 2.2.5_vue@3.2.45
vue: 3.2.45
dev: true
/@types/aria-query/4.2.2: /@types/aria-query/4.2.2:
resolution: {integrity: sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==} resolution: {integrity: sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==}
dev: true dev: true
/@types/chai-subset/1.3.3:
resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==}
dependencies:
'@types/chai': 4.3.4
dev: true
/@types/chai/4.3.4:
resolution: {integrity: sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==}
dev: true
/@types/concat-stream/1.6.1:
resolution: {integrity: sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==}
dependencies:
'@types/node': 14.18.34
dev: true
/@types/form-data/0.0.33:
resolution: {integrity: sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==}
dependencies:
'@types/node': 14.18.34
dev: true
/@types/json-schema/7.0.11: /@types/json-schema/7.0.11:
resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==}
dev: true dev: true
@ -361,10 +392,18 @@ packages:
resolution: {integrity: sha512-eEAhnz21CwvKVW+YvRvcTuFKNU9CV1qH+opcgVK3pIMI6YZzDm6gc8o2vHjldFk6MGKt5pueSB7IOpvpx5Qekw==} resolution: {integrity: sha512-eEAhnz21CwvKVW+YvRvcTuFKNU9CV1qH+opcgVK3pIMI6YZzDm6gc8o2vHjldFk6MGKt5pueSB7IOpvpx5Qekw==}
dev: true dev: true
/@types/node/10.17.60:
resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==}
dev: true
/@types/node/14.18.34: /@types/node/14.18.34:
resolution: {integrity: sha512-hcU9AIQVHmPnmjRK+XUUYlILlr9pQrsqSrwov/JK1pnf3GTQowVBhx54FbvM0AU/VXGH4i3+vgXS5EguR7fysA==} resolution: {integrity: sha512-hcU9AIQVHmPnmjRK+XUUYlILlr9pQrsqSrwov/JK1pnf3GTQowVBhx54FbvM0AU/VXGH4i3+vgXS5EguR7fysA==}
dev: true dev: true
/@types/node/8.10.66:
resolution: {integrity: sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==}
dev: true
/@types/normalize-package-data/2.4.1: /@types/normalize-package-data/2.4.1:
resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==}
dev: true dev: true
@ -373,6 +412,10 @@ packages:
resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==}
dev: true dev: true
/@types/qs/6.9.7:
resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==}
dev: true
/@types/semver/7.3.13: /@types/semver/7.3.13:
resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==}
dev: true dev: true
@ -653,6 +696,14 @@ packages:
/@vue/shared/3.2.45: /@vue/shared/3.2.45:
resolution: {integrity: sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==} resolution: {integrity: sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==}
/@vue/test-utils/2.2.5_vue@3.2.45:
resolution: {integrity: sha512-iKEbu/VRO53qXJlAupL7d4v+SdaypQuRDxwGO3dgYT7biPh+gJsa+0Z9dnaHIE752nPc/ueAoNd6KAKx6fD+Tw==}
peerDependencies:
vue: ^3.0.1
dependencies:
vue: 3.2.45
dev: true
/@vue/tsconfig/0.1.3: /@vue/tsconfig/0.1.3:
resolution: {integrity: sha512-kQVsh8yyWPvHpb8gIc9l/HIDiiVUy1amynLNpCy8p+FoCiZXCo6fQos5/097MmnNZc9AtseDsCrfkhqCrJ8Olg==} resolution: {integrity: sha512-kQVsh8yyWPvHpb8gIc9l/HIDiiVUy1amynLNpCy8p+FoCiZXCo6fQos5/097MmnNZc9AtseDsCrfkhqCrJ8Olg==}
peerDependencies: peerDependencies:
@ -670,6 +721,11 @@ packages:
acorn: 8.8.1 acorn: 8.8.1
dev: true dev: true
/acorn-walk/8.2.0:
resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==}
engines: {node: '>=0.4.0'}
dev: true
/acorn/8.8.1: /acorn/8.8.1:
resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==} resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==}
engines: {node: '>=0.4.0'} engines: {node: '>=0.4.0'}
@ -779,6 +835,10 @@ packages:
es-shim-unscopables: 1.0.0 es-shim-unscopables: 1.0.0
dev: true dev: true
/asap/2.0.6:
resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==}
dev: true
/asn1/0.2.6: /asn1/0.2.6:
resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==}
dependencies: dependencies:
@ -790,6 +850,10 @@ packages:
engines: {node: '>=0.8'} engines: {node: '>=0.8'}
dev: true dev: true
/assertion-error/1.1.0:
resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==}
dev: true
/assignment/2.0.0: /assignment/2.0.0:
resolution: {integrity: sha512-naMULXjtgCs9SVUEtyvJNt68aF18em7/W+dhbR59kbz9cXWPEvUkCun2tqlgqRPSqZaKPpqLc5ZnwL8jVmJRvw==} resolution: {integrity: sha512-naMULXjtgCs9SVUEtyvJNt68aF18em7/W+dhbR59kbz9cXWPEvUkCun2tqlgqRPSqZaKPpqLc5ZnwL8jVmJRvw==}
dev: false dev: false
@ -875,6 +939,10 @@ packages:
resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
dev: true dev: true
/buffer-from/1.1.2:
resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
dev: true
/buffer/5.7.1: /buffer/5.7.1:
resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
dependencies: dependencies:
@ -918,6 +986,19 @@ packages:
resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==}
dev: true dev: true
/chai/4.3.7:
resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==}
engines: {node: '>=4'}
dependencies:
assertion-error: 1.1.0
check-error: 1.0.2
deep-eql: 4.1.2
get-func-name: 2.0.0
loupe: 2.3.6
pathval: 1.1.1
type-detect: 4.0.8
dev: true
/chalk/2.4.2: /chalk/2.4.2:
resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
engines: {node: '>=4'} engines: {node: '>=4'}
@ -935,6 +1016,10 @@ packages:
supports-color: 7.2.0 supports-color: 7.2.0
dev: true dev: true
/check-error/1.0.2:
resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==}
dev: true
/check-more-types/2.24.0: /check-more-types/2.24.0:
resolution: {integrity: sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==} resolution: {integrity: sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==}
engines: {node: '>= 0.8.0'} engines: {node: '>= 0.8.0'}
@ -1049,6 +1134,16 @@ packages:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
dev: true dev: true
/concat-stream/1.6.2:
resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==}
engines: {'0': node >= 0.8}
dependencies:
buffer-from: 1.1.2
inherits: 2.0.4
readable-stream: 2.3.7
typedarray: 0.0.6
dev: true
/concurrently/7.6.0: /concurrently/7.6.0:
resolution: {integrity: sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==} resolution: {integrity: sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==}
engines: {node: ^12.20.0 || ^14.13.0 || >=16.0.0} engines: {node: ^12.20.0 || ^14.13.0 || >=16.0.0}
@ -1080,6 +1175,14 @@ packages:
yaml: 1.10.2 yaml: 1.10.2
dev: true dev: true
/cross-fetch/3.1.5:
resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==}
dependencies:
node-fetch: 2.6.7
transitivePeerDependencies:
- encoding
dev: true
/cross-spawn/7.0.3: /cross-spawn/7.0.3:
resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
engines: {node: '>= 8'} engines: {node: '>= 8'}
@ -1089,6 +1192,10 @@ packages:
which: 2.0.2 which: 2.0.2
dev: true dev: true
/css.escape/1.5.1:
resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==}
dev: true
/cssesc/3.0.0: /cssesc/3.0.0:
resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
engines: {node: '>=4'} engines: {node: '>=4'}
@ -1232,6 +1339,13 @@ packages:
supports-color: 8.1.1 supports-color: 8.1.1
dev: true dev: true
/deep-eql/4.1.2:
resolution: {integrity: sha512-gT18+YW4CcW/DBNTwAmqTtkJh7f9qqScu2qFVlx7kCoeY9tlBu9cUcr7+I+Z/noG8INehS3xQgLpTtd/QUTn4w==}
engines: {node: '>=6'}
dependencies:
type-detect: 4.0.8
dev: true
/deep-equal/2.1.0: /deep-equal/2.1.0:
resolution: {integrity: sha512-2pxgvWu3Alv1PoWEyVg7HS8YhGlUFUV7N5oOvfL6d+7xAmLSemMwv/c8Zv/i9KFzxV5Kt5CAvQc70fLwVuf4UA==} resolution: {integrity: sha512-2pxgvWu3Alv1PoWEyVg7HS8YhGlUFUV7N5oOvfL6d+7xAmLSemMwv/c8Zv/i9KFzxV5Kt5CAvQc70fLwVuf4UA==}
dependencies: dependencies:
@ -2226,6 +2340,10 @@ packages:
engines: {node: 6.* || 8.* || >= 10.*} engines: {node: 6.* || 8.* || >= 10.*}
dev: true dev: true
/get-func-name/2.0.0:
resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==}
dev: true
/get-intrinsic/1.1.3: /get-intrinsic/1.1.3:
resolution: {integrity: sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==} resolution: {integrity: sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==}
dependencies: dependencies:
@ -2234,6 +2352,11 @@ packages:
has-symbols: 1.0.3 has-symbols: 1.0.3
dev: true dev: true
/get-port/3.2.0:
resolution: {integrity: sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==}
engines: {node: '>=4'}
dev: true
/get-stream/5.2.0: /get-stream/5.2.0:
resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==}
engines: {node: '>=8'} engines: {node: '>=8'}
@ -2336,6 +2459,20 @@ packages:
resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==}
dev: true dev: true
/happy-dom/7.7.0:
resolution: {integrity: sha512-U10JXl5qSaHswXT5kyE7lvSDoyK48GyPGpe74qI9KT29frt1AlS+jnwy77RUJIknx+4b52DK1NllXTgHH8k20w==}
dependencies:
css.escape: 1.5.1
he: 1.2.0
node-fetch: 2.6.7
sync-request: 6.1.0
webidl-conversions: 7.0.0
whatwg-encoding: 2.0.0
whatwg-mimetype: 3.0.0
transitivePeerDependencies:
- encoding
dev: true
/has-bigints/1.0.2: /has-bigints/1.0.2:
resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
dev: true dev: true
@ -2398,6 +2535,22 @@ packages:
entities: 4.4.0 entities: 4.4.0
dev: true dev: true
/http-basic/8.1.3:
resolution: {integrity: sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==}
engines: {node: '>=6.0.0'}
dependencies:
caseless: 0.12.0
concat-stream: 1.6.2
http-response-object: 3.0.2
parse-cache-control: 1.0.1
dev: true
/http-response-object/3.0.2:
resolution: {integrity: sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==}
dependencies:
'@types/node': 10.17.60
dev: true
/http-signature/1.3.6: /http-signature/1.3.6:
resolution: {integrity: sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==} resolution: {integrity: sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==}
engines: {node: '>=0.10'} engines: {node: '>=0.10'}
@ -2427,6 +2580,13 @@ packages:
hasBin: true hasBin: true
dev: true dev: true
/iconv-lite/0.6.3:
resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
engines: {node: '>=0.10.0'}
dependencies:
safer-buffer: 2.1.2
dev: true
/ieee754/1.2.1: /ieee754/1.2.1:
resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
dev: true dev: true
@ -2679,6 +2839,10 @@ packages:
get-intrinsic: 1.1.3 get-intrinsic: 1.1.3
dev: true dev: true
/isarray/1.0.0:
resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
dev: true
/isarray/2.0.5: /isarray/2.0.5:
resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
dev: true dev: true
@ -2849,6 +3013,11 @@ packages:
wrap-ansi: 7.0.0 wrap-ansi: 7.0.0
dev: true dev: true
/local-pkg/0.4.2:
resolution: {integrity: sha512-mlERgSPrbxU3BP4qBqAvvwlgW4MTg78iwJdGGnv7kibKjWcJksrG3t6LB5lXI93wXRDvG4NpUgJFmTG4T6rdrg==}
engines: {node: '>=14'}
dev: true
/locate-path/5.0.0: /locate-path/5.0.0:
resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
engines: {node: '>=8'} engines: {node: '>=8'}
@ -2893,6 +3062,12 @@ packages:
wrap-ansi: 6.2.0 wrap-ansi: 6.2.0
dev: true dev: true
/loupe/2.3.6:
resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==}
dependencies:
get-func-name: 2.0.0
dev: true
/lru-cache/6.0.0: /lru-cache/6.0.0:
resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
engines: {node: '>=10'} engines: {node: '>=10'}
@ -3253,6 +3428,10 @@ packages:
callsites: 3.1.0 callsites: 3.1.0
dev: true dev: true
/parse-cache-control/1.0.1:
resolution: {integrity: sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==}
dev: true
/parse-json/5.2.0: /parse-json/5.2.0:
resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
engines: {node: '>=8'} engines: {node: '>=8'}
@ -3292,6 +3471,10 @@ packages:
engines: {node: '>=8'} engines: {node: '>=8'}
dev: true dev: true
/pathval/1.1.1:
resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==}
dev: true
/pend/1.2.0: /pend/1.2.0:
resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==}
dev: true dev: true
@ -3382,6 +3565,16 @@ packages:
react-is: 17.0.2 react-is: 17.0.2
dev: true dev: true
/process-nextick-args/2.0.1:
resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
dev: true
/promise/8.3.0:
resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==}
dependencies:
asap: 2.0.6
dev: true
/proxy-from-env/1.0.0: /proxy-from-env/1.0.0:
resolution: {integrity: sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==} resolution: {integrity: sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==}
dev: true dev: true
@ -3434,6 +3627,18 @@ packages:
type-fest: 0.6.0 type-fest: 0.6.0
dev: true dev: true
/readable-stream/2.3.7:
resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==}
dependencies:
core-util-is: 1.0.2
inherits: 2.0.4
isarray: 1.0.0
process-nextick-args: 2.0.1
safe-buffer: 5.1.2
string_decoder: 1.1.1
util-deprecate: 1.0.2
dev: true
/reftools/1.1.9: /reftools/1.1.9:
resolution: {integrity: sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==} resolution: {integrity: sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==}
dev: true dev: true
@ -3535,6 +3740,10 @@ packages:
tslib: 2.4.1 tslib: 2.4.1
dev: true dev: true
/safe-buffer/5.1.2:
resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
dev: true
/safe-buffer/5.2.1: /safe-buffer/5.2.1:
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
dev: true dev: true
@ -3764,6 +3973,12 @@ packages:
es-abstract: 1.20.4 es-abstract: 1.20.4
dev: true dev: true
/string_decoder/1.1.1:
resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
dependencies:
safe-buffer: 5.1.2
dev: true
/strip-ansi/6.0.1: /strip-ansi/6.0.1:
resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
engines: {node: '>=8'} engines: {node: '>=8'}
@ -3805,6 +4020,12 @@ packages:
engines: {node: '>=8'} engines: {node: '>=8'}
dev: true dev: true
/strip-literal/0.4.2:
resolution: {integrity: sha512-pv48ybn4iE1O9RLgCAN0iU4Xv7RlBTiit6DKmMiErbs9x1wH6vXBs45tWc0H5wUIF6TLTrKweqkmYF/iraQKNw==}
dependencies:
acorn: 8.8.1
dev: true
/supports-color/5.5.0: /supports-color/5.5.0:
resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
engines: {node: '>=4'} engines: {node: '>=4'}
@ -3876,10 +4097,42 @@ packages:
- encoding - encoding
dev: true dev: true
/sync-request/6.1.0:
resolution: {integrity: sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==}
engines: {node: '>=8.0.0'}
dependencies:
http-response-object: 3.0.2
sync-rpc: 1.3.6
then-request: 6.0.2
dev: true
/sync-rpc/1.3.6:
resolution: {integrity: sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==}
dependencies:
get-port: 3.2.0
dev: true
/text-table/0.2.0: /text-table/0.2.0:
resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
dev: true dev: true
/then-request/6.0.2:
resolution: {integrity: sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==}
engines: {node: '>=6.0.0'}
dependencies:
'@types/concat-stream': 1.6.1
'@types/form-data': 0.0.33
'@types/node': 8.10.66
'@types/qs': 6.9.7
caseless: 0.12.0
concat-stream: 1.6.2
form-data: 2.3.3
http-basic: 8.1.3
http-response-object: 3.0.2
promise: 8.3.0
qs: 6.5.3
dev: true
/throttleit/1.0.0: /throttleit/1.0.0:
resolution: {integrity: sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==} resolution: {integrity: sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==}
dev: true dev: true
@ -3888,6 +4141,20 @@ packages:
resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
dev: true dev: true
/tinybench/2.3.1:
resolution: {integrity: sha512-hGYWYBMPr7p4g5IarQE7XhlyWveh1EKhy4wUBS1LrHXCKYgvz+4/jCqgmJqZxxldesn05vccrtME2RLLZNW7iA==}
dev: true
/tinypool/0.3.0:
resolution: {integrity: sha512-NX5KeqHOBZU6Bc0xj9Vr5Szbb1j8tUHIeD18s41aDJaPeC5QTdEhK0SpdpUrZlj2nv5cctNcSjaKNanXlfcVEQ==}
engines: {node: '>=14.0.0'}
dev: true
/tinyspy/1.0.2:
resolution: {integrity: sha512-bSGlgwLBYf7PnUsQ6WOc6SJ3pGOcd+d8AA6EUnLDDM0kWEstC1JIlSZA3UNliDXhd9ABoS7hiRBDCu+XP/sf1Q==}
engines: {node: '>=14.0.0'}
dev: true
/tmp/0.2.1: /tmp/0.2.1:
resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==}
engines: {node: '>=8.17.0'} engines: {node: '>=8.17.0'}
@ -3967,6 +4234,11 @@ packages:
prelude-ls: 1.2.1 prelude-ls: 1.2.1
dev: true dev: true
/type-detect/4.0.8:
resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==}
engines: {node: '>=4'}
dev: true
/type-fest/0.20.2: /type-fest/0.20.2:
resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
engines: {node: '>=10'} engines: {node: '>=10'}
@ -3987,6 +4259,10 @@ packages:
engines: {node: '>=8'} engines: {node: '>=8'}
dev: true dev: true
/typedarray/0.0.6:
resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==}
dev: true
/typescript/4.8.4: /typescript/4.8.4:
resolution: {integrity: sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==} resolution: {integrity: sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==}
engines: {node: '>=4.2.0'} engines: {node: '>=4.2.0'}
@ -4081,6 +4357,98 @@ packages:
fsevents: 2.3.2 fsevents: 2.3.2
dev: true dev: true
/vite/3.2.4_@types+node@14.18.34:
resolution: {integrity: sha512-Z2X6SRAffOUYTa+sLy3NQ7nlHFU100xwanq1WDwqaiFiCe+25zdxP1TfCS5ojPV2oDDcXudHIoPnI1Z/66B7Yw==}
engines: {node: ^14.18.0 || >=16.0.0}
hasBin: true
peerDependencies:
'@types/node': '>= 14'
less: '*'
sass: '*'
stylus: '*'
sugarss: '*'
terser: ^5.4.0
peerDependenciesMeta:
'@types/node':
optional: true
less:
optional: true
sass:
optional: true
stylus:
optional: true
sugarss:
optional: true
terser:
optional: true
dependencies:
'@types/node': 14.18.34
esbuild: 0.15.16
postcss: 8.4.19
resolve: 1.22.1
rollup: 2.79.1
optionalDependencies:
fsevents: 2.3.2
dev: true
/vitest-fetch-mock/0.2.1_vitest@0.25.3:
resolution: {integrity: sha512-u6wjTy3huKLx9VDzChOpt3BS9jIhCTbruqLIlkhXZ8dRMzNAsmiTIskI39+uqNegkFMQeEefBqKYZ3UC142AJA==}
engines: {node: '>=14.14.0'}
peerDependencies:
vitest: '>=0.16.0'
dependencies:
cross-fetch: 3.1.5
vitest: 0.25.3_happy-dom@7.7.0
transitivePeerDependencies:
- encoding
dev: true
/vitest/0.25.3_happy-dom@7.7.0:
resolution: {integrity: sha512-/UzHfXIKsELZhL7OaM2xFlRF8HRZgAHtPctacvNK8H4vOcbJJAMEgbWNGSAK7Y9b1NBe5SeM7VTuz2RsTHFJJA==}
engines: {node: '>=v14.16.0'}
hasBin: true
peerDependencies:
'@edge-runtime/vm': '*'
'@vitest/browser': '*'
'@vitest/ui': '*'
happy-dom: '*'
jsdom: '*'
peerDependenciesMeta:
'@edge-runtime/vm':
optional: true
'@vitest/browser':
optional: true
'@vitest/ui':
optional: true
happy-dom:
optional: true
jsdom:
optional: true
dependencies:
'@types/chai': 4.3.4
'@types/chai-subset': 1.3.3
'@types/node': 14.18.34
acorn: 8.8.1
acorn-walk: 8.2.0
chai: 4.3.7
debug: 4.3.4
happy-dom: 7.7.0
local-pkg: 0.4.2
source-map: 0.6.1
strip-literal: 0.4.2
tinybench: 2.3.1
tinypool: 0.3.0
tinyspy: 1.0.2
vite: 3.2.4_@types+node@14.18.34
transitivePeerDependencies:
- less
- sass
- stylus
- sugarss
- supports-color
- terser
dev: true
/vue-demi/0.13.11_vue@3.2.45: /vue-demi/0.13.11_vue@3.2.45:
resolution: {integrity: sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==} resolution: {integrity: sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==}
engines: {node: '>=12'} engines: {node: '>=12'}
@ -4158,6 +4526,23 @@ packages:
resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
dev: true dev: true
/webidl-conversions/7.0.0:
resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
engines: {node: '>=12'}
dev: true
/whatwg-encoding/2.0.0:
resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==}
engines: {node: '>=12'}
dependencies:
iconv-lite: 0.6.3
dev: true
/whatwg-mimetype/3.0.0:
resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==}
engines: {node: '>=12'}
dev: true
/whatwg-url/5.0.0: /whatwg-url/5.0.0:
resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
dependencies: dependencies:

View File

@ -1,9 +1,16 @@
import { render } from '@testing-library/vue'
import AppFooter from 'src/components/AppFooter.vue' import AppFooter from 'src/components/AppFooter.vue'
describe('# AppFooter', () => { describe('# AppFooter', () => {
it('should render correctly', () => { it('should render correctly', () => {
cy.mount(AppFooter) const { html } = render(AppFooter, {
global: {
stubs: {
AppLink: true,
},
},
})
cy.contains('Real world app') expect(html()).toContain('Real world app')
}) })
}) })

View File

@ -1,16 +1,18 @@
import { render } from '@testing-library/vue'
import { describe, it, expect } from 'vitest'
import AppLink from './AppLink.vue' import AppLink from './AppLink.vue'
describe('# AppLink', () => { describe('# AppLink', () => {
it('should redirect to another page when click the link', () => { it('should redirect to another page when click the link', () => {
// given // given
cy.mount(AppLink, { const { container } = render(AppLink, {
props: { name: 'tag', params: { tag: 'foo' } }, props: { name: 'tag', params: { tag: 'foo' } },
slots: { default: () => 'Go to Foo tag' }, slots: { default: () => 'Go to Foo tag' },
}) })
cy.contains('Go to Foo tag') expect(container).toContain('Go to Foo tag')
cy.contains('tag').click() // cy.contains('tag').click()
// await waitFor(() => expect(linkElement).toHaveClass('router-link-active')) // await waitFor(() => expect(linkElement).toHaveClass('router-link-active'))
}) })

View File

@ -1,27 +1,36 @@
import { createPinia, setActivePinia } from 'pinia' import { createTestingPinia } from '@pinia/testing'
import { render, waitFor } from '@testing-library/vue'
import { flushPromises } from '@vue/test-utils'
import fixtures from 'src/utils/test/fixtures' import fixtures from 'src/utils/test/fixtures'
import { asyncWrapper, createTestRouter } from 'src/utils/test/test.utils' import { asyncWrapper, createTestRouter, mockFetch } from 'src/utils/test/test.utils'
import { nextTick } from 'vue'
import articleFixture from '../../cypress/fixtures/article.json'
import ArticleDetail from './ArticleDetail.vue' import ArticleDetail from './ArticleDetail.vue'
describe('# ArticleDetail', () => { describe('# ArticleDetail', () => {
const router = createTestRouter() const { router, routerPlugin } = createTestRouter()
const AsyncArticleDetail = asyncWrapper(ArticleDetail) const AsyncArticleDetail = asyncWrapper(ArticleDetail)
beforeEach(() => { beforeEach(async () => {
setActivePinia(createPinia()) await router.push({ name: 'article', params: { slug: fixtures.article.slug } })
cy.wrap(router.push({ name: 'article', params: { slug: fixtures.article.slug } }))
}) })
it('should render markdown body correctly', () => { it('should render markdown body correctly', async () => {
cy.fixture('article.json').then((res) => { mockFetch.mockResponse(JSON.stringify(articleFixture), { status: 200 })
res.article.body = fixtures.markdown const { html, container } = render(AsyncArticleDetail, {
cy.intercept('/api/articles/*', res).as('getArticle') global: {
plugins: [routerPlugin, createTestingPinia()],
stubs: { AppLink: true },
},
}) })
await waitFor(() => expect(mockFetch).toBeCalled())
expect(mockFetch.mock.calls[0][0]).toContain('article-foo')
cy.mount(AsyncArticleDetail, { router }) await flushPromises()
cy.wait('@getArticle') await nextTick()
cy.get('.article-content').should('contain.text', 'h1 Heading 8-)') expect(html()).toContain('Article body')
expect(container.querySelector('h1')).toContain('Strong')
}) })
// TODO: the markdown content should do the unit test for the markdown renderer // TODO: the markdown content should do the unit test for the markdown renderer

View File

@ -54,7 +54,9 @@ import ArticleDetailMeta from './ArticleDetailMeta.vue'
const route = useRoute() const route = useRoute()
const slug = route.params.slug as string const slug = route.params.slug as string
const article: Article = reactive(await api.articles.getArticle(slug).then(res => res.data.article)) const article: Article = reactive(await api.articles.getArticle(slug).then(res => {
return res.data.article
}))
const articleHandledBody = computed(() => marked(article.body)) const articleHandledBody = computed(() => marked(article.body))

View File

@ -1,4 +1,4 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP // Vitest Snapshot v1
exports[`# ArticleDetail should render markdown (zh-CN) body correctly 1`] = ` exports[`# ArticleDetail should render markdown (zh-CN) body correctly 1`] = `
"<div class=\\"row article-content\\"><!-- eslint-disable vue/no-v-html --><div class=\\"col-md-12\\"><h1 id=\\"markdown-示例\\">Markdown 示例</h1> "<div class=\\"row article-content\\"><!-- eslint-disable vue/no-v-html --><div class=\\"col-md-12\\"><h1 id=\\"markdown-示例\\">Markdown 示例</h1>

View File

@ -1,6 +1,12 @@
import AppLink from 'src/components/AppLink.vue' import AppLink from 'src/components/AppLink.vue'
import type { App } from 'vue' import type { App, Component } from 'vue'
export const globalComponents: Record<string, Component> = {
AppLink,
}
export default function registerGlobalComponents (app: App): void { export default function registerGlobalComponents (app: App): void {
app.component('AppLink', AppLink) for (const name in globalComponents) {
app.component(name, globalComponents[name])
}
} }

View File

@ -11,6 +11,7 @@ export const api = new Api({
headers: { headers: {
'content-type': ContentType.Json, 'content-type': ContentType.Json,
}, },
format: 'json',
}, },
}) })

9
src/setupTest.ts Normal file
View File

@ -0,0 +1,9 @@
import { mockFetch } from 'src/utils/test/test.utils'
beforeAll(() => {
mockFetch.enableMocks()
globalThis.fetch = mockFetch as typeof fetch
})
afterEach(() => {
mockFetch.resetMocks()
})

View File

@ -1,19 +1,28 @@
import { routes } from 'src/router' import { routes } from 'src/router'
import type { DefineComponent } from 'vue' import { vi } from 'vitest'
import type { App, DefineComponent } from 'vue'
import { defineComponent, h, Suspense } from 'vue' import { defineComponent, h, Suspense } from 'vue'
import type { Router } from 'vue-router'
import { createMemoryHistory, createRouter } from 'vue-router' import { createMemoryHistory, createRouter } from 'vue-router'
import createMocker from 'vitest-fetch-mock'
export const createTestRouter = (): Router => createRouter({ export const mockFetch = createMocker(vi)
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
export const createTestRouter = () => {
const router = createRouter({
routes, routes,
history: createMemoryHistory(), history: createMemoryHistory(),
}) })
const routerPlugin = { install: (app: App) => app.use(router) }
return { router, routerPlugin }
}
type AsyncWrapper = (...args: Parameters<typeof h>) => DefineComponent type AsyncWrapper = (...args: Parameters<typeof h>) => DefineComponent
export const asyncWrapper: AsyncWrapper = (...args) => defineComponent({ export const asyncWrapper: AsyncWrapper = (...args) => defineComponent({
render () { render () {
return h(Suspense, null, { return h(Suspense, null, {
default: h(...args), default: h(...args),
fallback: h('span', null, 'Suspense render failed'),
}) })
}, },
}) })

View File

@ -1,10 +1,11 @@
{ {
"extends": "@vue/tsconfig/tsconfig.web.json", "extends": "@vue/tsconfig/tsconfig.web.json",
"include": ["env.d.ts", "src/**/*", "src/**/*.vue"], "include": ["src/**/*", "src/**/*.vue"],
"exclude": ["src/**/*.spec.ts", "src/***/*.spec.tsx"], "exclude": ["src/**/*.spec.ts", "src/***/*.spec.tsx"],
"compilerOptions": { "compilerOptions": {
"baseUrl": ".", "baseUrl": ".",
"lib": ["ESNext", "DOM", "DOM.Iterable"] "lib": ["ESNext", "DOM", "DOM.Iterable"],
"types": ["vitest/globals", "vitest-fetch-mock"],
}, },
"references": [ "references": [
{ {

View File

@ -1,17 +0,0 @@
{
"extends": "./tsconfig.app.json",
"include": [
"env.d.ts",
"src/**/*",
"src/**/*.vue",
"cypress/support/component.*",
"cypress/support/commands.ts",
"cypress/fixtures/**/*"
],
"exclude": [],
"compilerOptions": {
"composite": true,
"types": ["cypress", "@testing-library/cypress"],
"noEmit": true
}
}

View File

@ -7,8 +7,5 @@
{ {
"path": "./tsconfig.app.json" "path": "./tsconfig.app.json"
}, },
{
"path": "./tsconfig.cypress-ct.json"
}
] ]
} }

View File

@ -1,4 +1,5 @@
import { fileURLToPath, URL } from 'url' /// <reference types="vitest" />
import { fileURLToPath, URL } from 'node:url'
import vue from '@vitejs/plugin-vue' import vue from '@vitejs/plugin-vue'
import { defineConfig } from 'vite' import { defineConfig } from 'vite'
import analyzer from 'rollup-plugin-analyzer' import analyzer from 'rollup-plugin-analyzer'
@ -7,11 +8,16 @@ import analyzer from 'rollup-plugin-analyzer'
export default defineConfig({ export default defineConfig({
resolve: { resolve: {
alias: { alias: {
src: fileURLToPath(new URL('./src', import.meta.url)), src: fileURLToPath(new URL('src', import.meta.url)),
}, },
}, },
plugins: [ plugins: [
vue(), vue(),
analyzer({ summaryOnly: true }), analyzer({ summaryOnly: true }),
], ],
test: {
globals: true,
environment: 'happy-dom',
setupFiles: ['src/setupTest.ts'],
},
}) })