Finish dependency move (#25583)

* Dangerously update API deps

* Dangerously move app dependencies to pnpm-workspace

* Move all dependencies to catalog

* Sort catalog

* Pnpm update

* Use pnpm 10.14

* Update for zod breaking change

* Fix unhead breaking change

* Downgrade major api upgrades

* Downgrade app major upgrades

* Fix app tests

* Downgrade isolated-vm

* Add changeset

* Fix template in head

* Resolve unhead lang signature

* Downgrade unhead

* Downgrade keyv/redis

It uses a different redis lib under the hood which is incompatible

* Resolve import in test

* Update and move workspace root dependencies

* Update CSS for updated linter rules

* Oops

* Run formatter

* Update rule name

* Run prettier

* Move utils peer to catalog

* Add focus-trap dependency
This commit is contained in:
Rijk van Zanten
2025-08-04 18:13:12 -04:00
committed by GitHub
parent ad407d60c5
commit 7d2310badd
33 changed files with 4028 additions and 5322 deletions

View File

@@ -0,0 +1,14 @@
---
'@directus/composables': patch
'@directus/extensions': patch
'@directus/pressure': patch
'@directus/memory': patch
'@directus/stores': patch
'@directus/themes': patch
'@directus/types': patch
'@directus/utils': patch
'@directus/api': patch
'@directus/app': patch
---
Upgraded dependencies

View File

@@ -66,8 +66,8 @@
"test:coverage": "vitest run --coverage"
},
"dependencies": {
"@authenio/samlify-node-xmllint": "2.0.0",
"@aws-sdk/client-ses": "3.758.0",
"@authenio/samlify-node-xmllint": "catalog:",
"@aws-sdk/client-ses": "catalog:",
"@directus/app": "workspace:*",
"@directus/constants": "workspace:*",
"@directus/env": "workspace:*",
@@ -91,154 +91,154 @@
"@directus/system-data": "workspace:*",
"@directus/utils": "workspace:*",
"@directus/validation": "workspace:*",
"@godaddy/terminus": "4.12.1",
"@rollup/plugin-alias": "5.1.1",
"@rollup/plugin-node-resolve": "15.3.1",
"@rollup/plugin-virtual": "3.0.2",
"@tus/server": "1.10.2",
"@tus/utils": "0.5.1",
"argon2": "0.41.1",
"async": "3.2.6",
"async-mutex": "0.5.0",
"axios": "1.8.4",
"busboy": "1.6.0",
"bytes": "3.1.2",
"camelcase": "8.0.0",
"chalk": "5.4.1",
"chokidar": "3.6.0",
"commander": "12.1.0",
"content-disposition": "0.5.4",
"cookie": "1.0.2",
"cookie-parser": "1.4.7",
"cors": "2.8.5",
"cron-parser": "4.9.0",
"date-fns": "4.1.0",
"deep-diff": "1.0.2",
"destroy": "1.2.0",
"@godaddy/terminus": "catalog:",
"@rollup/plugin-alias": "catalog:",
"@rollup/plugin-node-resolve": "catalog:",
"@rollup/plugin-virtual": "catalog:",
"@tus/server": "catalog:",
"@tus/utils": "catalog:",
"argon2": "catalog:",
"async": "catalog:",
"async-mutex": "catalog:",
"axios": "catalog:",
"busboy": "catalog:",
"bytes": "catalog:",
"camelcase": "catalog:",
"chalk": "catalog:",
"chokidar": "catalog:",
"commander": "catalog:",
"content-disposition": "catalog:",
"cookie": "catalog:",
"cookie-parser": "catalog:",
"cors": "catalog:",
"cron-parser": "catalog:",
"date-fns": "catalog:",
"deep-diff": "catalog:",
"destroy": "catalog:",
"directus": "workspace:*",
"dotenv": "16.4.7",
"encodeurl": "2.0.0",
"eventemitter2": "6.4.9",
"execa": "8.0.1",
"exif-reader": "2.0.2",
"express": "4.21.2",
"flat": "6.0.1",
"fs-extra": "11.3.0",
"glob-to-regexp": "0.4.1",
"graphql": "16.10.0",
"graphql-compose": "9.1.0",
"graphql-ws": "5.16.2",
"helmet": "8.0.0",
"icc": "3.0.0",
"inquirer": "12.4.2",
"ioredis": "5.5.0",
"ip-matching": "2.1.2",
"isolated-vm": "5.0.3",
"joi": "17.13.3",
"js-yaml": "4.1.0",
"js2xmlparser": "5.0.0",
"json2csv": "5.0.7",
"jsonwebtoken": "9.0.2",
"keyv": "5.3.0",
"knex": "3.1.0",
"ldapjs": "2.3.3",
"liquidjs": "10.21.0",
"dotenv": "catalog:",
"encodeurl": "catalog:",
"eventemitter2": "catalog:",
"execa": "catalog:",
"exif-reader": "catalog:",
"express": "catalog:",
"flat": "catalog:",
"fs-extra": "catalog:",
"glob-to-regexp": "catalog:",
"graphql": "catalog:",
"graphql-compose": "catalog:",
"graphql-ws": "catalog:",
"helmet": "catalog:",
"icc": "catalog:",
"inquirer": "catalog:",
"ioredis": "catalog:",
"ip-matching": "catalog:",
"isolated-vm": "catalog:",
"joi": "catalog:",
"js-yaml": "catalog:",
"js2xmlparser": "catalog:",
"json2csv": "catalog:",
"jsonwebtoken": "catalog:",
"keyv": "catalog:",
"knex": "catalog:",
"ldapjs": "catalog:",
"liquidjs": "catalog:",
"lodash-es": "catalog:",
"marked": "15.0.7",
"micromustache": "8.0.3",
"mime-types": "2.1.35",
"minimatch": "10.0.1",
"mnemonist": "0.40.3",
"ms": "2.1.3",
"nanoid": "5.1.2",
"node-machine-id": "1.1.12",
"node-schedule": "2.1.1",
"nodemailer": "6.10.0",
"object-hash": "3.0.0",
"openapi3-ts": "4.4.0",
"openid-client": "5.7.1",
"ora": "8.2.0",
"otplib": "12.0.1",
"p-limit": "6.2.0",
"p-queue": "8.1.0",
"papaparse": "5.5.2",
"pino": "9.6.0",
"pino-http": "10.4.0",
"pino-http-print": "3.1.0",
"pino-pretty": "13.0.0",
"pm2": "5.4.3",
"prom-client": "15.1.3",
"proxy-addr": "2.0.7",
"qs": "6.14.0",
"rate-limiter-flexible": "5.0.5",
"rollup": "4.34.9",
"rolldown": "1.0.0-beta.28",
"samlify": "2.10.0",
"sanitize-html": "2.14.0",
"sharp": "0.33.5",
"snappy": "7.2.2",
"stream-json": "1.9.1",
"tar": "7.4.3",
"tsx": "4.19.3",
"uuid": "11.1.0",
"wellknown": "0.5.0",
"ws": "8.18.1",
"zod": "3.24.2",
"zod-validation-error": "3.4.0"
"marked": "catalog:",
"micromustache": "catalog:",
"mime-types": "catalog:",
"minimatch": "catalog:",
"mnemonist": "catalog:",
"ms": "catalog:",
"nanoid": "catalog:",
"node-machine-id": "catalog:",
"node-schedule": "catalog:",
"nodemailer": "catalog:",
"object-hash": "catalog:",
"openapi3-ts": "catalog:",
"openid-client": "catalog:",
"ora": "catalog:",
"otplib": "catalog:",
"p-limit": "catalog:",
"p-queue": "catalog:",
"papaparse": "catalog:",
"pino": "catalog:",
"pino-http": "catalog:",
"pino-http-print": "catalog:",
"pino-pretty": "catalog:",
"pm2": "catalog:",
"prom-client": "catalog:",
"proxy-addr": "catalog:",
"qs": "catalog:",
"rate-limiter-flexible": "catalog:",
"rollup": "catalog:",
"rolldown": "catalog:",
"samlify": "catalog:",
"sanitize-html": "catalog:",
"sharp": "catalog:",
"snappy": "catalog:",
"stream-json": "catalog:",
"tar": "catalog:",
"tsx": "catalog:",
"uuid": "catalog:",
"wellknown": "catalog:",
"ws": "catalog:",
"zod": "catalog:",
"zod-validation-error": "catalog:"
},
"devDependencies": {
"@directus/schema-builder": "workspace:*",
"@directus/tsconfig": "catalog:",
"@directus/types": "workspace:*",
"@ngneat/falso": "7.3.0",
"@types/async": "3.2.24",
"@types/busboy": "1.5.4",
"@types/bytes": "3.1.5",
"@types/content-disposition": "0.5.8",
"@types/cookie-parser": "1.4.8",
"@types/cors": "2.8.17",
"@types/deep-diff": "1.0.5",
"@types/destroy": "1.0.3",
"@types/encodeurl": "1.0.2",
"@types/express": "4.17.21",
"@types/express-serve-static-core": "4.19.6",
"@types/fs-extra": "11.0.4",
"@types/glob-to-regexp": "0.4.4",
"@types/inquirer": "9.0.7",
"@types/js-yaml": "4.0.9",
"@types/json2csv": "5.0.7",
"@types/jsonwebtoken": "9.0.9",
"@types/ldapjs": "2.2.5",
"@ngneat/falso": "catalog:",
"@types/async": "catalog:",
"@types/busboy": "catalog:",
"@types/bytes": "catalog:",
"@types/content-disposition": "catalog:",
"@types/cookie-parser": "catalog:",
"@types/cors": "catalog:",
"@types/deep-diff": "catalog:",
"@types/destroy": "catalog:",
"@types/encodeurl": "catalog:",
"@types/express": "catalog:",
"@types/express-serve-static-core": "catalog:",
"@types/fs-extra": "catalog:",
"@types/glob-to-regexp": "catalog:",
"@types/inquirer": "catalog:",
"@types/js-yaml": "catalog:",
"@types/json2csv": "catalog:",
"@types/jsonwebtoken": "catalog:",
"@types/ldapjs": "catalog:",
"@types/lodash-es": "catalog:",
"@types/mime-types": "2.1.4",
"@types/ms": "2.1.0",
"@types/mime-types": "catalog:",
"@types/ms": "catalog:",
"@types/node": "catalog:",
"@types/node-schedule": "2.1.7",
"@types/nodemailer": "6.4.17",
"@types/object-hash": "3.0.6",
"@types/papaparse": "5.3.15",
"@types/proxy-addr": "2.0.3",
"@types/qs": "6.9.18",
"@types/sanitize-html": "2.13.0",
"@types/stream-json": "1.7.8",
"@types/wellknown": "0.5.8",
"@types/ws": "8.5.14",
"@types/node-schedule": "catalog:",
"@types/nodemailer": "catalog:",
"@types/object-hash": "catalog:",
"@types/papaparse": "catalog:",
"@types/proxy-addr": "catalog:",
"@types/qs": "catalog:",
"@types/sanitize-html": "catalog:",
"@types/stream-json": "catalog:",
"@types/wellknown": "catalog:",
"@types/ws": "catalog:",
"@vitest/coverage-v8": "catalog:",
"copyfiles": "2.4.1",
"copyfiles": "catalog:",
"form-data": "catalog:",
"get-port": "7.1.0",
"knex-mock-client": "3.0.2",
"get-port": "catalog:",
"knex-mock-client": "catalog:",
"typescript": "catalog:",
"vitest": "catalog:"
},
"optionalDependencies": {
"@keyv/redis": "3.0.1",
"mysql2": "3.12.0",
"nodemailer-mailgun-transport": "2.1.5",
"oracledb": "6.8.0",
"pg": "8.13.3",
"sqlite3": "5.1.7",
"tedious": "18.6.1"
"@keyv/redis": "catalog:",
"mysql2": "catalog:",
"nodemailer-mailgun-transport": "catalog:",
"oracledb": "catalog:",
"pg": "catalog:",
"sqlite3": "catalog:",
"tedious": "catalog:"
},
"engines": {
"node": ">=22"

View File

@@ -24,7 +24,10 @@ export function scheduleSynchronizedJob(
const clock = new SynchronizedClock(`${id}:${rule}`);
const job = schedule.scheduleJob(rule, async (fireDate) => {
const nextTimestamp = job.nextInvocation().getTime();
const nextInvocation = job.nextInvocation();
if (!nextInvocation) return;
const nextTimestamp = nextInvocation.getTime();
const wasSet = await clock.set(nextTimestamp);

View File

@@ -41,7 +41,7 @@ export const WebSocketSubscribeMessage = z.discriminatedUnion('type', [
collection: z.string(),
event: z.union([z.literal('create'), z.literal('update'), z.literal('delete')]).optional(),
item: zodStringOrNumber.optional(),
query: z.record(z.any()).optional(),
query: z.record(z.string(), z.any()).optional(),
}),
WebSocketMessage.extend({
type: z.literal('unsubscribe'),
@@ -100,19 +100,19 @@ export const WebSocketEvent = z.discriminatedUnion('action', [
z.object({
action: z.literal('create'),
collection: z.string(),
payload: z.record(z.any()).optional(),
payload: z.record(z.string(), z.any()).optional(),
key: zodStringOrNumber,
}),
z.object({
action: z.literal('update'),
collection: z.string(),
payload: z.record(z.any()).optional(),
payload: z.record(z.string(), z.any()).optional(),
keys: z.array(zodStringOrNumber),
}),
z.object({
action: z.literal('delete'),
collection: z.string(),
payload: z.record(z.any()).optional(),
payload: z.record(z.string(), z.any()).optional(),
keys: z.array(zodStringOrNumber),
}),
]);

View File

@@ -47,112 +47,113 @@
"@directus/types": "workspace:*",
"@directus/utils": "workspace:*",
"@directus/validation": "workspace:*",
"@editorjs/attaches": "1.3.0",
"@editorjs/checklist": "1.6.0",
"@editorjs/code": "2.9.0",
"@editorjs/delimiter": "1.4.2",
"@editorjs/editorjs": "2.29.1",
"@editorjs/embed": "2.7.4",
"@editorjs/header": "2.8.1",
"@editorjs/image": "2.9.3",
"@editorjs/inline-code": "1.5.1",
"@editorjs/nested-list": "1.4.3",
"@editorjs/paragraph": "2.11.5",
"@editorjs/quote": "2.7.2",
"@editorjs/raw": "2.5.0",
"@editorjs/table": "2.3.0",
"@editorjs/underline": "1.1.0",
"@fortawesome/fontawesome-svg-core": "6.7.2",
"@fortawesome/free-brands-svg-icons": "6.7.2",
"@fullcalendar/core": "6.1.15",
"@fullcalendar/daygrid": "6.1.15",
"@fullcalendar/interaction": "6.1.15",
"@fullcalendar/list": "6.1.15",
"@fullcalendar/timegrid": "6.1.15",
"@histoire/plugin-vue": "0.17.17",
"@joeattardi/emoji-button": "4.6.4",
"@json2csv/plainjs": "7.0.6",
"@mapbox/mapbox-gl-draw": "1.5.0",
"@mapbox/mapbox-gl-draw-static-mode": "1.0.1",
"@mapbox/mapbox-gl-geocoder": "5.1.0",
"@ngneat/falso": "7.3.0",
"@pinia/testing": "1.0.0",
"@popperjs/core": "2.11.8",
"@rollup/plugin-yaml": "4.1.2",
"@sindresorhus/slugify": "2.2.1",
"@tinymce/tinymce-vue": "6.1.0",
"@turf/meta": "7.2.0",
"@types/base-64": "1.0.2",
"@types/chroma-js": "3.1.1",
"@types/codemirror": "5.60.15",
"@types/diacritics": "1.3.3",
"@types/diff": "7.0.1",
"@types/file-saver": "2.0.7",
"@types/geojson": "7946.0.16",
"@types/lodash": "4.17.16",
"@types/mapbox__mapbox-gl-draw": "1.4.8",
"@types/mapbox__mapbox-gl-geocoder": "5.0.0",
"@types/qrcode": "1.5.5",
"@types/semver": "7.5.8",
"@types/wellknown": "0.5.8",
"@unhead/addons": "1.11.20",
"@unhead/vue": "1.11.20",
"@vitejs/plugin-vue": "5.2.1",
"@editorjs/attaches": "catalog:",
"@editorjs/checklist": "catalog:",
"@editorjs/code": "catalog:",
"@editorjs/delimiter": "catalog:",
"@editorjs/editorjs": "catalog:",
"@editorjs/embed": "catalog:",
"@editorjs/header": "catalog:",
"@editorjs/image": "catalog:",
"@editorjs/inline-code": "catalog:",
"@editorjs/nested-list": "catalog:",
"@editorjs/paragraph": "catalog:",
"@editorjs/quote": "catalog:",
"@editorjs/raw": "catalog:",
"@editorjs/table": "catalog:",
"@editorjs/underline": "catalog:",
"@fortawesome/fontawesome-svg-core": "catalog:",
"@fortawesome/free-brands-svg-icons": "catalog:",
"@fullcalendar/core": "catalog:",
"@fullcalendar/daygrid": "catalog:",
"@fullcalendar/interaction": "catalog:",
"@fullcalendar/list": "catalog:",
"@fullcalendar/timegrid": "catalog:",
"@histoire/plugin-vue": "catalog:",
"@joeattardi/emoji-button": "catalog:",
"@json2csv/plainjs": "catalog:",
"@mapbox/mapbox-gl-draw": "catalog:",
"@mapbox/mapbox-gl-draw-static-mode": "catalog:",
"@mapbox/mapbox-gl-geocoder": "catalog:",
"@ngneat/falso": "catalog:",
"@pinia/testing": "catalog:",
"@popperjs/core": "catalog:",
"@rollup/plugin-yaml": "catalog:",
"@sindresorhus/slugify": "catalog:",
"@tinymce/tinymce-vue": "catalog:",
"@turf/meta": "catalog:",
"@types/base-64": "catalog:",
"@types/chroma-js": "catalog:",
"@types/codemirror": "catalog:",
"@types/diacritics": "catalog:",
"@types/diff": "catalog:",
"@types/file-saver": "catalog:",
"@types/geojson": "catalog:",
"@types/lodash": "catalog:",
"@types/mapbox__mapbox-gl-draw": "catalog:",
"@types/mapbox__mapbox-gl-geocoder": "catalog:",
"@types/qrcode": "catalog:",
"@types/semver": "catalog:",
"@types/wellknown": "catalog:",
"@unhead/addons": "catalog:",
"@unhead/vue": "catalog:",
"@vitejs/plugin-vue": "catalog:",
"@vitest/coverage-v8": "catalog:",
"@vue/test-utils": "2.4.6",
"@vueuse/core": "12.7.0",
"@vueuse/integrations": "12.7.0",
"@vueuse/router": "12.7.0",
"apexcharts": "4.5.0",
"axios": "1.8.4",
"base-64": "1.0.0",
"caret-pos": "2.0.0",
"chroma-js": "3.1.2",
"codemirror": "5.65.18",
"color": "5.0.0",
"cropperjs": "1.6.2",
"date-fns": "4.1.0",
"diacritics": "1.3.0",
"diff": "7.0.0",
"dompurify": "3.2.4",
"editorjs-toggle-block": "0.3.16",
"escape-string-regexp": "5.0.0",
"file-saver": "2.0.5",
"flatpickr": "4.6.13",
"geojson": "0.5.0",
"happy-dom": "17.1.8",
"histoire": "0.17.17",
"html-entities": "2.5.2",
"json-to-graphql-query": "2.3.0",
"jsonlint-mod": "1.7.6",
"lodash": "4.17.21",
"mapbox-gl": "1.13.3",
"maplibre-gl": "1.15.3",
"marked": "15.0.7",
"micromustache": "8.0.3",
"mime": "4.0.6",
"mitt": "3.0.1",
"nanoid": "5.1.2",
"ofetch": "1.4.1",
"p-queue": "8.1.0",
"pinia": "2.3.1",
"pretty-ms": "9.2.0",
"qrcode": "1.5.4",
"sass-embedded": "1.85.1",
"semver": "7.7.1",
"string-width": "7.2.0",
"tinymce": "6.8.5",
"tus-js-client": "4.3.1",
"@vue/test-utils": "catalog:",
"@vueuse/core": "catalog:",
"@vueuse/integrations": "catalog:",
"@vueuse/router": "catalog:",
"apexcharts": "catalog:",
"axios": "catalog:",
"base-64": "catalog:",
"caret-pos": "catalog:",
"chroma-js": "catalog:",
"codemirror": "catalog:",
"color": "catalog:",
"cropperjs": "catalog:",
"date-fns": "catalog:",
"diacritics": "catalog:",
"diff": "catalog:",
"dompurify": "catalog:",
"editorjs-toggle-block": "catalog:",
"escape-string-regexp": "catalog:",
"file-saver": "catalog:",
"flatpickr": "catalog:",
"focus-trap": "catalog:",
"geojson": "catalog:",
"happy-dom": "catalog:",
"histoire": "catalog:",
"html-entities": "catalog:",
"json-to-graphql-query": "catalog:",
"jsonlint-mod": "catalog:",
"lodash": "catalog:",
"mapbox-gl": "catalog:",
"maplibre-gl": "catalog:",
"marked": "catalog:",
"micromustache": "catalog:",
"mime": "catalog:",
"mitt": "catalog:",
"nanoid": "catalog:",
"ofetch": "catalog:",
"p-queue": "catalog:",
"pinia": "catalog:",
"pretty-ms": "catalog:",
"qrcode": "catalog:",
"sass-embedded": "catalog:",
"semver": "catalog:",
"string-width": "catalog:",
"tinymce": "catalog:",
"tus-js-client": "catalog:",
"typescript": "catalog:",
"vite": "5.4.19",
"vite-plugin-vue-devtools": "7.7.2",
"vite": "catalog:",
"vite-plugin-vue-devtools": "catalog:",
"vitest": "catalog:",
"vue": "3.5.13",
"vue-i18n": "11.1.2",
"vue-router": "4.5.0",
"vue-tsc": "2.2.8",
"vue-virtual-scroller": "2.0.0-beta.8",
"vuedraggable": "4.1.0",
"wellknown": "0.5.0"
"vue": "catalog:",
"vue-i18n": "catalog:",
"vue-router": "catalog:",
"vue-tsc": "catalog:",
"vue-virtual-scroller": "catalog:",
"vuedraggable": "catalog:",
"wellknown": "catalog:"
}
}

View File

@@ -125,7 +125,7 @@ function emitClick(event: MouseEvent) {
letter-spacing: normal;
text-transform: none;
white-space: nowrap;
word-wrap: normal;
overflow-wrap: normal;
direction: ltr;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;

View File

@@ -38,6 +38,7 @@ withDefaults(defineProps<Props>(), {
overflow: hidden;
background-color: var(--v-skeleton-loader-background-color, var(--theme--form--field--input--background-subdued));
/* stylelint-disable-next-line */
&::after {
position: absolute;
inset-block-start: 0;

View File

@@ -1,11 +1,11 @@
<script setup lang="ts">
import Color, { ColorInstance } from 'color';
import { isHex } from '@/utils/is-hex';
import { i18n } from '@/lang';
import { isCssVar as isCssVarUtil } from '@/utils/is-css-var';
import { isHex } from '@/utils/is-hex';
import { cssVar } from '@directus/utils/browser';
import Color, { ColorInstance } from 'color';
import { ComponentPublicInstance, computed, ref, watch } from 'vue';
import { useI18n } from 'vue-i18n';
import { i18n } from '@/lang';
const { t } = useI18n();
@@ -355,8 +355,8 @@ function useColor() {
? 'repeat(4, 1fr)'
: 'repeat(6, 1fr)'
: width.startsWith('half')
? 'repeat(3, 1fr)'
: 'repeat(5, 1fr)',
? 'repeat(3, 1fr)'
: 'repeat(5, 1fr)',
}"
:class="{ stacked: width.startsWith('half') }"
>
@@ -368,8 +368,8 @@ function useColor() {
? '1 / span 4'
: '1 / span 2'
: width.startsWith('half')
? '1 / span 3'
: '1 / span 2',
? '1 / span 3'
: '1 / span 2',
}"
>
<v-select v-model="colorType" :items="colorTypes" />
@@ -536,7 +536,7 @@ function useColor() {
.color-data-inputs {
display: grid;
grid-gap: 0;
gap: 0;
inline-size: 100%;
padding: 12px 10px;
}
@@ -592,7 +592,7 @@ function useColor() {
.color-data-alphas {
display: grid;
grid-gap: 12px;
gap: 12px;
align-items: baseline;
inline-size: 100%;
block-size: 45px;

View File

@@ -294,7 +294,7 @@ function useIconsPerRow(
.icon-row {
display: grid;
grid-gap: var(--gap, 8px);
gap: var(--gap, 8px);
grid-template-columns: repeat(var(--icons-per-row, 1), var(--icon-size, 24px));
justify-content: start;
color: var(--theme--form--field--input--foreground-subdued);

View File

@@ -127,7 +127,7 @@ function onBlurCustomInput(otherVal: OtherValue) {
--columns: 1;
display: grid;
grid-gap: 12px 32px;
gap: 12px 32px;
grid-template-columns: repeat(var(--columns), minmax(0, 1fr));
}

View File

@@ -107,7 +107,7 @@ const customIcon = computed(() => {
--columns: 1;
display: grid;
grid-gap: 12px 32px;
gap: 12px 32px;
grid-template-columns: repeat(var(--columns), minmax(0, 1fr));
}

View File

@@ -483,7 +483,7 @@ function useOnUpdate() {
.precision-scale {
display: grid;
grid-gap: 12px;
gap: 12px;
grid-template-columns: 1fr 1fr;
}

View File

@@ -448,7 +448,7 @@ const tFieldType = (type: string) => t(type === 'geometry' ? 'geometry.All' : ty
.field-grid {
position: relative;
display: grid;
grid-gap: 8px;
gap: 8px;
grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
& + & {

View File

@@ -188,7 +188,7 @@ async function setNestedSort(updates?: Field[]) {
}
.field-select:deep(.field-grid) {
grid-gap: 0;
gap: 0;
}
.field-select:deep(.field-grid.group.full.nested) {

View File

@@ -11,6 +11,7 @@ import { mount } from '@vue/test-utils';
import { setActivePinia } from 'pinia';
import { beforeEach, expect, test, vi } from 'vitest';
import { createI18n } from 'vue-i18n';
import { createHead } from '@unhead/vue';
import ContinueAs from './components/continue-as.vue';
import LdapForm from './components/login-form/ldap-form.vue';
import LoginForm from './components/login-form/login-form.vue';
@@ -23,7 +24,7 @@ const global: GlobalMountOptions = {
components: { publicView, vSelect, vIcon, vImage },
directives: { md: MarkdownDirective },
stubs: { routerLink: true, publicView: false },
plugins: [i18n],
plugins: [i18n, createHead()],
};
// silences locale message not found warnings

View File

@@ -464,7 +464,7 @@ div.CodeMirror span.CodeMirror-nonmatchingbracket {
font-family: inherit;
line-height: inherit;
white-space: pre;
word-wrap: normal;
overflow-wrap: normal;
background: transparent;
border-width: 0;
@@ -477,7 +477,7 @@ div.CodeMirror span.CodeMirror-nonmatchingbracket {
.CodeMirror-wrap pre.CodeMirror-line,
.CodeMirror-wrap pre.CodeMirror-line-like {
white-space: pre-wrap;
word-wrap: break-word;
overflow-wrap: break-word;
word-break: normal;
}

View File

@@ -3,6 +3,7 @@
grid-template-columns: [start] minmax(0, 1fr) [half] minmax(0, 1fr) [full];
gap: var(--theme--form--row-gap) var(--theme--form--column-gap);
/* stylelint-disable-next-line */
&.with-fill {
grid-template-columns:
[start] minmax(0, var(--form-column-max-width)) [half] minmax(0, var(--form-column-max-width))

View File

@@ -6,11 +6,11 @@ test.each([
{ value: 'test', expected: '<p>test</p>\n' },
{
value: `[Directus](https://directus.io)`,
expected: '<p><a href="https://directus.io" target="_self">Directus</a></p>\n',
expected: '<p><a target="_self" href="https://directus.io">Directus</a></p>\n',
},
{
value: `[Directus](https://directus.io)`,
expected: '<p><a href="https://directus.io" target="_blank" rel="noopener noreferrer">Directus</a></p>\n',
expected: '<p><a target="_blank" href="https://directus.io" rel="noopener noreferrer">Directus</a></p>\n',
options: { target: '_blank' } as const,
},
{ value: `test<script>alert('alert')</script>`, expected: '<p>test</p>\n' },

View File

@@ -85,7 +85,7 @@ const formattedTime = computed(() => {
<template v-else>{{ t('uses_left', usesLeft) }}</template>
</span>
<v-icon v-if="share.password" small name="lock" />
<span style="flex-grow: 1"></span>
<span class="spacer"></span>
<span v-if="status" class="share-status" :class="{ [status]: true }">
{{ t(status) }}
</span>
@@ -101,6 +101,10 @@ const formattedTime = computed(() => {
border-radius: var(--theme--border-radius);
}
.spacer {
flex-grow: 1;
}
.item-date {
color: var(--theme--foreground-subdued);
font-size: 12px;

View File

@@ -50,7 +50,7 @@ const items = computed(() => allItems.filter((item) => item.key !== section));
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
clip-path: rect(0, 0, 0, 0);
white-space: nowrap;
border-width: 0;
@@ -59,7 +59,7 @@ const items = computed(() => allItems.filter((item) => item.key !== section));
block-size: auto;
margin: 0;
overflow: visible;
clip: auto;
clip-path: auto;
white-space: normal;
background-color: var(--theme--popover--menu--background);

View File

@@ -108,7 +108,7 @@ export default typescriptEslint.config(
files: ['**/*.vue'],
rules: {
// Same ordering of component tags everywhere
'vue/component-tags-order': [
'vue/block-order': [
'error',
{
order: ['script', 'template', 'style'],

View File

@@ -13,30 +13,30 @@
"test:coverage": "pnpm --recursive --filter '!tests-blackbox' test:coverage"
},
"devDependencies": {
"@changesets/cli": "2.28.1",
"@changesets/cli": "catalog:",
"@directus/release-notes-generator": "workspace:*",
"@eslint/js": "9.21.0",
"eslint": "9.21.0",
"eslint-config-prettier": "9.1.0",
"eslint-plugin-vue": "9.32.0",
"globals": "15.15.0",
"postcss-html": "1.8.0",
"prettier": "3.1.0",
"rimraf": "6.0.1",
"stylelint": "16.21.0",
"stylelint-config-standard": "38.0.0",
"stylelint-config-standard-scss": "15.0.1",
"stylelint-config-standard-vue": "1.0.0",
"stylelint-use-logical": "2.1.2",
"@eslint/js": "catalog:",
"eslint": "catalog:",
"eslint-config-prettier": "catalog:",
"eslint-plugin-vue": "catalog:",
"globals": "catalog:",
"postcss-html": "catalog:",
"prettier": "catalog:",
"rimraf": "catalog:",
"stylelint": "catalog:",
"stylelint-config-standard": "catalog:",
"stylelint-config-standard-scss": "catalog:",
"stylelint-config-standard-vue": "catalog:",
"stylelint-use-logical": "catalog:",
"typescript": "catalog:",
"typescript-eslint": "8.25.0"
"typescript-eslint": "catalog:"
},
"pnpm": {
"overrides": {
"tar-fs": "2.1.3"
}
},
"packageManager": "pnpm@10.13.1",
"packageManager": "pnpm@10.14.0",
"engines": {
"node": "22",
"pnpm": ">=10 <11"

View File

@@ -48,6 +48,6 @@
"vue": "catalog:"
},
"peerDependencies": {
"vue": "^3.4"
"vue": "catalog:"
}
}

View File

@@ -35,30 +35,30 @@
"@directus/constants": "workspace:*",
"@directus/types": "workspace:*",
"@directus/utils": "workspace:*",
"@types/express": "4.17.21",
"fs-extra": "11.3.0",
"@types/express": "catalog:",
"fs-extra": "catalog:",
"lodash-es": "catalog:",
"zod": "3.24.2"
"zod": "catalog:"
},
"devDependencies": {
"@directus/tsconfig": "catalog:",
"@types/fs-extra": "11.0.4",
"@types/fs-extra": "catalog:",
"@types/lodash-es": "catalog:",
"@types/node": "catalog:",
"@vitest/coverage-v8": "catalog:",
"knex": "3.1.0",
"pino": "9.6.0",
"knex": "catalog:",
"pino": "catalog:",
"tsup": "catalog:",
"typescript": "catalog:",
"vitest": "catalog:",
"vue": "3.5.13",
"vue-router": "4.5.0"
"vue": "catalog:",
"vue-router": "catalog:"
},
"peerDependencies": {
"knex": "3",
"pino": "9",
"vue": "^3.4",
"vue-router": "4"
"knex": "catalog:",
"pino": "catalog:",
"vue": "catalog:",
"vue-router": "catalog:"
},
"peerDependenciesMeta": {
"knex": {

View File

@@ -8,8 +8,8 @@ export const ExtensionManifest = z.object({
type: z.union([z.literal('module'), z.literal('commonjs')]).optional(),
description: z.string().optional(),
icon: z.string().optional(),
dependencies: z.record(z.string()).optional(),
devDependencies: z.record(z.string()).optional(),
dependencies: z.record(z.string(), z.string()).optional(),
devDependencies: z.record(z.string(), z.string()).optional(),
[EXTENSION_PKG_KEY]: ExtensionOptions,
});

View File

@@ -29,9 +29,9 @@
"dependencies": {
"@directus/errors": "workspace:*",
"@directus/utils": "workspace:*",
"ioredis": "5.5.0",
"lru-cache": "11.0.2",
"rate-limiter-flexible": "5.0.5"
"ioredis": "catalog:",
"lru-cache": "catalog:",
"rate-limiter-flexible": "catalog:"
},
"devDependencies": {
"@directus/tsconfig": "catalog:",

View File

@@ -31,7 +31,7 @@
},
"devDependencies": {
"@directus/tsconfig": "catalog:",
"@types/express": "4.17.21",
"@types/express": "catalog:",
"@vitest/coverage-v8": "catalog:",
"tsup": "catalog:",
"typescript": "catalog:",

View File

@@ -25,17 +25,17 @@
"dev": "tsup src/index.ts --format=esm --dts --watch"
},
"dependencies": {
"@vueuse/core": "12.7.0"
"@vueuse/core": "catalog:"
},
"devDependencies": {
"@directus/tsconfig": "catalog:",
"pinia": "2.3.1",
"pinia": "catalog:",
"tsup": "catalog:",
"typescript": "catalog:",
"vue": "3.5.13"
"vue": "catalog:"
},
"peerDependencies": {
"pinia": "2",
"vue": "^3.4"
"pinia": "catalog:",
"vue": "catalog:"
}
}

View File

@@ -29,27 +29,27 @@
},
"dependencies": {
"@directus/utils": "workspace:*",
"decamelize": "6.0.0",
"flat": "6.0.1",
"decamelize": "catalog:",
"flat": "catalog:",
"lodash-es": "catalog:"
},
"devDependencies": {
"@directus/tsconfig": "catalog:",
"@directus/types": "workspace:*",
"@types/lodash-es": "catalog:",
"@unhead/vue": "1.11.20",
"@vitejs/plugin-vue": "5.2.1",
"pinia": "2.3.1",
"rollup-plugin-node-externals": "8.0.0",
"@unhead/vue": "catalog:",
"@vitejs/plugin-vue": "catalog:",
"pinia": "catalog:",
"rollup-plugin-node-externals": "catalog:",
"typescript": "catalog:",
"vite": "5.4.19",
"vite-plugin-dts": "4.5.1",
"vitest": "3.2.4",
"vue": "3.5.13"
"vite": "catalog:",
"vite-plugin-dts": "catalog:",
"vitest": "catalog:",
"vue": "catalog:"
},
"peerDependencies": {
"@unhead/vue": "1",
"pinia": "2",
"vue": "^3.4"
"@unhead/vue": "catalog:",
"pinia": "catalog:",
"vue": "catalog:"
}
}

View File

@@ -27,32 +27,32 @@
"dependencies": {
"@directus/constants": "workspace:*",
"@directus/schema": "workspace:*",
"@sinclair/typebox": "0.34.28",
"@types/express": "4.17.21",
"@types/geojson": "7946.0.16",
"@types/nodemailer": "6.4.17",
"@types/ws": "8.5.14"
"@sinclair/typebox": "catalog:",
"@types/express": "catalog:",
"@types/geojson": "catalog:",
"@types/nodemailer": "catalog:",
"@types/ws": "catalog:"
},
"devDependencies": {
"@directus/tsconfig": "catalog:",
"@types/deep-diff": "1.0.2",
"knex": "3.1.0",
"@types/deep-diff": "catalog:",
"knex": "catalog:",
"typescript": "catalog:",
"vue": "3.5.13",
"zod": "3.24.2"
"vue": "catalog:",
"zod": "catalog:"
},
"peerDependencies": {
"deep-diff": "1.0.2",
"express": "4.21.2",
"graphql": "16.10.0",
"knex": "3",
"nodemailer": "6.10.0",
"openapi3-ts": "4.4.0",
"pino": "9.6.0",
"sharp": "0.33.5",
"vue": "^3.4",
"vue-router": "4.5.0",
"ws": "8.18.1"
"deep-diff": "catalog:",
"express": "catalog:",
"graphql": "catalog:",
"knex": "catalog:",
"nodemailer": "catalog:",
"openapi3-ts": "catalog:",
"pino": "catalog:",
"sharp": "catalog:",
"vue": "catalog:",
"vue-router": "catalog:",
"ws": "catalog:"
},
"peerDependenciesMeta": {
"deep-diff": {

View File

@@ -35,31 +35,31 @@
"dependencies": {
"@directus/constants": "workspace:*",
"@directus/system-data": "workspace:*",
"date-fns": "4.1.0",
"fs-extra": "11.3.0",
"joi": "17.13.3",
"js-yaml": "4.1.0",
"date-fns": "catalog:",
"fs-extra": "catalog:",
"joi": "catalog:",
"js-yaml": "catalog:",
"lodash-es": "catalog:",
"micromustache": "8.0.3"
"micromustache": "catalog:"
},
"devDependencies": {
"@directus/tsconfig": "catalog:",
"@directus/schema-builder": "workspace:*",
"@directus/types": "workspace:*",
"@types/fs-extra": "11.0.4",
"@types/js-yaml": "4.0.9",
"@types/fs-extra": "catalog:",
"@types/js-yaml": "catalog:",
"@types/lodash-es": "catalog:",
"@types/node": "catalog:",
"@types/tmp": "0.2.6",
"@types/tmp": "catalog:",
"@vitest/coverage-v8": "catalog:",
"tmp": "0.2.3",
"tmp": "catalog:",
"tsup": "catalog:",
"typescript": "catalog:",
"vitest": "catalog:",
"vue": "3.5.13"
"vue": "catalog:"
},
"peerDependencies": {
"vue": "^3.4"
"vue": "catalog:"
},
"peerDependenciesMeta": {
"vue": {

8390
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -7,78 +7,303 @@ packages:
- tests/*
catalog:
'@authenio/samlify-node-xmllint': 2.0.0
'@aws-sdk/client-s3': 3.858.0
'@aws-sdk/client-ses': 3.859.0
'@aws-sdk/lib-storage': 3.858.0
'@azure/storage-blob': 12.28.0
'@changesets/cli': 2.29.5
'@changesets/get-github-info': 0.6.0
'@changesets/types': 6.1.0
'@directus/schema-builder': workspace:*
'@directus/tsconfig': 3.0.0
'@directus/types': workspace:*
'@editorjs/attaches': 1.3.0
'@editorjs/checklist': 1.6.0
'@editorjs/code': 2.9.3
'@editorjs/delimiter': 1.4.2
'@editorjs/editorjs': 2.30.8
'@editorjs/embed': 2.7.6
'@editorjs/header': 2.8.8
'@editorjs/image': 2.10.3
'@editorjs/inline-code': 1.5.2
'@editorjs/nested-list': 1.4.3
'@editorjs/paragraph': 2.11.7
'@editorjs/quote': 2.7.6
'@editorjs/raw': 2.5.1
'@editorjs/table': 2.4.5
'@editorjs/underline': 1.2.1
'@eslint/js': 9.32.0
'@fortawesome/fontawesome-svg-core': 6.7.2
'@fortawesome/free-brands-svg-icons': 6.7.2
'@fullcalendar/core': 6.1.18
'@fullcalendar/daygrid': 6.1.18
'@fullcalendar/interaction': 6.1.18
'@fullcalendar/list': 6.1.18
'@fullcalendar/timegrid': 6.1.18
'@godaddy/terminus': 4.12.1
'@google-cloud/storage': 7.16.0
'@histoire/plugin-vue': 0.17.17
'@joeattardi/emoji-button': 4.6.4
'@json2csv/plainjs': 7.0.6
'@keyv/redis': 3.0.1
'@mapbox/mapbox-gl-draw': 1.5.0
'@mapbox/mapbox-gl-draw-static-mode': 1.0.1
'@mapbox/mapbox-gl-geocoder': 5.1.0
'@ngneat/falso': 8.0.2
'@npm/types': 2.1.0
'@pinia/testing': 1.0.2
'@pnpm/logger': 1001.0.0
'@pnpm/workspace.find-packages': 1000.0.31
'@pnpm/workspace.pkgs-graph': 1000.0.18
'@popperjs/core': 2.11.8
'@rollup/plugin-alias': 5.1.1
'@rollup/plugin-commonjs': 28.0.6
'@rollup/plugin-json': 6.1.0
'@rollup/plugin-node-resolve': 16.0.1
'@rollup/plugin-replace': 6.0.2
'@rollup/plugin-terser': 0.4.4
'@rollup/plugin-virtual': 3.0.2
'@rollup/plugin-yaml': 4.1.2
'@shopify/semaphore': 3.1.0
'@sinclair/typebox': 0.34.38
'@sindresorhus/slugify': 2.2.1
'@smithy/node-http-handler': 4.1.0
'@supabase/storage-js': 2.10.4
'@tus/utils': 0.6.0
'@tinymce/tinymce-vue': 6.3.0
'@turf/meta': 7.2.0
'@tus/server': 1.10.2
'@tus/utils': 0.5.1
'@types/async': 3.2.24
'@types/base-64': 1.0.2
'@types/busboy': 1.5.4
'@types/bytes': 3.1.5
'@types/chroma-js': 3.1.1
'@types/codemirror': 5.60.16
'@types/content-disposition': 0.5.9
'@types/cookie-parser': 1.4.9
'@types/cors': 2.8.19
'@types/deep-diff': 1.0.5
'@types/destroy': 1.0.3
'@types/diacritics': 1.3.3
'@types/diff': 7.0.1
'@types/encodeurl': 1.0.3
'@types/express': 4.17.21
'@types/express-serve-static-core': 4.19.6
'@types/file-saver': 2.0.7
'@types/fs-extra': 11.0.4
'@types/geojson': 7946.0.16
'@types/glob-to-regexp': 0.4.4
'@types/inquirer': 9.0.8
'@types/js-yaml': 4.0.9
'@types/json2csv': 5.0.7
'@types/jsonwebtoken': 9.0.10
'@types/ldapjs': 2.2.5
'@types/lodash': 4.17.20
'@types/lodash-es': 4.17.12
'@types/mapbox__mapbox-gl-draw': 1.4.9
'@types/mapbox__mapbox-gl-geocoder': 5.0.0
'@types/mime-types': 3.0.1
'@types/ms': 2.1.0
'@types/node': 22.13.14
'@types/node-schedule': 2.1.8
'@types/nodemailer': 6.4.17
'@types/object-hash': 3.0.6
'@types/papaparse': 5.3.16
'@types/proxy-addr': 2.0.3
'@types/qrcode': 1.5.5
'@types/qs': 6.14.0
'@types/sanitize-html': 2.16.0
'@types/semver': 7.7.0
'@types/stream-json': 1.7.8
'@types/tmp': 0.2.6
'@types/wellknown': 0.5.8
'@types/ws': 8.18.1
'@unhead/addons': 1.11.20
'@unhead/vue': 1.11.20
'@vitejs/plugin-vue': 6.0.1
'@vitest/coverage-v8': 3.2.4
'@vue/test-utils': 2.4.6
'@vueuse/core': 13.6.0
'@vueuse/integrations': 13.6.0
'@vueuse/router': 13.6.0
apexcharts: 4.5.0
argon2: 0.43.1
async: 3.2.6
async-mutex: 0.5.0
axios: 1.11.0
axios-cache-interceptor: 1.8.0
base-64: 1.0.0
boxen: 8.0.1
busboy: 1.6.0
bytes: 3.1.2
camelcase: 8.0.0
caret-pos: 2.0.0
chalk: 5.4.1
chokidar: 4.0.3
chroma-js: 3.1.2
codemirror: 5.65.18
color: 5.0.0
commander: 14.0.0
content-disposition: 0.5.4
cookie: 1.0.2
cookie-parser: 1.4.7
copyfiles: 2.4.1
cors: 2.8.5
cron-parser: 4.9.0
cropperjs: 1.6.2
date-fns: 4.1.0
decamelize: 6.0.0
deep-diff: 1.0.2
destroy: 1.2.0
diacritics: 1.3.0
diff: 7.0.0
dompurify: 3.2.6
dotenv: 17.2.1
editorjs-toggle-block: 0.3.16
encodeurl: 2.0.0
esbuild: 0.25.8
esbuild-plugin-replace: 1.4.0
esbuild-yaml: 3.0.3
escape-string-regexp: 5.0.0
eslint: 9.32.0
eslint-config-prettier: 10.1.8
eslint-plugin-vue: 10.4.0
eventemitter2: 6.4.9
execa: 9.6.0
exif-reader: 2.0.2
express: 4.21.2
file-saver: 2.0.5
find-cache-directory: 6.0.0
flat: 6.0.1
flatpickr: 4.6.13
focus-trap: 7.6.5
form-data: 4.0.4
fs-extra: 11.3.0
geojson: 0.5.0
get-port: 7.1.0
glob-to-regexp: 0.4.1
globals: 16.3.0
graphql: 16.11.0
graphql-compose: 9.1.0
graphql-ws: 6.0.6
happy-dom: 18.0.1
helmet: 8.1.0
histoire: 0.17.17
html-entities: 2.6.0
icc: 3.0.0
inquirer: 12.9.0
ioredis: 5.7.0
ip-matching: 2.1.2
isolated-vm: 5.0.3
joi: 17.13.3
js-yaml: 4.1.0
js2xmlparser: 5.0.0
json-to-graphql-query: 2.3.0
json2csv: 5.0.7
jsonlint-mod: 1.7.6
jsonwebtoken: 9.0.2
keyv: 5.4.0
knex: 3.1.0
knex-mock-client: 3.0.2
ky: 1.8.2
ldapjs: 2.3.3
liquidjs: 10.21.1
lodash: 4.17.21
lodash-es: 4.17.21
log-symbols: 7.0.1
lru-cache: 11.1.0
mapbox-gl: 1.13.3
maplibre-gl: 1.15.3
marked: 16.1.1
micromustache: 8.0.3
mime: 4.0.7
mime-types: 3.0.1
minimatch: 10.0.3
mitt: 3.0.1
mnemonist: 0.40.3
ms: 2.1.3
mysql2: 3.14.3
nanoid: 5.1.5
node-machine-id: 1.1.12
node-schedule: 2.1.1
nodemailer: 7.0.5
nodemailer-mailgun-transport: 2.1.5
npm-watch: 0.13.0
object-hash: 3.0.0
ofetch: 1.4.1
openapi3-ts: 4.5.0
openid-client: 5.7.1
ora: 8.2.0
oracledb: 6.9.0
otplib: 12.0.1
p-limit: 6.2.0
p-queue: 8.1.0
papaparse: 5.5.3
pg: 8.16.3
pinia: 2.3.1
pino: 9.7.0
pino-http: 10.5.0
pino-http-print: 3.1.0
pino-pretty: 13.1.1
pm2: 6.0.8
postcss-html: 1.8.0
prettier: 3.6.2
pretty-ms: 9.2.0
prom-client: 15.1.3
proxy-addr: 2.0.7
qrcode: 1.5.4
qs: 6.14.0
rate-limiter-flexible: 7.2.0
rimraf: 6.0.1
rolldown: 1.0.0-beta.30
rollup: 4.46.2
rollup-plugin-esbuild: 6.2.1
rollup-plugin-node-externals: 8.0.1
rollup-plugin-styler: 2.0.0
samlify: 2.10.1
sanitize-html: 2.17.0
sass-embedded: 1.89.2
semver: 7.7.2
sharp: 0.34.3
snappy: 7.3.0
sqlite3: 5.1.7
stream-json: 1.9.1
string-width: 7.2.0
strip-ansi: 7.1.0
stylelint: 16.23.0
stylelint-config-standard: 39.0.0
stylelint-config-standard-scss: 15.0.1
stylelint-config-standard-vue: 1.0.0
stylelint-use-logical: 2.1.2
swagger-cli: 4.0.4
swagger-ui-watcher: 2.1.14
tar: 7.4.3
tedious: 18.6.1
tinymce: 6.8.5
tmp: 0.2.3
tsup: 8.5.0
tsx: 4.20.3
tus-js-client: 4.3.1
typescript: 5.8.3
typescript-eslint: 8.38.0
undici: 7.13.0
update-check: 1.5.4
vite: 7.0.6
uuid: 11.1.0
vite: 5.4.19
vite-plugin-dts: 4.5.4
vite-plugin-vue-devtools: 7.7.2
vitest: 3.2.4
vue: 3.5.18
vue-i18n: 11.1.11
vue-router: 4.5.1
vue-tsc: 3.0.5
vue-virtual-scroller: 2.0.0-beta.8
vuedraggable: 4.1.0
wellknown: 0.5.0
ws: 8.18.3
zod: 4.0.14
zod-validation-error: 4.0.1
catalogMode: strict