chore(build): adopt Vite, pnpm, ESLint flat config; drop Vue CLI
Replaces Vue CLI 4 with Vite 7 + @tailwindcss/vite + vite-plugin-pwa, yarn with pnpm, tslint with ESLint 9 flat config, and Jest with Vitest. Drops Netlify deploy config and the dead FontAwesome npm token. Bumps the entire dependency surface: Vue 3.5, Pinia 2, vue-router 4, vue-i18n 11, Tailwind 4, DaisyUI 5, TypeScript 5.7, axios 1.x, mapbox-gl 3.x, date-fns 4.x, uuid 11.x, pouchdb-browser 9.x.
This commit is contained in:
@@ -1,3 +0,0 @@
|
|||||||
> 1%
|
|
||||||
last 2 versions
|
|
||||||
not ie <= 8
|
|
||||||
4
.gitignore
vendored
4
.gitignore
vendored
@@ -2,7 +2,9 @@
|
|||||||
node_modules
|
node_modules
|
||||||
node_modules_bak
|
node_modules_bak
|
||||||
/dist
|
/dist
|
||||||
/cypress/videos
|
/dev/dist
|
||||||
|
src-legacy
|
||||||
|
.eslintcache
|
||||||
|
|
||||||
# local env files
|
# local env files
|
||||||
.env.local
|
.env.local
|
||||||
|
|||||||
1
.node-version
Normal file
1
.node-version
Normal file
@@ -0,0 +1 @@
|
|||||||
|
24
|
||||||
2
.npmrc
2
.npmrc
@@ -1,2 +0,0 @@
|
|||||||
@fortawesome:registry=https://npm.fontawesome.com/
|
|
||||||
//npm.fontawesome.com/:_authToken=2C545253-5017-402B-A924-6E3689616391
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
plugins: {
|
|
||||||
autoprefixer: {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
presets: [
|
|
||||||
'@vue/cli-plugin-babel/preset'
|
|
||||||
]
|
|
||||||
}
|
|
||||||
29
eslint.config.js
Normal file
29
eslint.config.js
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
import pluginVue from 'eslint-plugin-vue'
|
||||||
|
import vueTsConfig from '@vue/eslint-config-typescript'
|
||||||
|
|
||||||
|
export default [
|
||||||
|
{
|
||||||
|
ignores: [
|
||||||
|
'dist/**',
|
||||||
|
'node_modules/**',
|
||||||
|
'src-legacy/**',
|
||||||
|
'dev/**',
|
||||||
|
'src/utils/smtp.js'
|
||||||
|
]
|
||||||
|
},
|
||||||
|
...pluginVue.configs['flat/recommended'],
|
||||||
|
...vueTsConfig(),
|
||||||
|
{
|
||||||
|
rules: {
|
||||||
|
'vue/multi-word-component-names': 'off',
|
||||||
|
'vue/max-attributes-per-line': 'off',
|
||||||
|
'vue/singleline-html-element-content-newline': 'off',
|
||||||
|
'vue/html-self-closing': 'off',
|
||||||
|
'vue/attributes-order': 'off',
|
||||||
|
'vue/first-attribute-linebreak': 'off',
|
||||||
|
'vue/no-mutating-props': 'warn',
|
||||||
|
'@typescript-eslint/no-explicit-any': 'warn',
|
||||||
|
'@typescript-eslint/no-unused-vars': ['warn', { argsIgnorePattern: '^_' }]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
36
index.html
Normal file
36
index.html
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="fr">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<link rel="icon" href="/favicon.ico" />
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||||
|
<meta
|
||||||
|
name="viewport"
|
||||||
|
content="width=device-width,initial-scale=1.0, maximum-scale=5.0"
|
||||||
|
/>
|
||||||
|
<meta
|
||||||
|
name="description"
|
||||||
|
content="application pour réaliser des balances équitables de vos budgets entre amis lors de vos colocations, vacances, séjours, voyages, etc"
|
||||||
|
/>
|
||||||
|
<meta
|
||||||
|
name="keywords"
|
||||||
|
content="budget en vacances, budget aventure, collocation, budgets entre amis, budgets partagés"
|
||||||
|
/>
|
||||||
|
<meta
|
||||||
|
name="twitter:card"
|
||||||
|
content="Vaquant | application pour réaliser des balances équitables de vos budgets entre amis"
|
||||||
|
/>
|
||||||
|
<link rel="canonical" href="https://vaquant.space" />
|
||||||
|
<title>Vaquant</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<noscript>
|
||||||
|
<strong
|
||||||
|
>We're sorry but Vaquant doesn't work properly without JavaScript
|
||||||
|
enabled. Please enable it to continue.</strong
|
||||||
|
>
|
||||||
|
</noscript>
|
||||||
|
<div id="app"></div>
|
||||||
|
<script type="module" src="/src/main.ts"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
moduleFileExtensions: [
|
|
||||||
'js',
|
|
||||||
'jsx',
|
|
||||||
'json',
|
|
||||||
'vue',
|
|
||||||
'ts',
|
|
||||||
'tsx'
|
|
||||||
],
|
|
||||||
transform: {
|
|
||||||
'^.+\\.vue$': 'vue-jest',
|
|
||||||
'.+\\.(css|styl|less|sass|scss|png|jpg|ttf|woff|woff2)$': 'jest-transform-stub',
|
|
||||||
'^.+\\.tsx?$': 'ts-jest'
|
|
||||||
},
|
|
||||||
moduleNameMapper: {
|
|
||||||
'^@/(.*)$': '<rootDir>/src/$1'
|
|
||||||
},
|
|
||||||
snapshotSerializers: [
|
|
||||||
'jest-serializer-vue'
|
|
||||||
],
|
|
||||||
testMatch: [
|
|
||||||
'**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)'
|
|
||||||
],
|
|
||||||
testURL: 'http://localhost/'
|
|
||||||
}
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
[[redirects]]
|
|
||||||
from = "/*"
|
|
||||||
to = "/"
|
|
||||||
status = 200
|
|
||||||
108
package.json
108
package.json
@@ -1,67 +1,69 @@
|
|||||||
{
|
{
|
||||||
"name": "vaquant",
|
"name": "vaquant",
|
||||||
"version": "0.8.0",
|
"version": "0.9.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
|
"type": "module",
|
||||||
|
"packageManager": "pnpm@11.5.0",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=22"
|
||||||
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"serve": "vue-cli-service serve",
|
"dev": "vite",
|
||||||
"build": "vue-cli-service build",
|
"build": "vue-tsc --noEmit && vite build",
|
||||||
"test:unit": "vue-cli-service test:unit",
|
"preview": "vite preview",
|
||||||
"lint": "vue-cli-service lint",
|
"lint": "eslint . --cache",
|
||||||
"build-couch-design": "ts-node src/scripts/validate-doc-update.ts"
|
"typecheck": "vue-tsc --noEmit",
|
||||||
|
"test": "vitest",
|
||||||
|
"test:run": "vitest run",
|
||||||
|
"build-couch-design": "tsx src/scripts/validate-doc-update.ts"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@tabler/icons-webfont": "^3.30.0",
|
"@tabler/icons-webfont": "^3.30.0",
|
||||||
"@xkeshi/vue-qrcode": "^1.0.0",
|
"@vueuse/core": "^12.0.0",
|
||||||
"axios": "^0.19.2",
|
"axios": "^1.7.7",
|
||||||
"bulma": "^0.8.1",
|
"date-fns": "^4.1.0",
|
||||||
"bulma-checkradio": "^1.1.1",
|
"events": "^3.3.0",
|
||||||
"bulma-pricingtable": "^0.2.0",
|
|
||||||
"bulma-switch": "^2.0.0",
|
|
||||||
"core-js": "^3.6.5",
|
|
||||||
"date-fns": "^2.16.0",
|
|
||||||
"font-color-contrast": "^1.0.3",
|
"font-color-contrast": "^1.0.3",
|
||||||
"lightness": "^1.0.0",
|
"lightness": "^1.0.0",
|
||||||
"lodash-es": "^4.17.15",
|
"lodash-es": "^4.17.21",
|
||||||
"mapbox-gl": "^1.9.1",
|
"mapbox-gl": "^3.7.0",
|
||||||
"md5": "^2.2.1",
|
"md5": "^2.3.0",
|
||||||
"notyf": "^3.6.0",
|
"mitt": "^3.0.1",
|
||||||
|
"notyf": "^3.10.0",
|
||||||
|
"pinia": "^2.2.6",
|
||||||
|
"pinia-plugin-persistedstate": "^4.1.3",
|
||||||
"pouchdb-authentication": "^1.1.3",
|
"pouchdb-authentication": "^1.1.3",
|
||||||
"pouchdb-browser": "^7.2.1",
|
"pouchdb-browser": "^9.0.0",
|
||||||
"register-service-worker": "^1.7.1",
|
"qrcode.vue": "^3.5.1",
|
||||||
"uuid": "^7.0.3",
|
"uuid": "^11.0.3",
|
||||||
"vue": "^2.6.11",
|
"vue": "^3.5.13",
|
||||||
"vue-class-component": "^7.2.3",
|
"vue-currency-input": "^3.2.0",
|
||||||
"vue-click-outside": "^1.0.7",
|
"vue-i18n": "^11.0.0",
|
||||||
"vue-currency-input": "^1.18.0",
|
"vue-router": "^4.5.0"
|
||||||
"vue-i18n": "^8.16.0",
|
|
||||||
"vue-property-decorator": "^8.4.1",
|
|
||||||
"vue-router": "^3.1.6",
|
|
||||||
"vue-stripe-checkout": "^3.2.2",
|
|
||||||
"vuex": "^3.1.3",
|
|
||||||
"vuex-class": "^0.3.2",
|
|
||||||
"vuex-persist": "^2.2.0"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/chartist": "^0.9.48",
|
"@tailwindcss/vite": "^4.0.0",
|
||||||
"@types/jest": "^25.2.1",
|
"@types/lodash-es": "^4.17.12",
|
||||||
"@types/lodash-es": "^4.17.3",
|
"@types/mapbox-gl": "^3.4.0",
|
||||||
"@types/mapbox-gl": "^1.8.3",
|
"@types/md5": "^2.3.5",
|
||||||
"@types/md5": "^2.1.33",
|
"@types/pouchdb": "^6.4.2",
|
||||||
"@types/notyf": "^3.0.0",
|
"@vitejs/plugin-vue": "^5.2.1",
|
||||||
"@types/pouchdb": "^6.4.0",
|
"@vue/eslint-config-typescript": "^14.1.4",
|
||||||
"@types/uuid": "^7.0.2",
|
"@vue/test-utils": "^2.4.6",
|
||||||
"@vue/cli-plugin-babel": "^4.3.1",
|
"@vue/tsconfig": "^0.7.0",
|
||||||
"@vue/cli-plugin-pwa": "^4.3.1",
|
"daisyui": "^5.0.0",
|
||||||
"@vue/cli-plugin-typescript": "^4.3.1",
|
"eslint": "^9.16.0",
|
||||||
"@vue/cli-plugin-unit-jest": "^4.3.1",
|
"eslint-plugin-vue": "^9.32.0",
|
||||||
"@vue/cli-service": "^4.3.1",
|
"happy-dom": "^15.11.7",
|
||||||
"@vue/test-utils": "^1.0.0-beta.33",
|
"prettier": "^3.4.2",
|
||||||
"babel-core": "7.0.0-bridge.0",
|
"sass": "^1.83.0",
|
||||||
"sass": "^1.77.0",
|
"tailwindcss": "^4.0.0",
|
||||||
"sass-loader": "^10.5.2",
|
"tsx": "^4.19.2",
|
||||||
"ts-jest": "^25.3.1",
|
"typescript": "^5.7.2",
|
||||||
"ts-node": "^8.8.2",
|
"vite": "^7.0.0",
|
||||||
"typescript": "^3.8.3",
|
"vite-plugin-pwa": "^0.21.1",
|
||||||
"vue-template-compiler": "^2.6.11"
|
"vitest": "^2.1.8",
|
||||||
|
"vue-tsc": "^2.1.10",
|
||||||
|
"workbox-window": "^7.3.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
9615
pnpm-lock.yaml
generated
Normal file
9615
pnpm-lock.yaml
generated
Normal file
File diff suppressed because it is too large
Load Diff
5
pnpm-workspace.yaml
Normal file
5
pnpm-workspace.yaml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
allowBuilds:
|
||||||
|
'@parcel/watcher': true
|
||||||
|
esbuild: true
|
||||||
|
ttf2woff2: true
|
||||||
|
vue-demi: true
|
||||||
@@ -1,40 +1,23 @@
|
|||||||
{
|
{
|
||||||
|
"extends": "@vue/tsconfig/tsconfig.dom.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"target": "esnext",
|
|
||||||
"module": "esnext",
|
|
||||||
"strict": true,
|
|
||||||
"jsx": "preserve",
|
|
||||||
"importHelpers": true,
|
|
||||||
"moduleResolution": "node",
|
|
||||||
"experimentalDecorators": true,
|
|
||||||
"esModuleInterop": true,
|
|
||||||
"allowSyntheticDefaultImports": true,
|
|
||||||
"sourceMap": true,
|
|
||||||
"baseUrl": ".",
|
"baseUrl": ".",
|
||||||
"types": [
|
|
||||||
"node",
|
|
||||||
"jest"
|
|
||||||
],
|
|
||||||
"paths": {
|
"paths": {
|
||||||
"@/*": [
|
"@/*": ["src/*"]
|
||||||
"src/*"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"lib": [
|
"verbatimModuleSyntax": false,
|
||||||
"esnext",
|
"useUnknownInCatchVariables": false,
|
||||||
"dom",
|
"noImplicitAny": false,
|
||||||
"dom.iterable",
|
"noUncheckedIndexedAccess": false
|
||||||
"scripthost"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"include": [
|
"include": [
|
||||||
"src/**/*.ts",
|
"src/**/*.ts",
|
||||||
"src/**/*.tsx",
|
"src/**/*.tsx",
|
||||||
"src/**/*.vue",
|
"src/**/*.vue",
|
||||||
"tests/**/*.ts",
|
"tests/**/*.ts",
|
||||||
"tests/**/*.tsx"
|
"tests/**/*.tsx",
|
||||||
|
"vite.config.ts",
|
||||||
|
"vitest.config.ts"
|
||||||
],
|
],
|
||||||
"exclude": [
|
"exclude": ["node_modules", "dist", "src-legacy"]
|
||||||
"node_modules"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|||||||
21
tslint.json
21
tslint.json
@@ -1,21 +0,0 @@
|
|||||||
{
|
|
||||||
"defaultSeverity": "warning",
|
|
||||||
"extends": [
|
|
||||||
"tslint:recommended"
|
|
||||||
],
|
|
||||||
"linterOptions": {
|
|
||||||
"exclude": [
|
|
||||||
"node_modules/**"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"rules": {
|
|
||||||
"semicolon": [true, "never"],
|
|
||||||
"trailing-comma": [true, "never"],
|
|
||||||
"quotemark": [true, "single"],
|
|
||||||
"indent": [true, "spaces", 2],
|
|
||||||
"interface-name": false,
|
|
||||||
"ordered-imports": false,
|
|
||||||
"object-literal-sort-keys": false,
|
|
||||||
"no-consecutive-blank-lines": false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
58
vite.config.ts
Normal file
58
vite.config.ts
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
import { defineConfig } from 'vite'
|
||||||
|
import { fileURLToPath, URL } from 'node:url'
|
||||||
|
import vue from '@vitejs/plugin-vue'
|
||||||
|
import tailwindcss from '@tailwindcss/vite'
|
||||||
|
import { VitePWA } from 'vite-plugin-pwa'
|
||||||
|
|
||||||
|
const themeColor = '#3f4fa6'
|
||||||
|
|
||||||
|
export default defineConfig({
|
||||||
|
plugins: [
|
||||||
|
vue(),
|
||||||
|
tailwindcss(),
|
||||||
|
VitePWA({
|
||||||
|
registerType: 'prompt',
|
||||||
|
workbox: {
|
||||||
|
skipWaiting: true,
|
||||||
|
clientsClaim: true
|
||||||
|
},
|
||||||
|
includeAssets: ['favicon.ico', 'robots.txt', 'img/icons/*.png'],
|
||||||
|
manifest: {
|
||||||
|
name: 'Vaquant',
|
||||||
|
short_name: 'Vaquant',
|
||||||
|
background_color: themeColor,
|
||||||
|
theme_color: themeColor,
|
||||||
|
display: 'standalone',
|
||||||
|
icons: [
|
||||||
|
{ src: '/img/icons/android-chrome-192x192.png', sizes: '192x192', type: 'image/png' },
|
||||||
|
{ src: '/img/icons/android-chrome-512x512.png', sizes: '512x512', type: 'image/png' },
|
||||||
|
{ src: '/img/icons/apple-touch-icon-60x60.png', sizes: '60x60', type: 'image/png' },
|
||||||
|
{ src: '/img/icons/apple-touch-icon-76x76.png', sizes: '76x76', type: 'image/png' },
|
||||||
|
{ src: '/img/icons/apple-touch-icon-120x120.png', sizes: '120x120', type: 'image/png' },
|
||||||
|
{ src: '/img/icons/apple-touch-icon-152x152.png', sizes: '152x152', type: 'image/png' },
|
||||||
|
{ src: '/img/icons/apple-touch-icon-180x180.png', sizes: '180x180', type: 'image/png' },
|
||||||
|
{ src: '/img/icons/apple-touch-icon.png', sizes: '180x180', type: 'image/png' },
|
||||||
|
{ src: '/img/icons/favicon-16x16.png', sizes: '16x16', type: 'image/png' },
|
||||||
|
{ src: '/img/icons/favicon-32x32.png', sizes: '32x32', type: 'image/png' },
|
||||||
|
{ src: '/img/icons/msapplication-icon-144x144.png', sizes: '144x144', type: 'image/png' },
|
||||||
|
{ src: '/img/icons/mstile-150x150.png', sizes: '150x150', type: 'image/png' }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
],
|
||||||
|
resolve: {
|
||||||
|
alias: {
|
||||||
|
'@': fileURLToPath(new URL('./src', import.meta.url)),
|
||||||
|
events: 'events'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
optimizeDeps: {
|
||||||
|
include: ['events']
|
||||||
|
},
|
||||||
|
define: {
|
||||||
|
global: 'globalThis'
|
||||||
|
},
|
||||||
|
server: {
|
||||||
|
port: 8080
|
||||||
|
}
|
||||||
|
})
|
||||||
12
vitest.config.ts
Normal file
12
vitest.config.ts
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
import { mergeConfig, defineConfig } from 'vitest/config'
|
||||||
|
import viteConfig from './vite.config'
|
||||||
|
|
||||||
|
export default mergeConfig(
|
||||||
|
viteConfig,
|
||||||
|
defineConfig({
|
||||||
|
test: {
|
||||||
|
environment: 'happy-dom',
|
||||||
|
include: ['tests/**/*.spec.ts', 'src/**/*.spec.ts']
|
||||||
|
}
|
||||||
|
})
|
||||||
|
)
|
||||||
@@ -1,78 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
pwa: {
|
|
||||||
themeColor: '#3f4fa6',
|
|
||||||
msTileColor: '#3f4fa6',
|
|
||||||
workboxOptions: {
|
|
||||||
skipWaiting: true,
|
|
||||||
clientsClaim: true
|
|
||||||
},
|
|
||||||
name: 'Vaquant',
|
|
||||||
manifestOptions: {
|
|
||||||
background_color: '#3f4fa6',
|
|
||||||
theme_color: '#3f4fa6',
|
|
||||||
display: 'standalone',
|
|
||||||
icons: [
|
|
||||||
{
|
|
||||||
src: './img/icons/android-chrome-192x192.png',
|
|
||||||
sizes: '192x192',
|
|
||||||
type: 'image/png'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
src: './img/icons/android-chrome-512x512.png',
|
|
||||||
sizes: '512x512',
|
|
||||||
type: 'image/png'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
src: './img/icons/apple-touch-icon-60x60.png',
|
|
||||||
sizes: '60x60',
|
|
||||||
type: 'image/png'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
src: './img/icons/apple-touch-icon-76x76.png',
|
|
||||||
sizes: '76x76',
|
|
||||||
type: 'image/png'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
src: './img/icons/apple-touch-icon-120x120.png',
|
|
||||||
sizes: '120x120',
|
|
||||||
type: 'image/png'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
src: './img/icons/apple-touch-icon-152x152.png',
|
|
||||||
sizes: '152x152',
|
|
||||||
type: 'image/png'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
src: './img/icons/apple-touch-icon-180x180.png',
|
|
||||||
sizes: '180x180',
|
|
||||||
type: 'image/png'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
src: './img/icons/apple-touch-icon.png',
|
|
||||||
sizes: '180x180',
|
|
||||||
type: 'image/png'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
src: './img/icons/favicon-16x16.png',
|
|
||||||
sizes: '16x16',
|
|
||||||
type: 'image/png'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
src: './img/icons/favicon-32x32.png',
|
|
||||||
sizes: '32x32',
|
|
||||||
type: 'image/png'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
src: './img/icons/msapplication-icon-144x144.png',
|
|
||||||
sizes: '144x144',
|
|
||||||
type: 'image/png'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
src: './img/icons/mstile-150x150.png',
|
|
||||||
sizes: '150x150',
|
|
||||||
type: 'image/png'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user