Merge branch 'main' into dev-add-wifi-qr-code-generator

This commit is contained in:
Corentin THOMASSET 2023-09-03 21:51:27 +02:00 committed by GitHub
commit e8c55065ad
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 151 additions and 153 deletions

View file

@ -31,6 +31,4 @@ jobs:
run: pnpm typecheck run: pnpm typecheck
- name: Build the app - name: Build the app
env:
NODE_OPTIONS: --max-old-space-size=4096
run: pnpm build run: pnpm build

View file

@ -1,13 +1,13 @@
name: E2E tests name: E2E tests
on: [deployment_status] on:
pull_request:
push:
branches:
- main
jobs: jobs:
test: test:
if: github.event.deployment_status.state == 'success'
timeout-minutes: 60 timeout-minutes: 60
runs-on: ubuntu-latest runs-on: ubuntu-latest
env:
BASE_URL: ${{ github.event.deployment_status.target_url }}
strategy: strategy:
matrix: matrix:
shard: [1/3, 2/3, 3/3] shard: [1/3, 2/3, 3/3]
@ -28,6 +28,9 @@ jobs:
- name: Install dependencies - name: Install dependencies
run: pnpm install run: pnpm install
- name: Build app
run: pnpm build
- name: Restore Playwright browsers from cache - name: Restore Playwright browsers from cache
uses: actions/cache@v3 uses: actions/cache@v3
with: with:

1
components.d.ts vendored
View file

@ -33,6 +33,7 @@ declare module '@vue/runtime-core' {
CInputText: typeof import('./src/ui/c-input-text/c-input-text.vue')['default'] CInputText: typeof import('./src/ui/c-input-text/c-input-text.vue')['default']
'CInputText.demo': typeof import('./src/ui/c-input-text/c-input-text.demo.vue')['default'] 'CInputText.demo': typeof import('./src/ui/c-input-text/c-input-text.demo.vue')['default']
CKeyValueList: typeof import('./src/ui/c-key-value-list/c-key-value-list.vue')['default'] CKeyValueList: typeof import('./src/ui/c-key-value-list/c-key-value-list.vue')['default']
CKeyValueListItem: typeof import('./src/ui/c-key-value-list/c-key-value-list-item.vue')['default']
CLabel: typeof import('./src/ui/c-label/c-label.vue')['default'] CLabel: typeof import('./src/ui/c-label/c-label.vue')['default']
CLink: typeof import('./src/ui/c-link/c-link.vue')['default'] CLink: typeof import('./src/ui/c-link/c-link.vue')['default']
'CLink.demo': typeof import('./src/ui/c-link/c-link.demo.vue')['default'] 'CLink.demo': typeof import('./src/ui/c-link/c-link.demo.vue')['default']

View file

@ -21,11 +21,12 @@
}, },
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",
"build": "vue-tsc --noEmit && vite build", "build": "vue-tsc --noEmit && NODE_OPTIONS=--max_old_space_size=4096 vite build",
"preview": "vite preview --port 5050", "preview": "vite preview --port 5050",
"test": "npm run test:unit", "test": "npm run test:unit",
"test:unit": "vitest --environment jsdom", "test:unit": "vitest --environment jsdom",
"test:e2e": "playwright test", "test:e2e": "playwright test",
"test:e2e:dev": "BASE_URL=http://localhost:5173 NO_WEB_SERVER=true playwright test",
"coverage": "vitest run --coverage", "coverage": "vitest run --coverage",
"typecheck": "vue-tsc --noEmit -p tsconfig.vitest.json --composite false", "typecheck": "vue-tsc --noEmit -p tsconfig.vitest.json --composite false",
"lint": "eslint src --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --ignore-path .gitignore", "lint": "eslint src --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --ignore-path .gitignore",
@ -74,7 +75,7 @@
"plausible-tracker": "^0.3.8", "plausible-tracker": "^0.3.8",
"qrcode": "^1.5.1", "qrcode": "^1.5.1",
"randombytes": "^2.1.0", "randombytes": "^2.1.0",
"sql-formatter": "^12.0.0", "sql-formatter": "^13.0.0",
"ua-parser-js": "^1.0.35", "ua-parser-js": "^1.0.35",
"unicode-emoji-json": "^0.4.0", "unicode-emoji-json": "^0.4.0",
"unplugin-auto-import": "^0.16.4", "unplugin-auto-import": "^0.16.4",
@ -89,7 +90,7 @@
"devDependencies": { "devDependencies": {
"@antfu/eslint-config": "^0.41.0", "@antfu/eslint-config": "^0.41.0",
"@iconify-json/mdi": "^1.1.50", "@iconify-json/mdi": "^1.1.50",
"@intlify/unplugin-vue-i18n": "^0.12.3", "@intlify/unplugin-vue-i18n": "^0.13.0",
"@playwright/test": "^1.32.3", "@playwright/test": "^1.32.3",
"@rushstack/eslint-patch": "^1.2.0", "@rushstack/eslint-patch": "^1.2.0",
"@tsconfig/node18": "^18.2.0", "@tsconfig/node18": "^18.2.0",
@ -121,7 +122,7 @@
"typescript": "~5.2.0", "typescript": "~5.2.0",
"unocss": "^0.55.0", "unocss": "^0.55.0",
"unocss-preset-scrollbar": "^0.2.1", "unocss-preset-scrollbar": "^0.2.1",
"unplugin-icons": "^0.16.5", "unplugin-icons": "^0.17.0",
"unplugin-vue-components": "^0.25.0", "unplugin-vue-components": "^0.25.0",
"vite": "^4.4.9", "vite": "^4.4.9",
"vite-plugin-pwa": "^0.16.0", "vite-plugin-pwa": "^0.16.0",

View file

@ -2,6 +2,7 @@ import { defineConfig, devices } from '@playwright/test';
const isCI = !!process.env.CI; const isCI = !!process.env.CI;
const baseUrl = process.env.BASE_URL || 'http://localhost:5050'; const baseUrl = process.env.BASE_URL || 'http://localhost:5050';
const useWebServer = process.env.NO_WEB_SERVER !== 'true';
/** /**
* See https://playwright.dev/docs/test-configuration. * See https://playwright.dev/docs/test-configuration.
@ -52,13 +53,13 @@ export default defineConfig({
/* Run your local dev server before starting the tests */ /* Run your local dev server before starting the tests */
...(isCI ...(useWebServer
? {} && {
: {
webServer: { webServer: {
command: 'npm run preview', command: 'npm run preview',
url: 'http://127.0.0.1:5050', url: 'http://127.0.0.1:5050',
reuseExistingServer: true, reuseExistingServer: !isCI,
}, },
}), }
),
}); });

177
pnpm-lock.yaml generated
View file

@ -129,8 +129,8 @@ dependencies:
specifier: ^2.1.0 specifier: ^2.1.0
version: 2.1.0 version: 2.1.0
sql-formatter: sql-formatter:
specifier: ^12.0.0 specifier: ^13.0.0
version: 12.0.0 version: 13.0.0
ua-parser-js: ua-parser-js:
specifier: ^1.0.35 specifier: ^1.0.35
version: 1.0.35 version: 1.0.35
@ -170,8 +170,8 @@ devDependencies:
specifier: ^1.1.50 specifier: ^1.1.50
version: 1.1.50 version: 1.1.50
'@intlify/unplugin-vue-i18n': '@intlify/unplugin-vue-i18n':
specifier: ^0.12.3 specifier: ^0.13.0
version: 0.12.3(rollup@2.79.1)(vue-i18n@9.2.2) version: 0.13.0(rollup@2.79.1)(vue-i18n@9.2.2)
'@playwright/test': '@playwright/test':
specifier: ^1.32.3 specifier: ^1.32.3
version: 1.32.3 version: 1.32.3
@ -266,8 +266,8 @@ devDependencies:
specifier: ^0.2.1 specifier: ^0.2.1
version: 0.2.1(unocss@0.55.0) version: 0.2.1(unocss@0.55.0)
unplugin-icons: unplugin-icons:
specifier: ^0.16.5 specifier: ^0.17.0
version: 0.16.5(@vue/compiler-sfc@3.2.47) version: 0.17.0(@vue/compiler-sfc@3.2.47)
unplugin-vue-components: unplugin-vue-components:
specifier: ^0.25.0 specifier: ^0.25.0
version: 0.25.0(rollup@2.79.1)(vue@3.3.4) version: 0.25.0(rollup@2.79.1)(vue@3.3.4)
@ -417,6 +417,10 @@ packages:
resolution: {integrity: sha512-dlR6LdS+0SzOAPx/TPRhnoi7hE251OVeT2Snw0RguNbBSbjUHdWr0l3vcUUDg26rEysT89kCbtw1lVorBXLLCg==} resolution: {integrity: sha512-dlR6LdS+0SzOAPx/TPRhnoi7hE251OVeT2Snw0RguNbBSbjUHdWr0l3vcUUDg26rEysT89kCbtw1lVorBXLLCg==}
dev: true dev: true
/@antfu/utils@0.7.6:
resolution: {integrity: sha512-pvFiLP2BeOKA/ZOS6jxx4XhKzdVLHDhGlFEaZ2flWWYf2xOqVniqpk38I04DFRyz+L0ASggl7SkItTc+ZLju4w==}
dev: true
/@apideck/better-ajv-errors@0.3.6(ajv@8.12.0): /@apideck/better-ajv-errors@0.3.6(ajv@8.12.0):
resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==} resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==}
engines: {node: '>=10'} engines: {node: '>=10'}
@ -486,7 +490,7 @@ packages:
'@babel/helper-compilation-targets': 7.22.5(@babel/core@7.22.5) '@babel/helper-compilation-targets': 7.22.5(@babel/core@7.22.5)
'@babel/helper-module-transforms': 7.22.5 '@babel/helper-module-transforms': 7.22.5
'@babel/helpers': 7.22.5 '@babel/helpers': 7.22.5
'@babel/parser': 7.22.5 '@babel/parser': 7.22.10
'@babel/template': 7.22.5 '@babel/template': 7.22.5
'@babel/traverse': 7.22.5 '@babel/traverse': 7.22.5
'@babel/types': 7.22.5 '@babel/types': 7.22.5
@ -2091,8 +2095,21 @@ packages:
- supports-color - supports-color
dev: true dev: true
/@intlify/bundle-utils@7.0.2(vue-i18n@9.2.2): /@iconify/utils@2.1.9:
resolution: {integrity: sha512-8wbx9xhbawBFTE5LPTECiK26RRqrNS31jyWSur72ZXZZ4it5jiZTcG6eUJlNirr4+jXYio2DGY299JsGVT4cpw==} resolution: {integrity: sha512-mo+A4n3MwLlWlg1SoSO+Dt6pOPWKElk9sSJ6ZpuzbB9OcjxN8RUWxU3ulPwB1nglErWKRam2x4BAohbYF7FiFA==}
dependencies:
'@antfu/install-pkg': 0.1.1
'@antfu/utils': 0.7.6
'@iconify/types': 2.0.0
debug: 4.3.4
kolorist: 1.8.0
local-pkg: 0.4.3
transitivePeerDependencies:
- supports-color
dev: true
/@intlify/bundle-utils@7.1.0(vue-i18n@9.2.2):
resolution: {integrity: sha512-Q88Wl2T8oaRXls8Yr6l807jZM88mceJvK7QS6gKdU8/pf3gTpU9XmcYORDgAv6h5WKQMoaFjNVf5+SWLfTAysA==}
engines: {node: '>= 14.16'} engines: {node: '>= 14.16'}
peerDependencies: peerDependencies:
petite-vue-i18n: '*' petite-vue-i18n: '*'
@ -2103,17 +2120,17 @@ packages:
vue-i18n: vue-i18n:
optional: true optional: true
dependencies: dependencies:
'@intlify/message-compiler': 9.3.0-beta.24 '@intlify/message-compiler': 9.3.0-beta.27
'@intlify/shared': 9.3.0-beta.24 '@intlify/shared': 9.3.0-beta.27
acorn: 8.10.0 acorn: 8.10.0
escodegen: 2.0.0 escodegen: 2.0.0
estree-walker: 2.0.2 estree-walker: 2.0.2
jsonc-eslint-parser: 1.4.1 jsonc-eslint-parser: 2.3.0
magic-string: 0.30.2 magic-string: 0.30.2
mlly: 1.4.0 mlly: 1.4.0
source-map-js: 1.0.2 source-map-js: 1.0.2
vue-i18n: 9.2.2(vue@3.3.4) vue-i18n: 9.2.2(vue@3.3.4)
yaml-eslint-parser: 0.3.2 yaml-eslint-parser: 1.2.2
dev: true dev: true
/@intlify/core-base@9.2.2: /@intlify/core-base@9.2.2:
@ -2138,11 +2155,11 @@ packages:
'@intlify/shared': 9.2.2 '@intlify/shared': 9.2.2
source-map: 0.6.1 source-map: 0.6.1
/@intlify/message-compiler@9.3.0-beta.24: /@intlify/message-compiler@9.3.0-beta.27:
resolution: {integrity: sha512-prhHATkgp0mpPqoVgiAtLmUc1JMvs8fMH6w53AVEBn+VF87dLhzanfmWY5FoZWORG51ag54gBDBOoM/VFv3m3A==} resolution: {integrity: sha512-GC8rSbd7V67Zu+a9Z0bpV4riBek11YCURJU50YaEhV4Ub2JHEPtoYxK5r2eIsq/kp+M2hJyGLiC4NJUrGa2VwQ==}
engines: {node: '>= 16'} engines: {node: '>= 16'}
dependencies: dependencies:
'@intlify/shared': 9.3.0-beta.24 '@intlify/shared': 9.3.0-beta.27
source-map-js: 1.0.2 source-map-js: 1.0.2
dev: true dev: true
@ -2150,13 +2167,18 @@ packages:
resolution: {integrity: sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==} resolution: {integrity: sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==}
engines: {node: '>= 14'} engines: {node: '>= 14'}
/@intlify/shared@9.3.0-beta.24: /@intlify/shared@9.3.0-beta.14-77e850b:
resolution: {integrity: sha512-AKxJ8s7eKIQWkNaf4wyyoLRwf4puCuQgjSChlDJm5JBEt6T8HGgnYTJLRXu6LD/JACn3Qwu6hM/XRX1c9yvjmQ==} resolution: {integrity: sha512-aHZYRM0sJN+YSUnoC5Dv4L1TFYtP23kdTkrK5cHSEqUbI5UXc8FbnXPal0lJliMhO0ED7Ic7aEOeQX84BM3xCQ==}
engines: {node: '>= 14'}
dev: true
/@intlify/shared@9.3.0-beta.27:
resolution: {integrity: sha512-hPMsmVCs+ZUVHHU5VORG6LopzXZT7zmyVNqc9OQG80YpA/N4lT/pkJ4B6DTNIsv2C7mwfGM7RdK+0qPki43YgA==}
engines: {node: '>= 16'} engines: {node: '>= 16'}
dev: true dev: true
/@intlify/unplugin-vue-i18n@0.12.3(rollup@2.79.1)(vue-i18n@9.2.2): /@intlify/unplugin-vue-i18n@0.13.0(rollup@2.79.1)(vue-i18n@9.2.2):
resolution: {integrity: sha512-0riPtSfTM58JmGNMmJho/aHD2z3K24BESYAmkLvKlo61/LbaPvnjYU1DbSbJEm6bSjE2oEjUj+di3QaYxXei/w==} resolution: {integrity: sha512-Mm9NhcvbsSZ5FXXnCpL/XFCk1hPp809hxErNmnwqGp21JjYOKGp3wpQSrpvGk33ZrHZbhPqAu70IEVEAxVZ5+A==}
engines: {node: '>= 14.16'} engines: {node: '>= 14.16'}
peerDependencies: peerDependencies:
petite-vue-i18n: '*' petite-vue-i18n: '*'
@ -2170,8 +2192,8 @@ packages:
vue-i18n-bridge: vue-i18n-bridge:
optional: true optional: true
dependencies: dependencies:
'@intlify/bundle-utils': 7.0.2(vue-i18n@9.2.2) '@intlify/bundle-utils': 7.1.0(vue-i18n@9.2.2)
'@intlify/shared': 9.3.0-beta.24 '@intlify/shared': 9.3.0-beta.14-77e850b
'@rollup/pluginutils': 5.0.2(rollup@2.79.1) '@rollup/pluginutils': 5.0.2(rollup@2.79.1)
'@vue/compiler-sfc': 3.3.4 '@vue/compiler-sfc': 3.3.4
debug: 4.3.4 debug: 4.3.4
@ -3247,7 +3269,7 @@ packages:
dependencies: dependencies:
'@unhead/dom': 0.5.1 '@unhead/dom': 0.5.1
'@unhead/schema': 0.5.1 '@unhead/schema': 0.5.1
'@vueuse/shared': 10.4.0(vue@3.3.4) '@vueuse/shared': 10.4.1(vue@3.3.4)
unhead: 0.5.1 unhead: 0.5.1
vue: 3.3.4 vue: 3.3.4
transitivePeerDependencies: transitivePeerDependencies:
@ -3829,8 +3851,8 @@ packages:
- vue - vue
dev: false dev: false
/@vueuse/shared@10.4.0(vue@3.3.4): /@vueuse/shared@10.4.1(vue@3.3.4):
resolution: {integrity: sha512-52asvLf5cbAS/h6xWjqoY4MgjxmFjnVNf/nA8BP7RbeIrIGcf+BZbeOcVo+92byqArXEJiBxptXpufQvbwJL/w==} resolution: {integrity: sha512-vz5hbAM4qA0lDKmcr2y3pPdU+2EVw/yzfRsBdu+6+USGa4PxqSQRYIUC9/NcT06y+ZgaTsyURw2I9qOFaaXHAg==}
dependencies: dependencies:
vue-demi: 0.14.5(vue@3.3.4) vue-demi: 0.14.5(vue@3.3.4)
transitivePeerDependencies: transitivePeerDependencies:
@ -3850,20 +3872,12 @@ packages:
resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==}
dev: true dev: true
/acorn-jsx@5.3.2(acorn@7.4.1): /acorn-jsx@5.3.2(acorn@8.10.0):
resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
peerDependencies: peerDependencies:
acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
dependencies: dependencies:
acorn: 7.4.1 acorn: 8.10.0
dev: true
/acorn-jsx@5.3.2(acorn@8.9.0):
resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
peerDependencies:
acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
dependencies:
acorn: 8.9.0
dev: true dev: true
/acorn-walk@8.2.0: /acorn-walk@8.2.0:
@ -3871,15 +3885,10 @@ packages:
engines: {node: '>=0.4.0'} engines: {node: '>=0.4.0'}
dev: true dev: true
/acorn@7.4.1:
resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==}
engines: {node: '>=0.4.0'}
dev: true
/acorn@8.10.0: /acorn@8.10.0:
resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==}
engines: {node: '>=0.4.0'} engines: {node: '>=0.4.0'}
dev: true hasBin: true
/acorn@8.9.0: /acorn@8.9.0:
resolution: {integrity: sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==} resolution: {integrity: sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==}
@ -4901,6 +4910,7 @@ packages:
/escodegen@2.0.0: /escodegen@2.0.0:
resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==} resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==}
engines: {node: '>=6.0'} engines: {node: '>=6.0'}
hasBin: true
dependencies: dependencies:
esprima: 4.0.1 esprima: 4.0.1
estraverse: 5.3.0 estraverse: 5.3.0
@ -5179,18 +5189,6 @@ packages:
estraverse: 5.3.0 estraverse: 5.3.0
dev: true dev: true
/eslint-utils@2.1.0:
resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==}
engines: {node: '>=6'}
dependencies:
eslint-visitor-keys: 1.3.0
dev: true
/eslint-visitor-keys@1.3.0:
resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==}
engines: {node: '>=4'}
dev: true
/eslint-visitor-keys@3.4.3: /eslint-visitor-keys@3.4.3:
resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@ -5241,27 +5239,19 @@ packages:
- supports-color - supports-color
dev: true dev: true
/espree@6.2.1:
resolution: {integrity: sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==}
engines: {node: '>=6.0.0'}
dependencies:
acorn: 7.4.1
acorn-jsx: 5.3.2(acorn@7.4.1)
eslint-visitor-keys: 1.3.0
dev: true
/espree@9.6.1: /espree@9.6.1:
resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dependencies: dependencies:
acorn: 8.9.0 acorn: 8.10.0
acorn-jsx: 5.3.2(acorn@8.9.0) acorn-jsx: 5.3.2(acorn@8.10.0)
eslint-visitor-keys: 3.4.3 eslint-visitor-keys: 3.4.3
dev: true dev: true
/esprima@4.0.1: /esprima@4.0.1:
resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
engines: {node: '>=4'} engines: {node: '>=4'}
hasBin: true
dev: true dev: true
/esquery@1.5.0: /esquery@1.5.0:
@ -5575,6 +5565,11 @@ packages:
resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==}
dev: true dev: true
/get-stdin@8.0.0:
resolution: {integrity: sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==}
engines: {node: '>=10'}
dev: false
/get-stream@6.0.1: /get-stream@6.0.1:
resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
engines: {node: '>=10'} engines: {node: '>=10'}
@ -6228,6 +6223,7 @@ packages:
/js-yaml@3.14.1: /js-yaml@3.14.1:
resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
hasBin: true
dependencies: dependencies:
argparse: 1.0.10 argparse: 1.0.10
esprima: 4.0.1 esprima: 4.0.1
@ -6235,6 +6231,7 @@ packages:
/js-yaml@4.1.0: /js-yaml@4.1.0:
resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
hasBin: true
dependencies: dependencies:
argparse: 2.0.1 argparse: 2.0.1
dev: true dev: true
@ -6326,17 +6323,6 @@ packages:
resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
engines: {node: '>=6'} engines: {node: '>=6'}
/jsonc-eslint-parser@1.4.1:
resolution: {integrity: sha512-hXBrvsR1rdjmB2kQmUjf1rEIa+TqHBGMge8pwi++C+Si1ad7EjZrJcpgwym+QGK/pqTx+K7keFAtLlVNdLRJOg==}
engines: {node: '>=8.10.0'}
dependencies:
acorn: 7.4.1
eslint-utils: 2.1.0
eslint-visitor-keys: 1.3.0
espree: 6.2.1
semver: 6.3.1
dev: true
/jsonc-eslint-parser@2.3.0: /jsonc-eslint-parser@2.3.0:
resolution: {integrity: sha512-9xZPKVYp9DxnM3sd1yAsh/d59iIaswDkai8oTxbursfKYbg/ibjX0IzFt35+VZ8iEW453TVTXztnRvYUQlAfUQ==} resolution: {integrity: sha512-9xZPKVYp9DxnM3sd1yAsh/d59iIaswDkai8oTxbursfKYbg/ibjX0IzFt35+VZ8iEW453TVTXztnRvYUQlAfUQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@ -6668,7 +6654,7 @@ packages:
/mlly@1.4.0: /mlly@1.4.0:
resolution: {integrity: sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==} resolution: {integrity: sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==}
dependencies: dependencies:
acorn: 8.9.0 acorn: 8.10.0
pathe: 1.1.1 pathe: 1.1.1
pkg-types: 1.0.3 pkg-types: 1.0.3
ufo: 1.1.2 ufo: 1.1.2
@ -6732,6 +6718,7 @@ packages:
/nearley@2.20.1: /nearley@2.20.1:
resolution: {integrity: sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==} resolution: {integrity: sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==}
hasBin: true
dependencies: dependencies:
commander: 2.20.3 commander: 2.20.3
moo: 0.5.2 moo: 0.5.2
@ -7095,6 +7082,7 @@ packages:
/pify@4.0.1: /pify@4.0.1:
resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
engines: {node: '>=6'} engines: {node: '>=6'}
requiresBuild: true
dev: true dev: true
optional: true optional: true
@ -7358,6 +7346,7 @@ packages:
/prr@1.0.1: /prr@1.0.1:
resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==}
requiresBuild: true
dev: true dev: true
optional: true optional: true
@ -7634,10 +7623,12 @@ packages:
/safer-buffer@2.1.2: /safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
requiresBuild: true
dev: true dev: true
/sax@1.2.4: /sax@1.2.4:
resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==}
requiresBuild: true
dev: true dev: true
optional: true optional: true
@ -7835,10 +7826,12 @@ packages:
resolution: {integrity: sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==} resolution: {integrity: sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==}
dev: false dev: false
/sql-formatter@12.0.0: /sql-formatter@13.0.0:
resolution: {integrity: sha512-LR2m7BEvkyNAPzmcSCZ2b4Qzm5ySiiXS9Juc73VguTqCWIbYv7ZFV4LaDM7jNNZqHPfrqFssO7WWpITsAuLOuQ==} resolution: {integrity: sha512-V21cVvge4rhn9Fa7K/fTKcmPM+x1yee6Vhq8ZwgaWh3VPBqApgsaoFB5kLAhiqRo5AmSaRyLU7LIdgnNwH01/w==}
hasBin: true
dependencies: dependencies:
argparse: 2.0.1 argparse: 2.0.1
get-stdin: 8.0.0
nearley: 2.20.1 nearley: 2.20.1
dev: false dev: false
@ -7953,7 +7946,7 @@ packages:
/strip-literal@1.0.1: /strip-literal@1.0.1:
resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==}
dependencies: dependencies:
acorn: 8.9.0 acorn: 8.10.0
/supports-color@5.5.0: /supports-color@5.5.0:
resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
@ -8323,7 +8316,7 @@ packages:
pkg-types: 1.0.3 pkg-types: 1.0.3
scule: 1.0.0 scule: 1.0.0
strip-literal: 1.0.1 strip-literal: 1.0.1
unplugin: 1.3.1 unplugin: 1.4.0
transitivePeerDependencies: transitivePeerDependencies:
- rollup - rollup
dev: false dev: false
@ -8423,8 +8416,8 @@ packages:
- rollup - rollup
dev: false dev: false
/unplugin-icons@0.16.5(@vue/compiler-sfc@3.2.47): /unplugin-icons@0.17.0(@vue/compiler-sfc@3.2.47):
resolution: {integrity: sha512-laCCqMWfng1XZgB9yowGfjBdDhtmz8t8zVnhzRNEMhBNdy26QrVewVmdXk/zsiAQYnEWvIxTjvW1nQXrxdd2+w==} resolution: {integrity: sha512-gMv66eY/Hj64heM55XrfDH3LUCWI51mtkBVUPVl9VkpvLgAYhdVe9nRuzu6p+idmCLSQVq7xiPxQcD4aXCgW5A==}
peerDependencies: peerDependencies:
'@svgr/core': '>=7.0.0' '@svgr/core': '>=7.0.0'
'@svgx/core': ^1.0.1 '@svgx/core': ^1.0.1
@ -8444,8 +8437,8 @@ packages:
optional: true optional: true
dependencies: dependencies:
'@antfu/install-pkg': 0.1.1 '@antfu/install-pkg': 0.1.1
'@antfu/utils': 0.7.5 '@antfu/utils': 0.7.6
'@iconify/utils': 2.1.7 '@iconify/utils': 2.1.9
'@vue/compiler-sfc': 3.2.47 '@vue/compiler-sfc': 3.2.47
debug: 4.3.4 debug: 4.3.4
kolorist: 1.8.0 kolorist: 1.8.0
@ -8495,11 +8488,10 @@ packages:
/unplugin@1.4.0: /unplugin@1.4.0:
resolution: {integrity: sha512-5x4eIEL6WgbzqGtF9UV8VEC/ehKptPXDS6L2b0mv4FRMkJxRtjaJfOWDd6a8+kYbqsjklix7yWP0N3SUepjXcg==} resolution: {integrity: sha512-5x4eIEL6WgbzqGtF9UV8VEC/ehKptPXDS6L2b0mv4FRMkJxRtjaJfOWDd6a8+kYbqsjklix7yWP0N3SUepjXcg==}
dependencies: dependencies:
acorn: 8.9.0 acorn: 8.10.0
chokidar: 3.5.3 chokidar: 3.5.3
webpack-sources: 3.2.3 webpack-sources: 3.2.3
webpack-virtual-modules: 0.5.0 webpack-virtual-modules: 0.5.0
dev: true
/upath@1.2.0: /upath@1.2.0:
resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==}
@ -9219,14 +9211,6 @@ packages:
/yallist@4.0.0: /yallist@4.0.0:
resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
/yaml-eslint-parser@0.3.2:
resolution: {integrity: sha512-32kYO6kJUuZzqte82t4M/gB6/+11WAuHiEnK7FreMo20xsCKPeFH5tDBU7iWxR7zeJpNnMXfJyXwne48D0hGrg==}
dependencies:
eslint-visitor-keys: 1.3.0
lodash: 4.17.21
yaml: 1.10.2
dev: true
/yaml-eslint-parser@1.2.2: /yaml-eslint-parser@1.2.2:
resolution: {integrity: sha512-pEwzfsKbTrB8G3xc/sN7aw1v6A6c/pKxLAkjclnAyo5g5qOh6eL9WGu0o3cSDQZKrTNk4KL4lQSwZW+nBkANEg==} resolution: {integrity: sha512-pEwzfsKbTrB8G3xc/sN7aw1v6A6c/pKxLAkjclnAyo5g5qOh6eL9WGu0o3cSDQZKrTNk4KL4lQSwZW+nBkANEg==}
engines: {node: ^14.17.0 || >=16.0.0} engines: {node: ^14.17.0 || >=16.0.0}
@ -9236,11 +9220,6 @@ packages:
yaml: 2.2.1 yaml: 2.2.1
dev: true dev: true
/yaml@1.10.2:
resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
engines: {node: '>= 6'}
dev: true
/yaml@2.2.1: /yaml@2.2.1:
resolution: {integrity: sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==} resolution: {integrity: sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==}
engines: {node: '>= 14'} engines: {node: '>= 14'}

View file

@ -45,7 +45,7 @@ const compareMatch = computed(() => compareSync(compareString.value, compareHash
<c-input-text v-model:value="compareString" placeholder="Your string to compare..." raw-text /> <c-input-text v-model:value="compareString" placeholder="Your string to compare..." raw-text />
</n-form-item> </n-form-item>
<n-form-item label="Your hash: " label-placement="left"> <n-form-item label="Your hash: " label-placement="left">
<c-input-text v-model:value="compareHash" placeholder="Your hahs to compare..." raw-text /> <c-input-text v-model:value="compareHash" placeholder="Your hash to compare..." raw-text />
</n-form-item> </n-form-item>
<n-form-item label="Do they match ? " label-placement="left" :show-feedback="false"> <n-form-item label="Do they match ? " label-placement="left" :show-feedback="false">
<div class="compare-result" :class="{ positive: compareMatch }"> <div class="compare-result" :class="{ positive: compareMatch }">

View file

@ -1,14 +1,15 @@
import { type Page, expect, test } from '@playwright/test'; import { type Page, expect, test } from '@playwright/test';
import _ from 'lodash';
async function extractIbanInfo({ page }: { page: Page }) { async function extractIbanInfo({ page }: { page: Page }) {
const tdHandles = await page.locator('table tr td').elementHandles(); const itemsLines = await page
const tdTextContents = await Promise.all(tdHandles.map(el => el.textContent())); .locator('.c-key-value-list__item').all();
return _.chain(tdTextContents) return await Promise.all(
.map(tdTextContent => tdTextContent?.trim().replace(' Copy to clipboard', '')) itemsLines.map(async item => [
.chunk(2) (await item.locator('.c-key-value-list__key').textContent() ?? '').trim(),
.value(); (await item.locator('.c-key-value-list__value').textContent() ?? '').trim(),
]),
);
} }
test.describe('Tool - Iban validator and parser', () => { test.describe('Tool - Iban validator and parser', () => {
@ -41,7 +42,7 @@ test.describe('Tool - Iban validator and parser', () => {
expect(ibanInfo).toEqual([ expect(ibanInfo).toEqual([
['Is IBAN valid ?', 'No'], ['Is IBAN valid ?', 'No'],
['IBAN errors', 'Wrong account bank branch checksumWrong IBAN checksum Copy to clipboard'], ['IBAN errors', 'Wrong account bank branch checksum Wrong IBAN checksum'],
['Is IBAN a QR-IBAN ?', 'No'], ['Is IBAN a QR-IBAN ?', 'No'],
['Country code', 'N/A'], ['Country code', 'N/A'],
['BBAN', 'N/A'], ['BBAN', 'N/A'],

View file

@ -60,7 +60,7 @@ const ibanExamples = [
<div> <div>
<c-input-text v-model:value="rawIban" placeholder="Enter an IBAN to check for validity..." test-id="iban-input" /> <c-input-text v-model:value="rawIban" placeholder="Enter an IBAN to check for validity..." test-id="iban-input" />
<c-key-value-list :items="ibanInfo" my-5 /> <c-key-value-list :items="ibanInfo" my-5 data-test-id="iban-info" />
<c-card title="Valid IBAN examples"> <c-card title="Valid IBAN examples">
<div v-for="iban in ibanExamples" :key="iban"> <div v-for="iban in ibanExamples" :key="iban">

View file

@ -0,0 +1,27 @@
<script lang="ts" setup>
import _ from 'lodash';
import type { CKeyValueListItem } from './c-key-value-list.types';
const props = defineProps<{ item: CKeyValueListItem }>();
const { item } = toRefs(props);
</script>
<template>
<div v-if="_.isArray(item.value)">
<div v-for="value in item.value" :key="value">
<c-text-copyable :value="value" :show-icon="item.showCopyButton ?? true" />
</div>
</div>
<div v-else-if="_.isBoolean(item.value)">
<c-text-copyable :value="item.value ? 'true' : 'false'" :displayed-value="item.value ? 'Yes' : 'No'" :show-icon="item.showCopyButton ?? true" />
</div>
<div v-else-if="_.isNumber(item.value)" font-mono>
<c-text-copyable :value="String(item.value)" :show-icon="item.showCopyButton ?? true" />
</div>
<div v-else-if="_.isNil(item.value) || item.value === ''" op-70>
{{ item.placeholder ?? 'N/A' }}
</div>
<div v-else>
<c-text-copyable :value="item.value" :show-icon="item.showCopyButton ?? true" />
</div>
</template>

View file

@ -9,29 +9,13 @@ const formattedItems = computed(() => items.value.filter(item => !_.isNil(item.v
</script> </script>
<template> <template>
<table border-collapse table-fixed> <div my-5>
<tr v-for="item in formattedItems" :key="item.label"> <div v-for="item in formattedItems" :key="item.label" flex gap-2 py-1 class="c-key-value-list__item">
<td py-1 pr-2 text-right font-bold> <div flex-basis-180px text-right font-bold class="c-key-value-list__key">
{{ item.label }} {{ item.label }}
</td>
<td v-if="_.isArray(item.value)">
<div v-for="value in item.value" :key="value">
<c-text-copyable :value="value" :show-icon="item.showCopyButton ?? true" />
</div> </div>
</td>
<td v-else-if="_.isBoolean(item.value)"> <c-key-value-list-item :item="item" class="c-key-value-list__value" />
<c-text-copyable :value="item.value ? 'true' : 'false'" :displayed-value="item.value ? 'Yes' : 'No'" :show-icon="item.showCopyButton ?? true" /> </div>
</td> </div>
<td v-else-if="_.isNumber(item.value)" font-mono>
<c-text-copyable :value="String(item.value)" :show-icon="item.showCopyButton ?? true" />
</td>
<td v-else-if="_.isNil(item.value) || item.value === ''" op-70>
{{ item.placeholder ?? 'N/A' }}
</td>
<td v-else>
<c-text-copyable :value="item.value" :show-icon="item.showCopyButton ?? true" />
</td>
</tr>
</table>
</template> </template>

View file

@ -19,7 +19,10 @@ const isTargetHovered = useElementHover(targetRef);
'op-100 scale-100': isTargetHovered, 'op-100 scale-100': isTargetHovered,
}" }"
> >
<slot name="tooltip"> <slot
v-if="isTargetHovered"
name="tooltip"
>
{{ tooltip }} {{ tooltip }}
</slot> </slot>
</div> </div>