diff --git a/frontend/.prettierignore b/frontend/.prettierignore new file mode 100644 index 0000000..9be3fbf --- /dev/null +++ b/frontend/.prettierignore @@ -0,0 +1,3 @@ +node_modules +dist +pnpm-lock.yaml diff --git a/frontend/.prettierrc.json b/frontend/.prettierrc.json new file mode 100644 index 0000000..e4525d4 --- /dev/null +++ b/frontend/.prettierrc.json @@ -0,0 +1,8 @@ +{ + "printWidth": 110, + "singleQuote": true, + "trailingComma": "all", + "semi": false, + "arrowParens": "always", + "plugins": ["prettier-plugin-organize-imports"] +} diff --git a/frontend/components.json b/frontend/components.json index 238f2a6..4460d61 100644 --- a/frontend/components.json +++ b/frontend/components.json @@ -10,10 +10,10 @@ "cssVariables": true }, "aliases": { - "components": "@/components", - "utils": "@/lib/utils", - "ui": "@/components/ui", - "lib": "@/lib", - "hooks": "@/hooks" + "components": "~/components", + "utils": "~/lib/utils", + "ui": "~/components/ui", + "lib": "~/lib", + "hooks": "~/hooks" } } diff --git a/frontend/package.json b/frontend/package.json index 92bc6bb..dbb1528 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -12,7 +12,9 @@ "dev": "vite", "build": "tsc -b && vite build", "preview": "vite preview", - "typecheck": "tsc -b --noEmit" + "typecheck": "tsc -b --noEmit", + "format": "prettier --ignore-unknown --write .", + "format:check": "prettier --check ." }, "dependencies": { "@radix-ui/react-dropdown-menu": "2.1.16", @@ -40,6 +42,8 @@ "@types/react": "18.3.28", "@types/react-dom": "18.3.7", "@vitejs/plugin-react": "4.7.0", + "prettier": "3.8.3", + "prettier-plugin-organize-imports": "4.3.0", "tailwindcss": "4.1.16", "typescript": "5.9.3", "vite": "6.4.2" diff --git a/frontend/src/components/layout/footer.tsx b/frontend/src/components/layout/footer.tsx index 498ff77..349b98c 100644 --- a/frontend/src/components/layout/footer.tsx +++ b/frontend/src/components/layout/footer.tsx @@ -1,4 +1,4 @@ -import type { Globals, Menu } from '@/lib/types' +import type { Globals, Menu } from '~/lib/types' type Props = { globals: Globals diff --git a/frontend/src/components/layout/header.tsx b/frontend/src/components/layout/header.tsx index ac13a25..aa69bc2 100644 --- a/frontend/src/components/layout/header.tsx +++ b/frontend/src/components/layout/header.tsx @@ -1,5 +1,5 @@ import { Link } from '@tanstack/react-router' -import type { Globals, Menu } from '@/lib/types' +import type { Globals, Menu } from '~/lib/types' import { ThemeToggle } from './theme-toggle' type Props = { diff --git a/frontend/src/components/layout/shell.tsx b/frontend/src/components/layout/shell.tsx index 4b2b121..6092f4e 100644 --- a/frontend/src/components/layout/shell.tsx +++ b/frontend/src/components/layout/shell.tsx @@ -1,7 +1,7 @@ import { useSuspenseQuery } from '@tanstack/react-query' -import { globalsQuery, menusQuery } from '@/lib/queries' -import { Header } from './header' +import { globalsQuery, menusQuery } from '~/lib/queries' import { Footer } from './footer' +import { Header } from './header' export function Shell({ children }: { children: React.ReactNode }) { const { data: globals } = useSuspenseQuery(globalsQuery) diff --git a/frontend/src/components/layout/theme-toggle.tsx b/frontend/src/components/layout/theme-toggle.tsx index 7b80fc5..4fdacb6 100644 --- a/frontend/src/components/layout/theme-toggle.tsx +++ b/frontend/src/components/layout/theme-toggle.tsx @@ -1,6 +1,6 @@ import { Moon, Sun } from 'lucide-react' -import { Button } from '@/components/ui/button' -import { useTheme } from '@/components/theme-provider' +import { useTheme } from '~/components/theme-provider' +import { Button } from '~/components/ui/button' export function ThemeToggle() { const { theme, toggle } = useTheme() diff --git a/frontend/src/components/ui/alert.tsx b/frontend/src/components/ui/alert.tsx index 214bc59..1945911 100644 --- a/frontend/src/components/ui/alert.tsx +++ b/frontend/src/components/ui/alert.tsx @@ -1,6 +1,6 @@ -import * as React from 'react' import { cva, type VariantProps } from 'class-variance-authority' -import { cn } from '@/lib/utils' +import * as React from 'react' +import { cn } from '~/lib/utils' const alertVariants = cva( 'relative w-full rounded-lg border px-4 py-3 text-sm [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground [&>svg~*]:pl-7', @@ -32,9 +32,10 @@ export const AlertTitle = React.forwardRef>( - ({ className, ...props }, ref) => ( -
- ), -) +export const AlertDescription = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) AlertDescription.displayName = 'AlertDescription' diff --git a/frontend/src/components/ui/button.tsx b/frontend/src/components/ui/button.tsx index 98f6256..3c732b4 100644 --- a/frontend/src/components/ui/button.tsx +++ b/frontend/src/components/ui/button.tsx @@ -1,7 +1,7 @@ -import * as React from 'react' import { Slot } from '@radix-ui/react-slot' import { cva, type VariantProps } from 'class-variance-authority' -import { cn } from '@/lib/utils' +import * as React from 'react' +import { cn } from '~/lib/utils' const buttonVariants = cva( 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0', @@ -30,8 +30,7 @@ const buttonVariants = cva( ) export interface ButtonProps - extends React.ButtonHTMLAttributes, - VariantProps { + extends React.ButtonHTMLAttributes, VariantProps { asChild?: boolean } diff --git a/frontend/src/components/ui/card.tsx b/frontend/src/components/ui/card.tsx index 3eab449..250b469 100644 --- a/frontend/src/components/ui/card.tsx +++ b/frontend/src/components/ui/card.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import { cn } from '@/lib/utils' +import { cn } from '~/lib/utils' export const Card = React.forwardRef>( ({ className, ...props }, ref) => ( diff --git a/frontend/src/components/ui/dropdown-menu.tsx b/frontend/src/components/ui/dropdown-menu.tsx index 04aa398..a416501 100644 --- a/frontend/src/components/ui/dropdown-menu.tsx +++ b/frontend/src/components/ui/dropdown-menu.tsx @@ -1,7 +1,7 @@ -import * as React from 'react' import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu' import { Check } from 'lucide-react' -import { cn } from '@/lib/utils' +import * as React from 'react' +import { cn } from '~/lib/utils' export const DropdownMenu = DropdownMenuPrimitive.Root export const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger @@ -86,6 +86,10 @@ export const DropdownMenuSeparator = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, ...props }, ref) => ( - + )) DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName diff --git a/frontend/src/components/ui/input.tsx b/frontend/src/components/ui/input.tsx index 3d21ed8..088a490 100644 --- a/frontend/src/components/ui/input.tsx +++ b/frontend/src/components/ui/input.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import { cn } from '@/lib/utils' +import { cn } from '~/lib/utils' export const Input = React.forwardRef>( ({ className, type, ...props }, ref) => { diff --git a/frontend/src/components/ui/separator.tsx b/frontend/src/components/ui/separator.tsx index d9fb149..a18c6f0 100644 --- a/frontend/src/components/ui/separator.tsx +++ b/frontend/src/components/ui/separator.tsx @@ -1,6 +1,6 @@ -import * as React from 'react' import * as SeparatorPrimitive from '@radix-ui/react-separator' -import { cn } from '@/lib/utils' +import * as React from 'react' +import { cn } from '~/lib/utils' export const Separator = React.forwardRef< React.ElementRef, diff --git a/frontend/src/components/ui/skeleton.tsx b/frontend/src/components/ui/skeleton.tsx index 0c131d4..690d487 100644 --- a/frontend/src/components/ui/skeleton.tsx +++ b/frontend/src/components/ui/skeleton.tsx @@ -1,4 +1,4 @@ -import { cn } from '@/lib/utils' +import { cn } from '~/lib/utils' export function Skeleton({ className, ...props }: React.HTMLAttributes) { return
diff --git a/frontend/src/index.css b/frontend/src/index.css index c21b248..f4a0c7c 100644 --- a/frontend/src/index.css +++ b/frontend/src/index.css @@ -80,7 +80,12 @@ body { @apply bg-background text-foreground; margin: 0; - font-family: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; + font-family: + system-ui, + -apple-system, + 'Segoe UI', + Roboto, + sans-serif; } } diff --git a/frontend/src/lib/directus.ts b/frontend/src/lib/directus.ts index e24c692..8e612bb 100644 --- a/frontend/src/lib/directus.ts +++ b/frontend/src/lib/directus.ts @@ -31,7 +31,10 @@ function buildUrl(collection: string, q: DirectusQuery = {}): string { return url.toString() } -export async function directusList(collection: string, q: DirectusQuery = {}): Promise> { +export async function directusList( + collection: string, + q: DirectusQuery = {}, +): Promise> { const res = await fetch(buildUrl(collection, q)) if (!res.ok) throw new Error(`Directus error ${res.status} on /items/${collection}`) return (await res.json()) as DirectusListResponse diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx index 4e84cc8..4fdbfd6 100644 --- a/frontend/src/main.tsx +++ b/frontend/src/main.tsx @@ -1,9 +1,9 @@ -import { StrictMode } from 'react' -import { createRoot } from 'react-dom/client' import { QueryClient, QueryClientProvider } from '@tanstack/react-query' import { RouterProvider, createRouter } from '@tanstack/react-router' +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' import { HelmetProvider } from 'react-helmet-async' -import { routeTree } from '@generated/tanstack-router/routeTree.gen' +import { routeTree } from '~generated/tanstack-router/routeTree.gen' import { ThemeProvider } from './components/theme-provider' import './index.css' diff --git a/frontend/src/routes/$slug.tsx b/frontend/src/routes/$slug.tsx index 5c083b0..29a4709 100644 --- a/frontend/src/routes/$slug.tsx +++ b/frontend/src/routes/$slug.tsx @@ -1,8 +1,8 @@ -import { createFileRoute, notFound } from '@tanstack/react-router' import { useSuspenseQuery } from '@tanstack/react-query' +import { createFileRoute, notFound } from '@tanstack/react-router' import { Helmet } from 'react-helmet-async' -import { pageBySlugQuery } from '@/lib/queries' -import { PageView } from '@/components/page-view' +import { PageView } from '~/components/page-view' +import { pageBySlugQuery } from '~/lib/queries' export const Route = createFileRoute('/$slug')({ loader: async ({ context: { queryClient }, params: { slug } }) => { diff --git a/frontend/src/routes/__root.tsx b/frontend/src/routes/__root.tsx index 8ae33fe..4d3f49f 100644 --- a/frontend/src/routes/__root.tsx +++ b/frontend/src/routes/__root.tsx @@ -1,22 +1,18 @@ -import { Outlet, createRootRouteWithContext } from '@tanstack/react-router' import type { QueryClient } from '@tanstack/react-query' +import { useSuspenseQuery } from '@tanstack/react-query' +import { createRootRouteWithContext, Outlet } from '@tanstack/react-router' import { lazy, Suspense } from 'react' import { Helmet } from 'react-helmet-async' -import { useSuspenseQuery } from '@tanstack/react-query' -import { globalsQuery, menusQuery } from '@/lib/queries' -import { Shell } from '@/components/layout/shell' +import { Shell } from '~/components/layout/shell' +import { globalsQuery, menusQuery } from '~/lib/queries' const TanStackRouterDevtools = import.meta.env.PROD ? () => null - : lazy(() => - import('@tanstack/react-router-devtools').then((m) => ({ default: m.TanStackRouterDevtools })), - ) + : lazy(() => import('@tanstack/react-router-devtools').then((m) => ({ default: m.TanStackRouterDevtools }))) const ReactQueryDevtools = import.meta.env.PROD ? () => null - : lazy(() => - import('@tanstack/react-query-devtools').then((m) => ({ default: m.ReactQueryDevtools })), - ) + : lazy(() => import('@tanstack/react-query-devtools').then((m) => ({ default: m.ReactQueryDevtools }))) export const Route = createRootRouteWithContext<{ queryClient: QueryClient }>()({ loader: async ({ context: { queryClient } }) => { diff --git a/frontend/src/routes/index.tsx b/frontend/src/routes/index.tsx index 3bc8928..51d2e7d 100644 --- a/frontend/src/routes/index.tsx +++ b/frontend/src/routes/index.tsx @@ -1,7 +1,7 @@ -import { createFileRoute } from '@tanstack/react-router' import { useSuspenseQuery } from '@tanstack/react-query' -import { pageBySlugQuery } from '@/lib/queries' -import { PageView } from '@/components/page-view' +import { createFileRoute } from '@tanstack/react-router' +import { PageView } from '~/components/page-view' +import { pageBySlugQuery } from '~/lib/queries' export const Route = createFileRoute('/')({ loader: async ({ context: { queryClient } }) => { diff --git a/frontend/tsconfig.app.json b/frontend/tsconfig.app.json index e2b6f9b..1f981f9 100644 --- a/frontend/tsconfig.app.json +++ b/frontend/tsconfig.app.json @@ -19,8 +19,8 @@ "noFallthroughCasesInSwitch": true, "baseUrl": ".", "paths": { - "@/*": ["src/*"], - "@generated/*": ["node_modules/.cache/*"] + "~/*": ["src/*"], + "~generated/*": ["node_modules/.cache/*"] } }, "include": ["src", "node_modules/.cache/tanstack-router/routeTree.gen.ts"] diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json index 1ffef60..d32ff68 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -1,7 +1,4 @@ { "files": [], - "references": [ - { "path": "./tsconfig.app.json" }, - { "path": "./tsconfig.node.json" } - ] + "references": [{ "path": "./tsconfig.app.json" }, { "path": "./tsconfig.node.json" }] } diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index 971b199..c6d494f 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -1,8 +1,8 @@ -import path from 'node:path' -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' import { TanStackRouterVite } from '@tanstack/router-plugin/vite' +import react from '@vitejs/plugin-react' +import path from 'node:path' +import { defineConfig } from 'vite' export default defineConfig({ plugins: [ @@ -17,8 +17,8 @@ export default defineConfig({ ], resolve: { alias: { - '@': path.resolve(__dirname, './src'), - '@generated': path.resolve(__dirname, './node_modules/.cache'), + '~': path.resolve(__dirname, './src'), + '~generated': path.resolve(__dirname, './node_modules/.cache'), }, }, server: { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4fae1ac..7f2ff97 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -96,6 +96,12 @@ importers: '@vitejs/plugin-react': specifier: 4.7.0 version: 4.7.0(vite@6.4.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3)) + prettier: + specifier: 3.8.3 + version: 3.8.3 + prettier-plugin-organize-imports: + specifier: 4.3.0 + version: 4.3.0(prettier@3.8.3)(typescript@5.9.3) tailwindcss: specifier: 4.1.16 version: 4.1.16 @@ -6721,6 +6727,16 @@ packages: deprecated: No longer maintained. Please contact the author of the relevant native addon; alternatives are available. hasBin: true + prettier-plugin-organize-imports@4.3.0: + resolution: {integrity: sha512-FxFz0qFhyBsGdIsb697f/EkvHzi5SZOhWAjxcx2dLt+Q532bAlhswcXGYB1yzjZ69kW8UoadFBw7TyNwlq96Iw==} + peerDependencies: + prettier: '>=2.0' + typescript: '>=2.9' + vue-tsc: ^2.1.0 || 3 + peerDependenciesMeta: + vue-tsc: + optional: true + prettier@3.8.3: resolution: {integrity: sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==} engines: {node: '>=14'} @@ -8991,14 +9007,14 @@ snapshots: '@directus/constants': 14.3.0 '@directus/env': 5.7.1(vue@3.5.24(typescript@5.9.3)) '@directus/errors': 2.3.1 - '@directus/extensions': 3.0.24(deep-diff@1.0.2)(express@4.21.2)(graphql@16.12.0)(knex@3.1.0(mysql2@3.15.3)(pg@8.16.3)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1)))(mysql2@3.15.3)(nodemailer@8.0.5)(openapi3-ts@4.5.0)(pg@8.16.3)(pino@9.7.0)(sharp@0.34.5)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1))(vue@3.5.24(typescript@5.9.3))(ws@8.18.3) - '@directus/extensions-registry': 3.0.25(deep-diff@1.0.2)(express@4.21.2)(graphql@16.12.0)(knex@3.1.0(mysql2@3.15.3)(pg@8.16.3)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1)))(mysql2@3.15.3)(nodemailer@8.0.5)(openapi3-ts@4.5.0)(pg@8.16.3)(pino@9.7.0)(sharp@0.34.5)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1))(vue@3.5.24(typescript@5.9.3))(ws@8.18.3) - '@directus/extensions-sdk': 17.1.3(@types/node@22.19.17)(@unhead/vue@1.11.20(vue@3.5.24(typescript@5.9.3)))(deep-diff@1.0.2)(express@4.21.2)(graphql@16.12.0)(jiti@2.6.1)(knex@3.1.0(mysql2@3.15.3)(pg@8.16.3)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1)))(mysql2@3.15.3)(nodemailer@8.0.5)(openapi3-ts@4.5.0)(pg@8.16.3)(pinia@2.3.1(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)))(pino@9.7.0)(sharp@0.34.5)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1))(terser@5.46.2)(tsx@4.20.6)(typescript@5.9.3)(ws@8.18.3)(yaml@2.8.3) + '@directus/extensions': 3.0.24(deep-diff@1.0.2)(express@4.21.2)(graphql@16.12.0)(knex@3.1.0(pg@8.16.3)(sqlite3@6.0.1))(mysql2@3.15.3)(nodemailer@8.0.5)(openapi3-ts@4.5.0)(pg@8.16.3)(pino@9.7.0)(sharp@0.34.5)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1))(vue@3.5.24(typescript@5.9.3))(ws@8.18.3) + '@directus/extensions-registry': 3.0.25(deep-diff@1.0.2)(express@4.21.2)(graphql@16.12.0)(knex@3.1.0(pg@8.16.3)(sqlite3@6.0.1))(mysql2@3.15.3)(nodemailer@8.0.5)(openapi3-ts@4.5.0)(pg@8.16.3)(pino@9.7.0)(sharp@0.34.5)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1))(vue@3.5.24(typescript@5.9.3))(ws@8.18.3) + '@directus/extensions-sdk': 17.1.3(@types/node@22.19.17)(@unhead/vue@1.11.20(vue@3.5.24(typescript@5.9.3)))(deep-diff@1.0.2)(express@4.21.2)(graphql@16.12.0)(jiti@2.6.1)(knex@3.1.0(pg@8.16.3)(sqlite3@6.0.1))(mysql2@3.15.3)(nodemailer@8.0.5)(openapi3-ts@4.5.0)(pg@8.16.3)(pinia@2.3.1(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)))(pino@9.7.0)(sharp@0.34.5)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1))(terser@5.46.2)(tsx@4.20.6)(typescript@5.9.3)(ws@8.18.3)(yaml@2.8.3) '@directus/format-title': 12.1.2 '@directus/memory': 3.1.7(vue@3.5.24(typescript@5.9.3)) '@directus/pressure': 3.0.21(vue@3.5.24(typescript@5.9.3)) '@directus/schema': 13.0.8(mysql2@3.15.3)(pg@8.16.3)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1)) - '@directus/schema-builder': 0.0.19(deep-diff@1.0.2)(express@4.21.2)(graphql@16.12.0)(knex@3.1.0(mysql2@3.15.3)(pg@8.16.3)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1)))(mysql2@3.15.3)(nodemailer@8.0.5)(openapi3-ts@4.5.0)(pg@8.16.3)(pino@9.7.0)(sharp@0.34.5)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1))(vue@3.5.24(typescript@5.9.3))(ws@8.18.3) + '@directus/schema-builder': 0.0.19(deep-diff@1.0.2)(express@4.21.2)(graphql@16.12.0)(knex@3.1.0(pg@8.16.3)(sqlite3@6.0.1))(mysql2@3.15.3)(nodemailer@8.0.5)(openapi3-ts@4.5.0)(pg@8.16.3)(pino@9.7.0)(sharp@0.34.5)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1))(vue@3.5.24(typescript@5.9.3))(ws@8.18.3) '@directus/specs': 13.0.0 '@directus/storage': 12.0.4 '@directus/storage-driver-azure': 12.0.21(vue@3.5.24(typescript@5.9.3)) @@ -9252,11 +9268,11 @@ snapshots: '@directus/storage': 12.0.4 ms: 2.1.3 - '@directus/extensions-registry@3.0.25(deep-diff@1.0.2)(express@4.21.2)(graphql@16.12.0)(knex@3.1.0(mysql2@3.15.3)(pg@8.16.3)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1)))(mysql2@3.15.3)(nodemailer@8.0.5)(openapi3-ts@4.5.0)(pg@8.16.3)(pino@9.7.0)(sharp@0.34.5)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1))(vue@3.5.24(typescript@5.9.3))(ws@8.18.3)': + '@directus/extensions-registry@3.0.25(deep-diff@1.0.2)(express@4.21.2)(graphql@16.12.0)(knex@3.1.0(pg@8.16.3)(sqlite3@6.0.1))(mysql2@3.15.3)(nodemailer@8.0.5)(openapi3-ts@4.5.0)(pg@8.16.3)(pino@9.7.0)(sharp@0.34.5)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1))(vue@3.5.24(typescript@5.9.3))(ws@8.18.3)': dependencies: '@directus/constants': 14.3.0 '@directus/errors': 2.3.1 - '@directus/extensions': 3.0.24(deep-diff@1.0.2)(express@4.21.2)(graphql@16.12.0)(knex@3.1.0(mysql2@3.15.3)(pg@8.16.3)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1)))(mysql2@3.15.3)(nodemailer@8.0.5)(openapi3-ts@4.5.0)(pg@8.16.3)(pino@9.7.0)(sharp@0.34.5)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1))(vue@3.5.24(typescript@5.9.3))(ws@8.18.3) + '@directus/extensions': 3.0.24(deep-diff@1.0.2)(express@4.21.2)(graphql@16.12.0)(knex@3.1.0(pg@8.16.3)(sqlite3@6.0.1))(mysql2@3.15.3)(nodemailer@8.0.5)(openapi3-ts@4.5.0)(pg@8.16.3)(pino@9.7.0)(sharp@0.34.5)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1))(vue@3.5.24(typescript@5.9.3))(ws@8.18.3) ky: 1.14.0 zod: 4.1.12 transitivePeerDependencies: @@ -9281,13 +9297,13 @@ snapshots: - vue-router - ws - '@directus/extensions-sdk@17.1.3(@types/node@22.19.17)(@unhead/vue@1.11.20(vue@3.5.24(typescript@5.9.3)))(deep-diff@1.0.2)(express@4.21.2)(graphql@16.12.0)(jiti@2.6.1)(knex@3.1.0(mysql2@3.15.3)(pg@8.16.3)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1)))(mysql2@3.15.3)(nodemailer@8.0.5)(openapi3-ts@4.5.0)(pg@8.16.3)(pinia@2.3.1(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)))(pino@9.7.0)(sharp@0.34.5)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1))(terser@5.46.2)(tsx@4.20.6)(typescript@5.9.3)(ws@8.18.3)(yaml@2.8.3)': + '@directus/extensions-sdk@17.1.3(@types/node@22.19.17)(@unhead/vue@1.11.20(vue@3.5.24(typescript@5.9.3)))(deep-diff@1.0.2)(express@4.21.2)(graphql@16.12.0)(jiti@2.6.1)(knex@3.1.0(pg@8.16.3)(sqlite3@6.0.1))(mysql2@3.15.3)(nodemailer@8.0.5)(openapi3-ts@4.5.0)(pg@8.16.3)(pinia@2.3.1(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)))(pino@9.7.0)(sharp@0.34.5)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1))(terser@5.46.2)(tsx@4.20.6)(typescript@5.9.3)(ws@8.18.3)(yaml@2.8.3)': dependencies: '@directus/composables': 11.4.0(vue@3.5.24(typescript@5.9.3)) '@directus/constants': 14.3.0 - '@directus/extensions': 3.0.24(deep-diff@1.0.2)(express@4.21.2)(graphql@16.12.0)(knex@3.1.0(mysql2@3.15.3)(pg@8.16.3)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1)))(mysql2@3.15.3)(nodemailer@8.0.5)(openapi3-ts@4.5.0)(pg@8.16.3)(pino@9.7.0)(sharp@0.34.5)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1))(vue@3.5.24(typescript@5.9.3))(ws@8.18.3) + '@directus/extensions': 3.0.24(deep-diff@1.0.2)(express@4.21.2)(graphql@16.12.0)(knex@3.1.0(pg@8.16.3)(sqlite3@6.0.1))(mysql2@3.15.3)(nodemailer@8.0.5)(openapi3-ts@4.5.0)(pg@8.16.3)(pino@9.7.0)(sharp@0.34.5)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1))(vue@3.5.24(typescript@5.9.3))(ws@8.18.3) '@directus/themes': 1.3.2(@unhead/vue@1.11.20(vue@3.5.24(typescript@5.9.3)))(pinia@2.3.1(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)))(vue@3.5.24(typescript@5.9.3)) - '@directus/types': 15.0.2(deep-diff@1.0.2)(express@4.21.2)(graphql@16.12.0)(knex@3.1.0(mysql2@3.15.3)(pg@8.16.3)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1)))(mysql2@3.15.3)(nodemailer@8.0.5)(openapi3-ts@4.5.0)(pg@8.16.3)(pino@9.7.0)(sharp@0.34.5)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1))(vue@3.5.24(typescript@5.9.3))(ws@8.18.3) + '@directus/types': 15.0.2(deep-diff@1.0.2)(express@4.21.2)(graphql@16.12.0)(knex@3.1.0(pg@8.16.3)(sqlite3@6.0.1))(mysql2@3.15.3)(nodemailer@8.0.5)(openapi3-ts@4.5.0)(pg@8.16.3)(pino@9.7.0)(sharp@0.34.5)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1))(vue@3.5.24(typescript@5.9.3))(ws@8.18.3) '@directus/utils': 13.4.0(vue@3.5.24(typescript@5.9.3)) '@rollup/plugin-commonjs': 28.0.9(rollup@4.59.0) '@rollup/plugin-json': 6.1.0(rollup@4.59.0) @@ -9345,10 +9361,10 @@ snapshots: - ws - yaml - '@directus/extensions@3.0.24(deep-diff@1.0.2)(express@4.21.2)(graphql@16.12.0)(knex@3.1.0(mysql2@3.15.3)(pg@8.16.3)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1)))(mysql2@3.15.3)(nodemailer@8.0.5)(openapi3-ts@4.5.0)(pg@8.16.3)(pino@9.7.0)(sharp@0.34.5)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1))(vue@3.5.24(typescript@5.9.3))(ws@8.18.3)': + '@directus/extensions@3.0.24(deep-diff@1.0.2)(express@4.21.2)(graphql@16.12.0)(knex@3.1.0(pg@8.16.3)(sqlite3@6.0.1))(mysql2@3.15.3)(nodemailer@8.0.5)(openapi3-ts@4.5.0)(pg@8.16.3)(pino@9.7.0)(sharp@0.34.5)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1))(vue@3.5.24(typescript@5.9.3))(ws@8.18.3)': dependencies: '@directus/constants': 14.3.0 - '@directus/types': 15.0.2(deep-diff@1.0.2)(express@4.21.2)(graphql@16.12.0)(knex@3.1.0(mysql2@3.15.3)(pg@8.16.3)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1)))(mysql2@3.15.3)(nodemailer@8.0.5)(openapi3-ts@4.5.0)(pg@8.16.3)(pino@9.7.0)(sharp@0.34.5)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1))(vue@3.5.24(typescript@5.9.3))(ws@8.18.3) + '@directus/types': 15.0.2(deep-diff@1.0.2)(express@4.21.2)(graphql@16.12.0)(knex@3.1.0(pg@8.16.3)(sqlite3@6.0.1))(mysql2@3.15.3)(nodemailer@8.0.5)(openapi3-ts@4.5.0)(pg@8.16.3)(pino@9.7.0)(sharp@0.34.5)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1))(vue@3.5.24(typescript@5.9.3))(ws@8.18.3) '@directus/utils': 13.4.0(vue@3.5.24(typescript@5.9.3)) '@types/express': 4.17.21 fs-extra: 11.3.2 @@ -9396,9 +9412,9 @@ snapshots: transitivePeerDependencies: - vue - '@directus/schema-builder@0.0.19(deep-diff@1.0.2)(express@4.21.2)(graphql@16.12.0)(knex@3.1.0(mysql2@3.15.3)(pg@8.16.3)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1)))(mysql2@3.15.3)(nodemailer@8.0.5)(openapi3-ts@4.5.0)(pg@8.16.3)(pino@9.7.0)(sharp@0.34.5)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1))(vue@3.5.24(typescript@5.9.3))(ws@8.18.3)': + '@directus/schema-builder@0.0.19(deep-diff@1.0.2)(express@4.21.2)(graphql@16.12.0)(knex@3.1.0(pg@8.16.3)(sqlite3@6.0.1))(mysql2@3.15.3)(nodemailer@8.0.5)(openapi3-ts@4.5.0)(pg@8.16.3)(pino@9.7.0)(sharp@0.34.5)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1))(vue@3.5.24(typescript@5.9.3))(ws@8.18.3)': dependencies: - '@directus/types': 15.0.2(deep-diff@1.0.2)(express@4.21.2)(graphql@16.12.0)(knex@3.1.0(mysql2@3.15.3)(pg@8.16.3)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1)))(mysql2@3.15.3)(nodemailer@8.0.5)(openapi3-ts@4.5.0)(pg@8.16.3)(pino@9.7.0)(sharp@0.34.5)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1))(vue@3.5.24(typescript@5.9.3))(ws@8.18.3) + '@directus/types': 15.0.2(deep-diff@1.0.2)(express@4.21.2)(graphql@16.12.0)(knex@3.1.0(pg@8.16.3)(sqlite3@6.0.1))(mysql2@3.15.3)(nodemailer@8.0.5)(openapi3-ts@4.5.0)(pg@8.16.3)(pino@9.7.0)(sharp@0.34.5)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1))(vue@3.5.24(typescript@5.9.3))(ws@8.18.3) lodash-es: 4.18.1 transitivePeerDependencies: - aws-crt @@ -9512,7 +9528,7 @@ snapshots: vue: 3.5.24(typescript@5.9.3) zod: 4.1.12 - '@directus/types@15.0.2(deep-diff@1.0.2)(express@4.21.2)(graphql@16.12.0)(knex@3.1.0(mysql2@3.15.3)(pg@8.16.3)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1)))(mysql2@3.15.3)(nodemailer@8.0.5)(openapi3-ts@4.5.0)(pg@8.16.3)(pino@9.7.0)(sharp@0.34.5)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1))(vue@3.5.24(typescript@5.9.3))(ws@8.18.3)': + '@directus/types@15.0.2(deep-diff@1.0.2)(express@4.21.2)(graphql@16.12.0)(knex@3.1.0(pg@8.16.3)(sqlite3@6.0.1))(mysql2@3.15.3)(nodemailer@8.0.5)(openapi3-ts@4.5.0)(pg@8.16.3)(pino@9.7.0)(sharp@0.34.5)(sqlite3@5.1.7)(tedious@18.6.1(@azure/core-client@1.10.1))(vue@3.5.24(typescript@5.9.3))(ws@8.18.3)': dependencies: '@directus/ai': 1.3.1 '@directus/constants': 14.3.0 @@ -15396,6 +15412,11 @@ snapshots: tar-fs: 2.1.4 tunnel-agent: 0.6.0 + prettier-plugin-organize-imports@4.3.0(prettier@3.8.3)(typescript@5.9.3): + dependencies: + prettier: 3.8.3 + typescript: 5.9.3 + prettier@3.8.3: {} pretty-ms@7.0.1: