diff --git a/Dockerfile b/Dockerfile
index 421046d..b1382bc 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,5 +1,5 @@
##########################
-FROM node:24.14.0-alpine3.23 AS base
+FROM node:24.14.1-alpine3.23 AS base
WORKDIR /app
ENV NODE_ENV=production
@@ -26,9 +26,12 @@ COPY --from=package-strip /app/package.json package.json
COPY --from=package-strip /app/package-lock.json package-lock.json
ADD ui/package.json ui/package.json
ADD api/package.json api/package.json
-# full deps install used for building
+ADD lib-vuetify/package.json lib-vuetify/package.json
+# full deps install used for types and ui building
# also used to fill the npm cache for faster install of api deps
-RUN npm ci --omit=optional --no-audit --no-fund
+RUN npm ci --omit=dev --no-audit --no-fund
+# install dev dependencies for ui workspace
+RUN npm install -w ui --include=dev --no-audit --no-fund
##########################
FROM installer AS types
@@ -46,6 +49,7 @@ COPY --from=types /app/api/config api/config
COPY --from=types /app/api/types api/types
ADD /api/src/config.ts api/src/config.ts
ADD /ui ui
+ADD /lib-vuetify lib-vuetify
RUN npm -w ui run build
##########################
diff --git a/eslint.config.mjs b/eslint.config.mjs
index 19b0e4f..89e4fe0 100644
--- a/eslint.config.mjs
+++ b/eslint.config.mjs
@@ -2,7 +2,7 @@ import neostandard from 'neostandard'
import dfLibRecommended from '@data-fair/lib-utils/eslint/recommended.js'
export default [
- { ignores: ['ui/*', '**/.type/', 'dev/*', 'node_modules/*'] },
+ { ignores: ['ui/*', '**/.type/', 'dev/*', 'node_modules/*', 'lib-vuetify/*.js', 'lib-vuetify/*.d.ts'] },
...dfLibRecommended,
...neostandard({ ts: true })
]
diff --git a/lib-vuetify/.gitignore b/lib-vuetify/.gitignore
new file mode 100644
index 0000000..d785128
--- /dev/null
+++ b/lib-vuetify/.gitignore
@@ -0,0 +1,3 @@
+*.js
+*.d.ts
+!env.d.ts
diff --git a/lib-vuetify/DfNotificationQueue.vue b/lib-vuetify/DfNotificationQueue.vue
new file mode 100644
index 0000000..8dc071a
--- /dev/null
+++ b/lib-vuetify/DfNotificationQueue.vue
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('loginRequired.part1') }} {{ t('loginRequired.part2') }} {{ t('loginRequired.part3') }}
+
+
+ {{ t('noNotifications') }}
+
+
+
+ {{ dayjs(notif.date).format('lll') }}
+ {{ notif.body }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ en:
+ loginRequired:
+ part1: You must
+ part2: log in
+ part3: to receive notifications.
+ noNotifications: You have not received any notifications yet.
+ openNotificationList: Open notification list
+
+ fr:
+ loginRequired:
+ part1: Vous devez vous
+ part2: connecter
+ part3: pour recevoir des notifications.
+ noNotifications: Vous n'avez pas encore reçu de notification.
+ openNotificationList: Ouvrir la liste des notifications
+
diff --git a/lib-vuetify/env.d.ts b/lib-vuetify/env.d.ts
new file mode 100644
index 0000000..2b97bd9
--- /dev/null
+++ b/lib-vuetify/env.d.ts
@@ -0,0 +1,5 @@
+declare module '*.vue' {
+ import type { DefineComponent } from 'vue'
+ const component: DefineComponent<{}, {}, any>
+ export default component
+}
diff --git a/lib-vuetify/index.ts b/lib-vuetify/index.ts
new file mode 100644
index 0000000..3c4bafd
--- /dev/null
+++ b/lib-vuetify/index.ts
@@ -0,0 +1 @@
+export { default as DfNotificationQueue } from './DfNotificationQueue.vue'
diff --git a/lib-vuetify/package.json b/lib-vuetify/package.json
new file mode 100644
index 0000000..631cc52
--- /dev/null
+++ b/lib-vuetify/package.json
@@ -0,0 +1,27 @@
+{
+ "name": "@data-fair/lib-vuetify-events",
+ "version": "0.2.1",
+ "description": "Vuetify components for embedding events features.",
+ "main": "index.js",
+ "type": "module",
+ "files": [
+ "**/*.js",
+ "**/*.d.ts",
+ "**/*.vue"
+ ],
+ "scripts": {
+ "build": "tsc",
+ "prepublishOnly": "tsc"
+ },
+ "license": "MIT",
+ "peerDependencies": {
+ "vue": "^3.5.0",
+ "vuetify": "^4.0.0",
+ "@data-fair/lib-vuetify": "^2.0.0",
+ "@data-fair/lib-vue": "^1.26.0"
+ },
+ "dependencies": {
+ "@mdi/js": "^7.4.47",
+ "ofetch": "^1.4.0"
+ }
+}
diff --git a/lib-vuetify/tsconfig.json b/lib-vuetify/tsconfig.json
new file mode 100644
index 0000000..1dcc5e1
--- /dev/null
+++ b/lib-vuetify/tsconfig.json
@@ -0,0 +1,16 @@
+{
+ "compilerOptions": {
+ "target": "ESNext",
+ "module": "NodeNext",
+ "moduleResolution": "NodeNext",
+ "declaration": true,
+ "strict": true,
+ "esModuleInterop": true,
+ "skipLibCheck": true,
+ "outDir": ".",
+ "rootDir": ".",
+ "lib": ["ESNext", "DOM"]
+ },
+ "include": ["*.ts"],
+ "exclude": ["node_modules"]
+}
diff --git a/package-lock.json b/package-lock.json
index 2846674..2c8a185 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,7 +10,8 @@
"license": "MIT",
"workspaces": [
"ui",
- "api"
+ "api",
+ "lib-vuetify"
],
"dependencies": {
"@data-fair/lib-types-builder": "^1.11.6"
@@ -26,7 +27,7 @@
"dotenv-cli": "^11.0.0",
"eslint": "^9.39.4",
"eslint-plugin-vue": "^9.33.0",
- "eslint-plugin-vuetify": "github:albanm/eslint-plugin-vuetify",
+ "eslint-plugin-vuetify": "^2.5.1",
"husky": "^9.1.7",
"json-schema-to-typescript": "^11.0.5",
"neostandard": "^0.12.2",
@@ -35,6 +36,9 @@
"tough-cookie": "^5.1.2",
"typescript": "^5.9.3",
"ws": "^8.20.0"
+ },
+ "optionalDependencies": {
+ "sass": "1.98.0"
}
},
"api": {
@@ -90,6 +94,21 @@
"node": "^18 || >=20"
}
},
+ "lib-vuetify": {
+ "name": "@data-fair/lib-vuetify-events",
+ "version": "0.2.1",
+ "license": "MIT",
+ "dependencies": {
+ "@mdi/js": "^7.4.47",
+ "ofetch": "^1.4.0"
+ },
+ "peerDependencies": {
+ "@data-fair/lib-vue": "^1.26.0",
+ "@data-fair/lib-vuetify": "^2.0.0",
+ "vue": "^3.5.0",
+ "vuetify": "^4.0.0"
+ }
+ },
"node_modules/@apidevtools/json-schema-ref-parser": {
"version": "11.9.3",
"resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.9.3.tgz",
@@ -557,7 +576,6 @@
"resolved": "https://registry.npmjs.org/@data-fair/lib-node/-/lib-node-2.12.1.tgz",
"integrity": "sha512-qNQwLV1XbzrRs/UlhHWWJRArenIy7qdg9JKuWK/NPnlLAJAzTvWkiOM/Q2UVnFo2CquJ4+7uUMymhEt7+nBw+Q==",
"license": "MIT",
- "peer": true,
"dependencies": {
"@data-fair/lib-common-types": "^1.8.4",
"@data-fair/lib-utils": "^1.1.0",
@@ -685,7 +703,6 @@
"resolved": "https://registry.npmjs.org/@data-fair/lib-vue/-/lib-vue-1.27.0.tgz",
"integrity": "sha512-9yCj9cSXo2lrU8X3AWURjODuSQY+MIS2Wf8we7rx5HG/k3qEV8PKLS1WS2dGiuhyh5to4hXeLMOOCgne599dAw==",
"license": "MIT",
- "peer": true,
"dependencies": {
"@data-fair/lib-common-types": "^1.7.1",
"@data-fair/lib-utils": "^1.9.0",
@@ -708,10 +725,32 @@
}
}
},
+ "node_modules/@data-fair/lib-vuetify": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@data-fair/lib-vuetify/-/lib-vuetify-2.0.5.tgz",
+ "integrity": "sha512-qRRJLH3riP5xur7mpms2yT7n8qtWv2uxQIeitYgznu/8mZ7xotD0Ka0ntaV7FGdjlEXUI/3obkNT9J4uDQioHA==",
+ "license": "MIT",
+ "dependencies": {
+ "@data-fair/lib-common-types": "^1.10.4",
+ "@mdi/js": "^7.4.47",
+ "@vueuse/core": "^14.0.0"
+ },
+ "peerDependencies": {
+ "@data-fair/lib-vue": "^1.15.0",
+ "ofetch": "1",
+ "vue-i18n": "10 || 11",
+ "vuetify": "4"
+ }
+ },
+ "node_modules/@data-fair/lib-vuetify-events": {
+ "resolved": "lib-vuetify",
+ "link": true
+ },
"node_modules/@emnapi/core": {
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.0.tgz",
"integrity": "sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w==",
+ "dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
@@ -723,6 +762,7 @@
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.0.tgz",
"integrity": "sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==",
+ "dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
@@ -733,6 +773,7 @@
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz",
"integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==",
+ "dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
@@ -751,6 +792,7 @@
"os": [
"aix"
],
+ "peer": true,
"engines": {
"node": ">=12"
}
@@ -767,6 +809,7 @@
"os": [
"android"
],
+ "peer": true,
"engines": {
"node": ">=12"
}
@@ -783,6 +826,7 @@
"os": [
"android"
],
+ "peer": true,
"engines": {
"node": ">=12"
}
@@ -799,6 +843,7 @@
"os": [
"android"
],
+ "peer": true,
"engines": {
"node": ">=12"
}
@@ -815,6 +860,7 @@
"os": [
"darwin"
],
+ "peer": true,
"engines": {
"node": ">=12"
}
@@ -831,6 +877,7 @@
"os": [
"darwin"
],
+ "peer": true,
"engines": {
"node": ">=12"
}
@@ -847,6 +894,7 @@
"os": [
"freebsd"
],
+ "peer": true,
"engines": {
"node": ">=12"
}
@@ -863,6 +911,7 @@
"os": [
"freebsd"
],
+ "peer": true,
"engines": {
"node": ">=12"
}
@@ -879,6 +928,7 @@
"os": [
"linux"
],
+ "peer": true,
"engines": {
"node": ">=12"
}
@@ -895,6 +945,7 @@
"os": [
"linux"
],
+ "peer": true,
"engines": {
"node": ">=12"
}
@@ -911,6 +962,7 @@
"os": [
"linux"
],
+ "peer": true,
"engines": {
"node": ">=12"
}
@@ -927,6 +979,7 @@
"os": [
"linux"
],
+ "peer": true,
"engines": {
"node": ">=12"
}
@@ -943,6 +996,7 @@
"os": [
"linux"
],
+ "peer": true,
"engines": {
"node": ">=12"
}
@@ -959,6 +1013,7 @@
"os": [
"linux"
],
+ "peer": true,
"engines": {
"node": ">=12"
}
@@ -975,6 +1030,7 @@
"os": [
"linux"
],
+ "peer": true,
"engines": {
"node": ">=12"
}
@@ -991,6 +1047,7 @@
"os": [
"linux"
],
+ "peer": true,
"engines": {
"node": ">=12"
}
@@ -1007,6 +1064,7 @@
"os": [
"linux"
],
+ "peer": true,
"engines": {
"node": ">=12"
}
@@ -1023,6 +1081,7 @@
"os": [
"netbsd"
],
+ "peer": true,
"engines": {
"node": ">=12"
}
@@ -1039,6 +1098,7 @@
"os": [
"openbsd"
],
+ "peer": true,
"engines": {
"node": ">=12"
}
@@ -1055,6 +1115,7 @@
"os": [
"sunos"
],
+ "peer": true,
"engines": {
"node": ">=12"
}
@@ -1071,6 +1132,7 @@
"os": [
"win32"
],
+ "peer": true,
"engines": {
"node": ">=12"
}
@@ -1087,6 +1149,7 @@
"os": [
"win32"
],
+ "peer": true,
"engines": {
"node": ">=12"
}
@@ -1103,6 +1166,7 @@
"os": [
"win32"
],
+ "peer": true,
"engines": {
"node": ">=12"
}
@@ -2421,19 +2485,6 @@
"node": ">=v12.0.0"
}
},
- "node_modules/@koumoul/v-iframe": {
- "version": "2.4.5",
- "resolved": "https://registry.npmjs.org/@koumoul/v-iframe/-/v-iframe-2.4.5.tgz",
- "integrity": "sha512-Y7btXvMP96vs6H5lfAZ6SOElXp+kAHE7G2vu0z0q6WrL33gaIIi0LdhUkA1K2x3XVo7RitCjwtPlaWqqijjTEw==",
- "license": "MIT",
- "dependencies": {
- "debug": "^4.3.2"
- },
- "peerDependencies": {
- "iframe-resizer": "4",
- "vuetify": "3"
- }
- },
"node_modules/@mdi/js": {
"version": "7.4.47",
"resolved": "https://registry.npmjs.org/@mdi/js/-/js-7.4.47.tgz",
@@ -3015,150 +3066,6 @@
"license": "BSD-3-Clause",
"optional": true
},
- "node_modules/@rolldown/binding-android-arm64": {
- "version": "1.0.0-rc.9",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.9.tgz",
- "integrity": "sha512-lcJL0bN5hpgJfSIz/8PIf02irmyL43P+j1pTCfbD1DbLkmGRuFIA4DD3B3ZOvGqG0XiVvRznbKtN0COQVaKUTg==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-darwin-arm64": {
- "version": "1.0.0-rc.9",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.9.tgz",
- "integrity": "sha512-J7Zk3kLYFsLtuH6U+F4pS2sYVzac0qkjcO5QxHS7OS7yZu2LRs+IXo+uvJ/mvpyUljDJ3LROZPoQfgBIpCMhdQ==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-darwin-x64": {
- "version": "1.0.0-rc.9",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.9.tgz",
- "integrity": "sha512-iwtmmghy8nhfRGeNAIltcNXzD0QMNaaA5U/NyZc1Ia4bxrzFByNMDoppoC+hl7cDiUq5/1CnFthpT9n+UtfFyg==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-freebsd-x64": {
- "version": "1.0.0-rc.9",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.9.tgz",
- "integrity": "sha512-DLFYI78SCiZr5VvdEplsVC2Vx53lnA4/Ga5C65iyldMVaErr86aiqCoNBLl92PXPfDtUYjUh+xFFor40ueNs4Q==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-arm-gnueabihf": {
- "version": "1.0.0-rc.9",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.9.tgz",
- "integrity": "sha512-CsjTmTwd0Hri6iTw/DRMK7kOZ7FwAkrO4h8YWKoX/kcj833e4coqo2wzIFywtch/8Eb5enQ/lwLM7w6JX1W5RQ==",
- "cpu": [
- "arm"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-arm64-gnu": {
- "version": "1.0.0-rc.9",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.9.tgz",
- "integrity": "sha512-2x9O2JbSPxpxMDhP9Z74mahAStibTlrBMW0520+epJH5sac7/LwZW5Bmg/E6CXuEF53JJFW509uP+lSedaUNxg==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-arm64-musl": {
- "version": "1.0.0-rc.9",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.9.tgz",
- "integrity": "sha512-JA1QRW31ogheAIRhIg9tjMfsYbglXXYGNPLdPEYrwFxdbkQCAzvpSCSHCDWNl4hTtrol8WeboCSEpjdZK8qrCg==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-ppc64-gnu": {
- "version": "1.0.0-rc.9",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.9.tgz",
- "integrity": "sha512-aOKU9dJheda8Kj8Y3w9gnt9QFOO+qKPAl8SWd7JPHP+Cu0EuDAE5wokQubLzIDQWg2myXq2XhTpOVS07qqvT+w==",
- "cpu": [
- "ppc64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-s390x-gnu": {
- "version": "1.0.0-rc.9",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.9.tgz",
- "integrity": "sha512-OalO94fqj7IWRn3VdXWty75jC5dk4C197AWEuMhIpvVv2lw9fiPhud0+bW2ctCxb3YoBZor71QHbY+9/WToadA==",
- "cpu": [
- "s390x"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
"node_modules/@rolldown/binding-linux-x64-gnu": {
"version": "1.0.0-rc.9",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.9.tgz",
@@ -3191,86 +3098,6 @@
"node": "^20.19.0 || >=22.12.0"
}
},
- "node_modules/@rolldown/binding-openharmony-arm64": {
- "version": "1.0.0-rc.9",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.9.tgz",
- "integrity": "sha512-+6zoiF+RRyf5cdlFQP7nm58mq7+/2PFaY2DNQeD4B87N36JzfF/l9mdBkkmTvSYcYPE8tMh/o3cRlsx1ldLfog==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "openharmony"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-wasm32-wasi": {
- "version": "1.0.0-rc.9",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.9.tgz",
- "integrity": "sha512-rgFN6sA/dyebil3YTlL2evvi/M+ivhfnyxec7AccTpRPccno/rPoNlqybEZQBkcbZu8Hy+eqNJCqfBR8P7Pg8g==",
- "cpu": [
- "wasm32"
- ],
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@napi-rs/wasm-runtime": "^1.1.1"
- },
- "engines": {
- "node": ">=14.0.0"
- }
- },
- "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz",
- "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==",
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@emnapi/core": "^1.7.1",
- "@emnapi/runtime": "^1.7.1",
- "@tybys/wasm-util": "^0.10.1"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/Brooooooklyn"
- }
- },
- "node_modules/@rolldown/binding-win32-arm64-msvc": {
- "version": "1.0.0-rc.9",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.9.tgz",
- "integrity": "sha512-lHVNUG/8nlF1IQk1C0Ci574qKYyty2goMiPlRqkC5R+3LkXDkL5Dhx8ytbxq35m+pkHVIvIxviD+TWLdfeuadA==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-win32-x64-msvc": {
- "version": "1.0.0-rc.9",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.9.tgz",
- "integrity": "sha512-G0oA4+w1iY5AGi5HcDTxWsoxF509hrFIPB2rduV5aDqS9FtDg1CAfa7V34qImbjfhIcA8C+RekocJZA96EarwQ==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
"node_modules/@rolldown/pluginutils": {
"version": "1.0.0-rc.2",
"resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.2.tgz",
@@ -3310,7 +3137,8 @@
"optional": true,
"os": [
"android"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-android-arm64": {
"version": "4.59.0",
@@ -3323,7 +3151,8 @@
"optional": true,
"os": [
"android"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-darwin-arm64": {
"version": "4.59.0",
@@ -3336,7 +3165,8 @@
"optional": true,
"os": [
"darwin"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-darwin-x64": {
"version": "4.59.0",
@@ -3349,7 +3179,8 @@
"optional": true,
"os": [
"darwin"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-freebsd-arm64": {
"version": "4.59.0",
@@ -3362,7 +3193,8 @@
"optional": true,
"os": [
"freebsd"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-freebsd-x64": {
"version": "4.59.0",
@@ -3375,7 +3207,8 @@
"optional": true,
"os": [
"freebsd"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
"version": "4.59.0",
@@ -3388,7 +3221,8 @@
"optional": true,
"os": [
"linux"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
"version": "4.59.0",
@@ -3401,7 +3235,8 @@
"optional": true,
"os": [
"linux"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-linux-arm64-gnu": {
"version": "4.59.0",
@@ -3414,7 +3249,8 @@
"optional": true,
"os": [
"linux"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-linux-arm64-musl": {
"version": "4.59.0",
@@ -3427,7 +3263,8 @@
"optional": true,
"os": [
"linux"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-linux-loong64-gnu": {
"version": "4.59.0",
@@ -3440,7 +3277,8 @@
"optional": true,
"os": [
"linux"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-linux-loong64-musl": {
"version": "4.59.0",
@@ -3453,7 +3291,8 @@
"optional": true,
"os": [
"linux"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-linux-ppc64-gnu": {
"version": "4.59.0",
@@ -3466,7 +3305,8 @@
"optional": true,
"os": [
"linux"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-linux-ppc64-musl": {
"version": "4.59.0",
@@ -3479,7 +3319,8 @@
"optional": true,
"os": [
"linux"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
"version": "4.59.0",
@@ -3492,7 +3333,8 @@
"optional": true,
"os": [
"linux"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-linux-riscv64-musl": {
"version": "4.59.0",
@@ -3505,7 +3347,8 @@
"optional": true,
"os": [
"linux"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-linux-s390x-gnu": {
"version": "4.59.0",
@@ -3518,7 +3361,8 @@
"optional": true,
"os": [
"linux"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-linux-x64-gnu": {
"version": "4.59.0",
@@ -3531,7 +3375,8 @@
"optional": true,
"os": [
"linux"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-linux-x64-musl": {
"version": "4.59.0",
@@ -3544,7 +3389,8 @@
"optional": true,
"os": [
"linux"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-openbsd-x64": {
"version": "4.59.0",
@@ -3557,7 +3403,8 @@
"optional": true,
"os": [
"openbsd"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-openharmony-arm64": {
"version": "4.59.0",
@@ -3570,7 +3417,8 @@
"optional": true,
"os": [
"openharmony"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-win32-arm64-msvc": {
"version": "4.59.0",
@@ -3583,7 +3431,8 @@
"optional": true,
"os": [
"win32"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-win32-ia32-msvc": {
"version": "4.59.0",
@@ -3596,7 +3445,8 @@
"optional": true,
"os": [
"win32"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-win32-x64-gnu": {
"version": "4.59.0",
@@ -3609,7 +3459,8 @@
"optional": true,
"os": [
"win32"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-win32-x64-msvc": {
"version": "4.59.0",
@@ -3622,7 +3473,8 @@
"optional": true,
"os": [
"win32"
- ]
+ ],
+ "peer": true
},
"node_modules/@stylistic/eslint-plugin": {
"version": "2.11.0",
@@ -3658,6 +3510,7 @@
"version": "0.10.1",
"resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz",
"integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==",
+ "dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
@@ -3847,7 +3700,6 @@
"resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz",
"integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==",
"license": "MIT",
- "peer": true,
"dependencies": {
"undici-types": "~7.18.0"
}
@@ -4049,7 +3901,6 @@
"integrity": "sha512-XZzOmihLIr8AD1b9hL9ccNMzEMWt/dE2u7NyTY9jJG6YNiNthaD5XtUHVF2uCXZ15ng+z2hT3MVuxnUYhq6k1g==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"@typescript-eslint/scope-manager": "8.57.0",
"@typescript-eslint/types": "8.57.0",
@@ -4904,7 +4755,6 @@
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
"integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
"license": "MIT",
- "peer": true,
"bin": {
"acorn": "bin/acorn"
},
@@ -4951,7 +4801,6 @@
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz",
"integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==",
"license": "MIT",
- "peer": true,
"dependencies": {
"fast-deep-equal": "^3.1.3",
"fast-uri": "^3.0.1",
@@ -5858,7 +5707,6 @@
"integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"env-paths": "^2.2.1",
"import-fresh": "^3.3.0",
@@ -6025,8 +5873,7 @@
"version": "1.11.20",
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.20.tgz",
"integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==",
- "license": "MIT",
- "peer": true
+ "license": "MIT"
},
"node_modules/de-indent": {
"version": "1.0.2",
@@ -6753,7 +6600,6 @@
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz",
"integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==",
"license": "MIT",
- "peer": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.8.0",
"@eslint-community/regexpp": "^4.12.1",
@@ -6912,7 +6758,6 @@
"integrity": "sha512-rM9K8UBHcWKpzQzStn1YRN2T5NvdeIfSVoKu/lKF41znQXHAUcBbYXe5wd6GNjZjTrP7viQ49n1D83x/2gYgIw==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"@package-json/types": "^0.0.12",
"@typescript-eslint/types": "^8.56.0",
@@ -7139,17 +6984,89 @@
}
},
"node_modules/eslint-plugin-vuetify": {
- "version": "2.4.0",
- "resolved": "git+ssh://git@github.com/albanm/eslint-plugin-vuetify.git#e25c604300a03f8b852593c71a5ce9f4d25c2acd",
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vuetify/-/eslint-plugin-vuetify-2.7.2.tgz",
+ "integrity": "sha512-c8uKnb4DFJFBaqGTKT9Yv6SDhe+cVAQpRpey7nRlpXgXfHpMEe8u6yg5DEhn+Diam0bY05nEe3+T/t/d+cEinQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "eslint-plugin-vue": "^9.6.0",
+ "eslint-plugin-vue": "^10.8.0",
"requireindex": "^1.2.0"
},
"peerDependencies": {
- "eslint": "^9.0.0",
- "vuetify": "^3.0.0"
+ "eslint": "^8.0.0 || ^9.0.0 || ^10.0.0",
+ "vuetify": "^3.0.0 || ^4.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-vuetify/node_modules/eslint-plugin-vue": {
+ "version": "10.8.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-10.8.0.tgz",
+ "integrity": "sha512-f1J/tcbnrpgC8suPN5AtdJ5MQjuXbSU9pGRSSYAuF3SHoiYCOdEX6O22pLaRyLHXvDcOe+O5ENgc1owQ587agA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.4.0",
+ "natural-compare": "^1.4.0",
+ "nth-check": "^2.1.1",
+ "postcss-selector-parser": "^7.1.0",
+ "semver": "^7.6.3",
+ "xml-name-validator": "^4.0.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "peerDependencies": {
+ "@stylistic/eslint-plugin": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0",
+ "@typescript-eslint/parser": "^7.0.0 || ^8.0.0",
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "vue-eslint-parser": "^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@stylistic/eslint-plugin": {
+ "optional": true
+ },
+ "@typescript-eslint/parser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-plugin-vuetify/node_modules/postcss-selector-parser": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz",
+ "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/eslint-plugin-vuetify/node_modules/vue-eslint-parser": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-10.4.0.tgz",
+ "integrity": "sha512-Vxi9pJdbN3ZnVGLODVtZ7y4Y2kzAAE2Cm0CZ3ZDRvydVYxZ6VrnBhLikBsRS+dpwj4Jv4UCv21PTEwF5rQ9WXg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "debug": "^4.4.0",
+ "eslint-scope": "^8.2.0 || ^9.0.0",
+ "eslint-visitor-keys": "^4.2.0 || ^5.0.0",
+ "espree": "^10.3.0 || ^11.0.0",
+ "esquery": "^1.6.0",
+ "semver": "^7.6.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0"
}
},
"node_modules/eslint-scope": {
@@ -7429,7 +7346,6 @@
"resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz",
"integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==",
"license": "MIT",
- "peer": true,
"dependencies": {
"accepts": "^2.0.0",
"body-parser": "^2.2.1",
@@ -7935,9 +7851,9 @@
"license": "ISC"
},
"node_modules/fsevents": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
"hasInstallScript": true,
"license": "MIT",
"optional": true,
@@ -8152,7 +8068,6 @@
"deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
"dev": true,
"license": "ISC",
- "peer": true,
"dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
@@ -8664,21 +8579,6 @@
"url": "https://opencollective.com/express"
}
},
- "node_modules/iframe-resizer": {
- "version": "4.4.5",
- "resolved": "https://registry.npmjs.org/iframe-resizer/-/iframe-resizer-4.4.5.tgz",
- "integrity": "sha512-U8bCywf/Gh07O69RXo6dXAzTtODQrxaHGHRI7Nt4ipXsuq6EMxVsOP/jjaP43YtXz/ibESS0uSVDN3sOGCzSmw==",
- "hasInstallScript": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">=0.8.0"
- },
- "funding": {
- "type": "individual",
- "url": "https://iframe-resizer.com//pricing"
- }
- },
"node_modules/ignore": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
@@ -9329,7 +9229,6 @@
"integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==",
"devOptional": true,
"license": "MIT",
- "peer": true,
"bin": {
"jiti": "lib/jiti-cli.mjs"
}
@@ -11932,7 +11831,6 @@
"resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.5.1.tgz",
"integrity": "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==",
"license": "MIT",
- "peer": true,
"dependencies": {
"destr": "^2.0.5",
"node-fetch-native": "^1.6.7",
@@ -12292,21 +12190,6 @@
"node": ">=18"
}
},
- "node_modules/playwright/node_modules/fsevents": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
"node_modules/possible-typed-array-names": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
@@ -12727,8 +12610,7 @@
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/reconnecting-websocket/-/reconnecting-websocket-4.4.0.tgz",
"integrity": "sha512-D2E33ceRPga0NvTDhJmphEgJ7FUYF0v4lr1ki0csq06OdlxKfugGzN0dSkxM/NfqCxYELK4KcaTOUOjTV6Dcng==",
- "license": "MIT",
- "peer": true
+ "license": "MIT"
},
"node_modules/reflect.getprototypeof": {
"version": "1.0.10",
@@ -13201,12 +13083,32 @@
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"license": "MIT"
},
+ "node_modules/sass": {
+ "version": "1.98.0",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.98.0.tgz",
+ "integrity": "sha512-+4N/u9dZ4PrgzGgPlKnaaRQx64RO0JBKs9sDhQ2pLgN6JQZ25uPQZKQYaBJU48Kd5BxgXoJ4e09Dq7nMcOUW3A==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "chokidar": "^4.0.0",
+ "immutable": "^5.1.5",
+ "source-map-js": ">=0.6.2 <2.0.0"
+ },
+ "bin": {
+ "sass": "sass.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "optionalDependencies": {
+ "@parcel/watcher": "^2.4.1"
+ }
+ },
"node_modules/sass-embedded": {
"version": "1.98.0",
"resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.98.0.tgz",
"integrity": "sha512-Do7u6iRb6K+lrllcTkB1BXcHwOxcKe3rEfOF/GcCLE2w3WpddakRAosJOHFUR37DpsvimQXEt5abs3NzUjEIqg==",
"license": "MIT",
- "peer": true,
"dependencies": {
"@bufbuild/protobuf": "^2.5.0",
"colorjs.io": "^0.5.0",
@@ -14365,7 +14267,6 @@
"integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==",
"devOptional": true,
"license": "BSD-3-Clause",
- "peer": true,
"dependencies": {
"tldts": "^6.1.32"
},
@@ -14594,7 +14495,6 @@
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
"license": "Apache-2.0",
- "peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -15151,7 +15051,6 @@
"resolved": "https://registry.npmjs.org/vite-plugin-vuetify/-/vite-plugin-vuetify-2.1.3.tgz",
"integrity": "sha512-Q4SC/4TqbNvaZIFb9YsfBqkGlYHbJJJ6uU3CnRBZqLUF3s5eCMVZAaV4GkTbehIH/bhSj42lMXztOwc71u6rVw==",
"license": "MIT",
- "peer": true,
"dependencies": {
"@vuetify/loader-shared": "^2.1.2",
"debug": "^4.3.3",
@@ -15166,6 +15065,21 @@
"vuetify": ">=3"
}
},
+ "node_modules/vite/node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
"node_modules/vscode-uri": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz",
@@ -15177,7 +15091,6 @@
"resolved": "https://registry.npmjs.org/vue/-/vue-3.5.30.tgz",
"integrity": "sha512-hTHLc6VNZyzzEH/l7PFGjpcTvUgiaPK5mdLkbjrTeWSRcEfxFrv56g/XckIYlE9ckuobsdwqd5mk2g1sBkMewg==",
"license": "MIT",
- "peer": true,
"dependencies": {
"@vue/compiler-dom": "3.5.30",
"@vue/compiler-sfc": "3.5.30",
@@ -15273,7 +15186,6 @@
"integrity": "sha512-mIjy4utxMz9lMMo6G9vYePv7gUFt4ztOMhY9/4czDJxZ26xPeJ49MAGa9wBAE3XuXbYCrtVPmPxNjej7JJJkZQ==",
"deprecated": "v9 and v10 no longer supported. please migrate to v11. about maintenance status, see https://vue-i18n.intlify.dev/guide/maintenance.html",
"license": "MIT",
- "peer": true,
"dependencies": {
"@intlify/core-base": "10.0.8",
"@intlify/shared": "10.0.8",
@@ -15318,9 +15230,9 @@
}
},
"node_modules/vuetify": {
- "version": "3.12.3",
- "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-3.12.3.tgz",
- "integrity": "sha512-7QzgftMu8OYKRz/jr2yntPEJ7WFmAzMn8jyeUcW7gz539MjQbDF3UrqZXW3aWi458UVJW9WWvzQn9x5B75Aijw==",
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-4.0.4.tgz",
+ "integrity": "sha512-sO2ux9RG0C1HKaP1HqDMro3+vbbmUJwzcKXuzaxQmUERAT/0FR0yfbwnj4PrMwWy1qc2WPJq01h4cr86FmNrFA==",
"license": "MIT",
"peer": true,
"funding": {
@@ -15614,7 +15526,6 @@
"resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz",
"integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==",
"license": "MIT",
- "peer": true,
"engines": {
"node": ">=10.0.0"
},
@@ -15756,14 +15667,13 @@
"@data-fair/frame": "^0.17.7",
"@data-fair/lib-vue": "^1.26.0",
"@data-fair/lib-vuetify": "^2.0.0",
+ "@data-fair/lib-vuetify-events": "*",
"@intlify/unplugin-vue-i18n": "^11.0.7",
- "@koumoul/v-iframe": "^2.4.5",
"@mdi/js": "^7.4.47",
"@types/config": "^3.3.5",
"@types/debug": "^4.1.12",
"@vitejs/plugin-vue": "^6.0.5",
"debug": "^4.4.3",
- "iframe-resizer": "^4.4.5",
"ofetch": "^1.5.1",
"reconnecting-websocket": "^4.4.0",
"sass-embedded": "^1.97.3",
@@ -15779,23 +15689,6 @@
"vuetify": "^4.0.2"
}
},
- "ui/node_modules/@data-fair/lib-vuetify": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@data-fair/lib-vuetify/-/lib-vuetify-2.0.0.tgz",
- "integrity": "sha512-xfI15er5F/8FN+//iKHc8ZsaQmuI8XrpF1MH3FqBGOoPxSzjzNWW7HvGL4NvY5SHmTI5mrvCVcyCIteW+Ljgbw==",
- "license": "MIT",
- "dependencies": {
- "@data-fair/lib-common-types": "^1.10.4",
- "@mdi/js": "^7.4.47",
- "@vueuse/core": "^14.0.0"
- },
- "peerDependencies": {
- "@data-fair/lib-vue": "^1.15.0",
- "ofetch": "1",
- "vue-i18n": "10 || 11",
- "vuetify": "4"
- }
- },
"ui/node_modules/@vue/devtools-api": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-8.1.0.tgz",
@@ -15820,6 +15713,20 @@
"url": "https://paulmillr.com/funding/"
}
},
+ "ui/node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
"ui/node_modules/readdirp": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz",
@@ -15975,7 +15882,6 @@
"resolved": "https://registry.npmjs.org/vuetify/-/vuetify-4.0.2.tgz",
"integrity": "sha512-klgSGmfXoLajdTuuxreilzDQjp0ojzL2U5v6Z3ZbMYtpihPPXT9rkd/FxWL3dIGevnWdgaP2Kpwoz6aS/MISDA==",
"license": "MIT",
- "peer": true,
"funding": {
"type": "github",
"url": "https://github.com/sponsors/johnleider"
diff --git a/package.json b/package.json
index 06180f7..646ebbc 100644
--- a/package.json
+++ b/package.json
@@ -27,7 +27,8 @@
"license": "MIT",
"workspaces": [
"ui",
- "api"
+ "api",
+ "lib-vuetify"
],
"bugs": {
"url": "https://github.com/data-fair/events/issues"
@@ -47,7 +48,7 @@
"dotenv-cli": "^11.0.0",
"eslint": "^9.39.4",
"eslint-plugin-vue": "^9.33.0",
- "eslint-plugin-vuetify": "github:albanm/eslint-plugin-vuetify",
+ "eslint-plugin-vuetify": "^2.5.1",
"husky": "^9.1.7",
"json-schema-to-typescript": "^11.0.5",
"neostandard": "^0.12.2",
@@ -65,5 +66,8 @@
"relativeDependencies": {
"@data-fair/lib-express": "../lib/packages/express",
"@data-fair/lib-vue": "../lib/packages/vue"
+ },
+ "optionalDependencies": {
+ "sass": "1.98.0"
}
}
diff --git a/tests/dev-notification-queue.e2e.spec.ts b/tests/dev-notification-queue.e2e.spec.ts
new file mode 100644
index 0000000..f27d2de
--- /dev/null
+++ b/tests/dev-notification-queue.e2e.spec.ts
@@ -0,0 +1,39 @@
+import { expect } from '@playwright/test'
+import { test } from './fixtures/login.ts'
+import { axiosAuth, clean, devBaseURL, axios } from './support/axios.ts'
+
+const axPush = axios({ headers: { 'x-secret-key': 'SECRET_EVENTS' }, baseURL: devBaseURL })
+
+test.describe('DfNotificationQueue on dev page', () => {
+ test.beforeEach(clean)
+
+ test('bell button is visible on dev page', async ({ page, goToWithAuth }) => {
+ await goToWithAuth('/events/dev', 'test-user1')
+ await expect(page.getByRole('button', { name: 'Open notification list' })).toBeVisible()
+ })
+
+ test('shows notification in dropdown after event is sent with subscription', async ({ page, goToWithAuth }) => {
+ // create a subscription for test-user1
+ const user1 = await axiosAuth('test-user1')
+ await user1.post('/api/subscriptions', {
+ topic: { key: 'topic1' },
+ sender: { type: 'user', id: 'test-user1', name: 'User 1' },
+ outputs: ['devices']
+ })
+
+ // send an event matching the subscription
+ await axPush.post('/api/events', [{
+ date: new Date().toISOString(),
+ topic: { key: 'topic1' },
+ title: 'Dev page notification title',
+ sender: { type: 'user', id: 'test-user1', name: 'User 1' }
+ }])
+
+ // wait for notification processing
+ await new Promise(resolve => setTimeout(resolve, 2000))
+
+ await goToWithAuth('/events/dev', 'test-user1')
+ await page.getByRole('button', { name: 'Open notification list' }).click()
+ await expect(page.getByText('Dev page notification title')).toBeVisible()
+ })
+})
diff --git a/ui/eslint.config.mjs b/ui/eslint.config.mjs
index 04edcab..0093e32 100644
--- a/ui/eslint.config.mjs
+++ b/ui/eslint.config.mjs
@@ -1,9 +1,8 @@
import neostandard from 'neostandard'
import pluginVue from 'eslint-plugin-vue'
import dfLibRecommended from '@data-fair/lib-utils/eslint/recommended.js'
-// cf https://github.com/vuetifyjs/eslint-plugin-vuetify/pull/98
// @ts-ignore
-import vuetify from 'eslint-plugin-vuetify/src/index.js'
+import vuetify from 'eslint-plugin-vuetify'
export default [
...dfLibRecommended,
diff --git a/ui/package.json b/ui/package.json
index 6332c93..f0965d2 100644
--- a/ui/package.json
+++ b/ui/package.json
@@ -15,14 +15,13 @@
"@data-fair/frame": "^0.17.7",
"@data-fair/lib-vue": "^1.26.0",
"@data-fair/lib-vuetify": "^2.0.0",
+ "@data-fair/lib-vuetify-events": "*",
"@intlify/unplugin-vue-i18n": "^11.0.7",
- "@koumoul/v-iframe": "^2.4.5",
"@mdi/js": "^7.4.47",
"@types/config": "^3.3.5",
"@types/debug": "^4.1.12",
"@vitejs/plugin-vue": "^6.0.5",
"debug": "^4.4.3",
- "iframe-resizer": "^4.4.5",
"ofetch": "^1.5.1",
"reconnecting-websocket": "^4.4.0",
"sass-embedded": "^1.97.3",
diff --git a/ui/src/main.ts b/ui/src/main.ts
index 32180e7..9e32b91 100644
--- a/ui/src/main.ts
+++ b/ui/src/main.ts
@@ -11,13 +11,8 @@ import { createSession } from '@data-fair/lib-vue/session.js'
import { createUiNotif } from '@data-fair/lib-vue/ui-notif.js'
import { createI18n } from 'vue-i18n'
import App from './App.vue'
-// TODO: remove v-iframe and iframe-resizer when d-frame is fully integrated
-import '@koumoul/v-iframe/content-window'
-import 'iframe-resizer/js/iframeResizer.contentWindow.js'
import dFrameContent from '@data-fair/frame/lib/vue-router/d-frame-content.js'
-(window as any).iFrameResizer = { heightCalculationMethod: 'taggedElement' };
-
(async function () {
const router = createRouter({ history: createWebHistory($sitePath + '/events/'), routes })
dFrameContent(router)
@@ -29,9 +24,7 @@ import dFrameContent from '@data-fair/frame/lib/vue-router/d-frame-content.js'
...vuetifySessionOptions(session, $cspNonce),
icons: { defaultSet: 'mdi', aliases, sets: { mdi, } }
})
- const i18n = createI18n({ locale: session.state.lang });
-
- (window as any).vIframeOptions = { router }
+ const i18n = createI18n({ locale: session.state.lang })
createApp(App)
.use(router)
diff --git a/ui/src/pages/dev.vue b/ui/src/pages/dev.vue
index 0097a33..47390f5 100644
--- a/ui/src/pages/dev.vue
+++ b/ui/src/pages/dev.vue
@@ -2,6 +2,7 @@