feat: update mantine, prisma, etc.

This commit is contained in:
diced 2025-05-06 00:17:53 -07:00
parent 8b9303ed80
commit 90aef3dce1
No known key found for this signature in database
GPG key ID: 436B2B0FA0DCA354
30 changed files with 1645 additions and 1394 deletions

View file

@ -5,3 +5,4 @@ node_modules
uploads*
.env
.eslintcache
generated

1
.gitignore vendored
View file

@ -46,3 +46,4 @@ next-env.d.ts
uploads*/
*.crt
*.key
generated

View file

@ -3,9 +3,7 @@ FROM node:22-alpine3.21 AS base
ENV PNPM_HOME="/pnpm"
ENV PATH="$PNPM_HOME:$PATH"
RUN npm install -g corepack
RUN corepack enable pnpm
RUN corepack prepare pnpm@latest --activate
RUN corepack enable
RUN apk add --no-cache ffmpeg tzdata
@ -42,6 +40,7 @@ COPY --from=builder /zipline/.next ./.next
COPY --from=builder /zipline/mimes.json ./mimes.json
COPY --from=builder /zipline/code.json ./code.json
COPY --from=builder /zipline/generated ./generated
RUN pnpm build:prisma

View file

@ -17,98 +17,101 @@
"validate:lint": "eslint --cache --fix .",
"validate:format": "prettier --write --ignore-path .gitignore .",
"db:prototype": "prisma db push --skip-generate && prisma generate --no-hints",
"db:migrate": "prisma migrate dev --create-only"
"db:migrate": "prisma migrate dev --create-only",
"docker:engine": "colima start --mount $PWD/themes:w --mount $PWD/uploads:w --mount $PWD/public:w",
"docker:compose:dev:up": "docker-compose --file docker-compose.dev.yml up --build -d",
"docker:compose:dev:down": "docker-compose --file docker-compose.dev.yml down",
"docker:compose:dev:logs": "docker-compose --file docker-compose.dev.yml logs -f"
},
"dependencies": {
"@aws-sdk/client-s3": "3.726.1",
"@aws-sdk/lib-storage": "3.726.1",
"@fastify/cookie": "^11.0.2",
"@fastify/cors": "^10.0.2",
"@fastify/cors": "^11.0.1",
"@fastify/multipart": "^9.0.3",
"@fastify/rate-limit": "^10.2.2",
"@fastify/sensible": "^6.0.3",
"@fastify/static": "^8.1.1",
"@github/webauthn-json": "^2.1.1",
"@mantine/charts": "^7.17.0",
"@mantine/code-highlight": "^7.17.0",
"@mantine/core": "^7.17.0",
"@mantine/dates": "^7.17.0",
"@mantine/dropzone": "^7.17.0",
"@mantine/form": "^7.17.0",
"@mantine/hooks": "^7.17.0",
"@mantine/modals": "^7.17.0",
"@mantine/notifications": "^7.17.0",
"@prisma/client": "^6.4.1",
"@prisma/internals": "^6.4.1",
"@prisma/migrate": "^6.4.1",
"@mantine/charts": "^8.0.0",
"@mantine/code-highlight": "^8.0.0",
"@mantine/core": "^8.0.0",
"@mantine/dates": "^8.0.0",
"@mantine/dropzone": "^8.0.0",
"@mantine/form": "^8.0.0",
"@mantine/hooks": "^8.0.0",
"@mantine/modals": "^8.0.0",
"@mantine/notifications": "^8.0.0",
"@prisma/client": "^6.7.0",
"@prisma/internals": "^6.7.0",
"@prisma/migrate": "^6.7.0",
"@smithy/node-http-handler": "^4.0.4",
"@tabler/icons-react": "^3.30.0",
"@tabler/icons-react": "^3.31.0",
"@xoi/gps-metadata-remover": "^1.1.2",
"argon2": "^0.41.1",
"argon2": "^0.43.0",
"bytes": "^3.1.2",
"clsx": "^2.1.1",
"colorette": "^2.0.20",
"commander": "^13.1.0",
"cross-env": "^7.0.3",
"dayjs": "^1.11.13",
"dotenv": "^16.4.7",
"express": "^4.21.2",
"dotenv": "^16.5.0",
"fast-glob": "^3.3.3",
"fastify": "^5.2.1",
"fastify": "^5.3.2",
"fastify-plugin": "^5.0.1",
"fflate": "^0.8.2",
"fluent-ffmpeg": "^2.1.3",
"highlight.js": "^11.11.1",
"iron-session": "^8.0.4",
"isomorphic-dompurify": "^2.22.0",
"katex": "^0.16.21",
"mantine-datatable": "^7.15.1",
"isomorphic-dompurify": "^2.24.0",
"katex": "^0.16.22",
"mantine-datatable": "^7.17.1",
"ms": "^2.1.3",
"multer": "1.4.5-lts.1",
"next": "^15.2.4",
"nuqs": "^2.4.1",
"multer": "1.4.5-lts.2",
"next": "^15.3.1",
"nuqs": "^2.4.3",
"otplib": "^12.0.1",
"prisma": "^6.4.1",
"prisma": "^6.7.0",
"qrcode": "^1.5.4",
"react": "^19.0.0-rc.1",
"react-dom": "^19.0.0-rc.1",
"react-markdown": "^10.0.0",
"react": "^19.1.0",
"react-dom": "^19.1.0",
"react-markdown": "^10.1.0",
"remark-gfm": "^4.0.1",
"sharp": "^0.33.5",
"swr": "^2.3.2",
"zod": "^3.24.2",
"zustand": "^5.0.3"
"sharp": "^0.34.1",
"swr": "^2.3.3",
"zod": "^3.24.4",
"zustand": "^5.0.4"
},
"devDependencies": {
"@eslint/compat": "^1.2.7",
"@eslint/eslintrc": "^3.3.0",
"@eslint/js": "^9.21.0",
"@eslint/compat": "^1.2.9",
"@eslint/eslintrc": "^3.3.1",
"@eslint/js": "^9.26.0",
"@types/bytes": "^3.1.5",
"@types/express": "^5.0.0",
"@types/express": "^5.0.1",
"@types/fluent-ffmpeg": "^2.1.27",
"@types/katex": "^0.16.7",
"@types/ms": "^2.1.0",
"@types/multer": "^1.4.12",
"@types/node": "^22.13.5",
"@types/node": "^22.15.11",
"@types/qrcode": "^1.5.5",
"@types/react": "^19.0.10",
"@types/react-dom": "^19.0.4",
"@typescript-eslint/eslint-plugin": "^8.24.1",
"@typescript-eslint/parser": "^8.24.1",
"eslint": "^9.21.0",
"eslint-config-next": "^15.1.7",
"eslint-config-prettier": "^10.0.1",
"eslint-plugin-prettier": "^5.2.3",
"@types/react": "^19.1.3",
"@types/react-dom": "^19.1.3",
"@typescript-eslint/eslint-plugin": "^8.32.0",
"@typescript-eslint/parser": "^8.32.0",
"eslint": "^9.26.0",
"eslint-config-next": "^15.3.1",
"eslint-config-prettier": "^10.1.2",
"eslint-plugin-prettier": "^5.4.0",
"eslint-plugin-unused-imports": "^4.1.4",
"postcss": "^8.5.3",
"postcss-preset-mantine": "^1.17.0",
"postcss-simple-vars": "^7.0.1",
"prettier": "^3.5.2",
"sass": "^1.86.1",
"tsc-alias": "^1.8.10",
"tsup": "^8.3.6",
"tsx": "^4.19.3",
"typescript": "^5.7.3"
"prettier": "^3.5.3",
"sass": "^1.87.0",
"tsc-alias": "^1.8.16",
"tsup": "^8.4.0",
"tsx": "^4.19.4",
"typescript": "^5.8.3"
},
"engines": {
"node": ">=22"

2796
pnpm-lock.yaml generated

File diff suppressed because it is too large Load diff

View file

@ -1,5 +1,6 @@
generator client {
provider = "prisma-client-js"
output = "../generated/client"
}
datasource db {

View file

@ -3,7 +3,7 @@ import { IncompleteFile } from '@/lib/db/models/incompleteFile';
import { fetchApi } from '@/lib/fetchApi';
import { ActionIcon, Badge, Button, Card, Group, Modal, Paper, Stack, Text, Tooltip } from '@mantine/core';
import { showNotification } from '@mantine/notifications';
import { IncompleteFileStatus } from '@prisma/client';
import { IncompleteFileStatus } from '../../../../generated/client';
import { IconFileDots, IconTrashFilled } from '@tabler/icons-react';
import { parseAsBoolean, useQueryState } from 'nuqs';
import { ReactNode } from 'react';

View file

@ -14,21 +14,21 @@ const StorageGraph = dynamic(() => import('./parts/StorageGraph'));
const ViewsGraph = dynamic(() => import('./parts/ViewsGraph'));
export default function DashboardMetrics() {
const [dateRange, setDateRange] = useState<[Date | null, Date | null]>([
new Date(Date.now() - 86400000 * 7),
new Date(),
]); // default: [7 days ago, now]
const [dateRange, setDateRange] = useState<[string | null, string | null]>([
new Date(Date.now() - 86400000 * 7).toISOString(),
new Date().toISOString(),
]);
const [open, setOpen] = useState(false);
const [allTime, setAllTime] = useState(false);
const { data, isLoading } = useApiStats({
from: dateRange[0]?.toISOString() ?? undefined,
to: dateRange[1]?.toISOString() ?? undefined,
from: allTime || !dateRange[0] ? undefined : new Date(dateRange[0]).toISOString(),
to: allTime || !dateRange[1] ? undefined : new Date(dateRange[1]).toISOString(),
all: allTime,
});
const handleDateChange = (value: [Date | null, Date | null]) => {
const handleDateChange = (value: [string | null, string | null]) => {
setAllTime(false);
setDateRange(value);
};
@ -46,7 +46,7 @@ export default function DashboardMetrics() {
value={dateRange}
onChange={handleDateChange}
allowSingleDateInRange={false}
maxDate={new Date(Date.now() + 0)}
maxDate={new Date()}
/>
</Paper>
@ -69,25 +69,14 @@ export default function DashboardMetrics() {
</Button>
{!allTime ? (
<Text size='sm' c='dimmed'>
{data?.length ? (
<>
{new Date(data?.[0]?.createdAt).toLocaleDateString()}
{' to '}
{new Date(data?.[data.length - 1]?.createdAt).toLocaleDateString()}
</>
) : (
<>
{dateRange[0]?.toLocaleDateString()}{' '}
{dateRange[1] ? `to ${dateRange[1]?.toLocaleDateString()}` : ''}
</>
)}
{dateRange[0] ? new Date(dateRange[0]).toLocaleDateString() : '—'}
{dateRange[1] ? ` to ${new Date(dateRange[1]).toLocaleDateString()}` : ''}
</Text>
) : (
<Text size='sm' c='dimmed'>
All Time
</Text>
)}
{/* <Tooltip label='This may take longer than usual to load.'> */}
<Tooltip
label={!allTime ? 'This may take longer than usual to load.' : 'You are viewing all time stats.'}
>
@ -107,22 +96,18 @@ export default function DashboardMetrics() {
{isLoading ? (
<div>
<StatsCardsSkeleton />
<StatsTablesSkeleton />
</div>
) : data?.length ? (
<div>
<StatsCards data={data!} />
<StatsTables data={data!} />
<StatsCards data={data} />
<StatsTables data={data} />
<SimpleGrid mt='md' cols={{ base: 1, md: 2 }}>
<FilesUrlsCountGraph metrics={data!} />
<ViewsGraph metrics={data!} />
<FilesUrlsCountGraph metrics={data} />
<ViewsGraph metrics={data} />
</SimpleGrid>
<div>
<StorageGraph metrics={data!} />
<StorageGraph metrics={data} />
</div>
</div>
) : (

View file

@ -6,7 +6,7 @@ import { RegistrationResponseJSON } from '@github/webauthn-json/dist/types/brows
import { ActionIcon, Button, Group, Modal, Paper, Stack, Text, TextInput } from '@mantine/core';
import { modals } from '@mantine/modals';
import { notifications } from '@mantine/notifications';
import { UserPasskey } from '@prisma/client';
import { UserPasskey } from '../../../../../../generated/client';
import { IconKey, IconKeyOff, IconTrashFilled } from '@tabler/icons-react';
import { useEffect, useState } from 'react';
import { mutate } from 'swr';

View file

@ -6,7 +6,7 @@ import { useUserStore } from '@/lib/store/user';
import { darken } from '@/lib/theme/color';
import { Button, ButtonProps, Paper, SimpleGrid, Text, Title, useMantineTheme } from '@mantine/core';
import { notifications } from '@mantine/notifications';
import type { OAuthProviderType } from '@prisma/client';
import type { OAuthProviderType } from '../../../../../../generated/client';
import {
IconBrandDiscordFilled,
IconBrandGithubFilled,

View file

@ -1,5 +1,5 @@
import { log } from '@/lib/logger';
import { Prisma, PrismaClient } from '@prisma/client';
import { Prisma, PrismaClient } from '../../../generated/client';
import { userViewSchema } from './models/user';
import { metricDataSchema } from './models/metric';
import { metadataSchema } from './models/incompleteFile';

6
src/lib/db/migration/index.d.ts vendored Normal file
View file

@ -0,0 +1,6 @@
import { SchemaContext } from '@prisma/internals';
// @ts-ignore
declare module '@prisma/migrate/dist/utils/ensureDatabaseExists' {
export function ensureDatabaseExists(schemaContext: SchemaContext): Promise<boolean>;
}

View file

@ -1,15 +1,27 @@
import { Migrate } from '@prisma/migrate/dist/Migrate';
import { ensureDatabaseExists } from '@prisma/migrate/dist/utils/ensureDatabaseExists';
import { Migrate } from '@prisma/migrate';
import { log } from '@/lib/logger';
import { loadSchemaContext } from '@prisma/internals';
// @ts-ignore
import { ensureDatabaseExists } from '@prisma/migrate/dist/utils/ensureDatabaseExists';
export async function runMigrations() {
const migrate = new Migrate('./prisma/schema.prisma');
const schemaContext = await loadSchemaContext({
schemaPathFromArg: './prisma/schema.prisma',
});
const migrate = await Migrate.setup({
schemaContext,
migrationsDirPath: './prisma/migrations',
});
const logger = log('migrations');
logger.debug('running migrations...');
try {
logger.debug('ensuring database exists...');
const dbCreated = await ensureDatabaseExists('apply', './prisma/schema.prisma');
const dbCreated = await ensureDatabaseExists(schemaContext.primaryDatasource);
if (dbCreated) {
logger.info('database created');
}

View file

@ -1,13 +0,0 @@
// types for @prisma/migrate so vscode cant complain
declare module '@prisma/migrate/dist/Migrate' {
export class Migrate {
constructor(schemaPath: string);
public applyMigrations(): Promise<{ appliedMigrationNames: string[] }>;
public stop(): void;
}
}
declare module '@prisma/migrate/dist/utils/ensureDatabaseExists' {
export function ensureDatabaseExists(command: string, schemaPath: string): Promise<boolean>;
}

View file

@ -1,4 +1,4 @@
import type { Folder as PrismaFolder } from '@prisma/client';
import type { Folder as PrismaFolder } from '../../../../generated/client';
import { File, cleanFiles } from './file';
export type Folder = PrismaFolder & {

View file

@ -1,4 +1,4 @@
import { IncompleteFileStatus } from '@prisma/client';
import { IncompleteFileStatus } from '../../../../generated/client';
import { z } from 'zod';
export type IncompleteFile = {

View file

@ -1,4 +1,4 @@
import type { Invite as PrismaInvite } from '@prisma/client';
import type { Invite as PrismaInvite } from '../../../../generated/client';
import type { User } from './user';
export type Invite = PrismaInvite & {

View file

@ -1,4 +1,4 @@
import type { Url as PrismaUrl } from '@prisma/client';
import type { Url as PrismaUrl } from '../../../../generated/client';
export type Url = PrismaUrl & {
similarity?: number;

View file

@ -1,4 +1,4 @@
import { OAuthProvider, UserPasskey, UserQuota } from '@prisma/client';
import { OAuthProvider, UserPasskey, UserQuota } from '../../../../generated/client';
import { z } from 'zod';
export type User = {

View file

@ -1,4 +1,4 @@
import { Prisma } from '@prisma/client';
import { Prisma } from '../../../generated/client';
import { config } from '../config';
import { decryptToken } from '../crypto';
import { prisma } from '../db';

View file

@ -1,4 +1,4 @@
import type { OAuthProviderType } from '@prisma/client';
import type { OAuthProviderType } from '../../../generated/client';
import { User } from '../db/models/user';
export function findProvider(

View file

@ -1,4 +1,4 @@
import type { Role } from '@prisma/client';
import type { Role } from '../../generated/client';
export function isAdministrator(role?: Role) {
return role === 'ADMIN' || role === 'SUPERADMIN';

View file

@ -3,7 +3,7 @@ import { createToken, decrypt } from '@/lib/crypto';
import { prisma } from '@/lib/db';
import Logger, { log } from '@/lib/logger';
import { findProvider } from '@/lib/oauth/providerUtil';
import { OAuthProviderType, User } from '@prisma/client';
import { OAuthProviderType, User } from '../../../generated/client';
import { FastifyInstance, FastifyReply, FastifyRequest } from 'fastify';
import fastifyPlugin from 'fastify-plugin';
import { getSession, saveSession } from '../session';

View file

@ -1,6 +1,6 @@
import { log } from '@/lib/logger';
import fastifyPlugin from 'fastify-plugin';
import { OAuthProvider, OAuthProviderType } from '@prisma/client';
import { OAuthProvider, OAuthProviderType } from '../../../../../../generated/client';
import { userMiddleware } from '@/server/middleware/user';
import { prisma } from '@/lib/db';

View file

@ -3,7 +3,7 @@ import { datasource } from '@/lib/datasource';
import { prisma } from '@/lib/db';
import { log } from '@/lib/logger';
import { userMiddleware } from '@/server/middleware/user';
import { Export } from '@prisma/client';
import { Export } from '../../../../../generated/client';
import fastifyPlugin from 'fastify-plugin';
import { Zip, ZipPassThrough } from 'fflate';
import { createWriteStream } from 'fs';

View file

@ -2,7 +2,7 @@ import { prisma } from '@/lib/db';
import { File, cleanFiles, fileSelect } from '@/lib/db/models/file';
import { canInteract } from '@/lib/role';
import { userMiddleware } from '@/server/middleware/user';
import { Prisma } from '@prisma/client';
import { Prisma } from '../../../../../../generated/client';
import fastifyPlugin from 'fastify-plugin';
import { z } from 'zod';

View file

@ -1,5 +1,5 @@
import { RegistrationResponseJSON } from '@github/webauthn-json/dist/types/browser-ponyfill';
import { Prisma } from '@prisma/client';
import { Prisma } from '../../../../../../generated/client';
import { config } from '@/lib/config';
import { prisma } from '@/lib/db';
import { User } from '@/lib/db/models/user';

View file

@ -7,7 +7,7 @@ import { log } from '@/lib/logger';
import { canInteract } from '@/lib/role';
import { administratorMiddleware } from '@/server/middleware/administrator';
import { userMiddleware } from '@/server/middleware/user';
import { UserFilesQuota } from '@prisma/client';
import { UserFilesQuota } from '../../../../../generated/client';
import fastifyPlugin from 'fastify-plugin';
import { z } from 'zod';

View file

@ -6,7 +6,7 @@ import { log } from '@/lib/logger';
import { canInteract } from '@/lib/role';
import { administratorMiddleware } from '@/server/middleware/administrator';
import { userMiddleware } from '@/server/middleware/user';
import { Role } from '@prisma/client';
import { Role } from '../../../../../generated/client';
import fastifyPlugin from 'fastify-plugin';
import { readFile } from 'fs/promises';
import { z } from 'zod';

View file

@ -15,7 +15,7 @@
"jsx": "preserve",
"incremental": true,
"paths": {
"@/*": ["./src/*"]
"@/*": ["./src/*", "./generated/*"],
}
},
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "src/client/mount.js"],