build(deps): upgrade non-TypeScript dependencies

Keep TypeScript at 6.0.3 while moving the remaining server and client packages onto their current supported releases.

Allow the PWA asset generator 2 peer range because vite-plugin-pwa still declares the compatible version 1 range.
This commit is contained in:
neon
2026-09-30 21:37:55 +00:00
parent ef2bcced3b
commit 05a55d6b62
9 changed files with 1000 additions and 1193 deletions
+6 -6
View File
@@ -71,7 +71,7 @@
"@tiptap/starter-kit": "^3.31.3",
"@tiptap/vue-3": "^3.31.3",
"@types/howler": "^2.2.13",
"@vueuse/core": "^14.4.0",
"@vueuse/core": "^15.0.0",
"canvas-confetti": "^1.9.4",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
@@ -80,7 +80,7 @@
"driver.js": "^1.8.0",
"echarts": "^6.1.0",
"howler": "^2.2.4",
"intl-messageformat": "^11.2.15",
"intl-messageformat": "^12.1.2",
"pinia": "^4.0.3",
"reka-ui": "^2.10.5",
"socket.io-client": "^4.8.4",
@@ -101,9 +101,9 @@
"@types/canvas-confetti": "^1.9.0",
"@types/jsdom": "^30.0.0",
"@types/node": "^26.6.3",
"@vite-pwa/assets-generator": "^1.0.4",
"@vite-pwa/assets-generator": "^2.0.0",
"@vitejs/plugin-vue": "^6.0.9",
"@vitest/coverage-v8": "^4.1.11",
"@vitest/coverage-v8": "^5.0.2",
"@vitest/eslint-plugin": "^1.6.27",
"@vue/eslint-config-typescript": "^14.9.0",
"@vue/test-utils": "^2.5.1",
@@ -113,7 +113,7 @@
"eslint-plugin-oxlint": "~1.86.0",
"eslint-plugin-vue": "~10.11.1",
"jiti": "^2.7.0",
"jsdom": "~30.0.1",
"jsdom": "~30.1.1",
"npm-run-all2": "^9.0.3",
"oxlint": "~1.86.0",
"prettier": "3.9.9",
@@ -121,7 +121,7 @@
"typescript": "~6.0.3",
"vite": "^8.3.1",
"vite-plugin-vue-devtools": "^8.2.1",
"vitest": "^4.1.11",
"vitest": "^5.0.2",
"vue-tsc": "^3.3.11"
},
"engines": {
@@ -170,6 +170,7 @@ describe('PodcastEditDetailsSheet', () => {
it('uploads a chosen artwork file and emits the new versioned url', async () => {
apiMock.mockResolvedValue(jsonResponse({ id: 12, imageUrl: '/api/v1/podcasts/12/artwork?v=99', artworkUpdatedAt: '2026-07-31T00:00:00.000Z' }))
const createObjectURL = vi.spyOn(URL, 'createObjectURL').mockReturnValue('blob:podcast-artwork')
const wrapper = await mountSheet()
const input = wrapper.get('input[type="file"]')
const file = new File(['bytes'], 'artwork.png', { type: 'image/png' })
@@ -183,7 +184,10 @@ describe('PodcastEditDetailsSheet', () => {
expect(url).toBe('/api/v1/podcasts/12/artwork')
expect(init?.method).toBe('POST')
expect(init?.body).toBeInstanceOf(FormData)
expect(createObjectURL).toHaveBeenCalledWith(file)
expect(wrapper.emitted('artwork-changed')?.[0]?.[0]).toMatchObject({ artworkUpdatedAt: '2026-07-31T00:00:00.000Z' })
createObjectURL.mockRestore()
})
it('uploads artwork from a url without touching the metadata endpoint', async () => {
@@ -25,6 +25,10 @@ function installBrowserGlobals() {
addEventListener: vi.fn<() => void>(),
removeEventListener: vi.fn<() => void>(),
}) as unknown as MediaQueryList
Object.defineProperty(globalThis, 'visualViewport', {
configurable: true,
value: { scale: 1 },
})
}
describe('Foliate navigation', () => {
@@ -267,11 +271,6 @@ describe('Foliate navigation', () => {
it('still snaps ordinary paginated touch gestures', () => {
const paginator = new Paginator() as InstanceType<typeof Paginator> & EventTarget
const snap = vi.spyOn(paginator, 'snap').mockImplementation(() => {})
const originalVisualViewport = Object.getOwnPropertyDescriptor(globalThis, 'visualViewport')
Object.defineProperty(globalThis, 'visualViewport', {
configurable: true,
value: { scale: 1 },
})
const animationFrame = vi.spyOn(globalThis, 'requestAnimationFrame').mockImplementation((callback) => {
callback(0)
return 0
@@ -300,8 +299,6 @@ describe('Foliate navigation', () => {
expect(snap).toHaveBeenCalledWith(0, undefined)
animationFrame.mockRestore()
if (originalVisualViewport) Object.defineProperty(globalThis, 'visualViewport', originalVisualViewport)
else Reflect.deleteProperty(globalThis, 'visualViewport')
})
it('maps physical left and right navigation using OPF RTL page progression', async () => {
+1 -1
View File
@@ -29,7 +29,7 @@ graph LR
| Layer | Tech | Location |
| ------------ | ------------------------------- | ----------------- |
| Frontend | Vue 3, Tailwind CSS v4, Vite | `client/` |
| Backend | NestJS 11, Fastify, Drizzle ORM | `server/` |
| Backend | NestJS 12, Fastify, Drizzle ORM | `server/` |
| Database | PostgreSQL 18, pgvector | Docker container |
| Shared types | TypeScript | `packages/types/` |
| Real-time | Socket.IO | Server + Client |
+957 -1152
View File
File diff suppressed because it is too large Load Diff
+3
View File
@@ -25,6 +25,9 @@ packageExtensions:
"@embedpdf/utils@2.15.1":
dependencies:
"@embedpdf/models": 2.15.1
peerDependencyRules:
allowedVersions:
"vite-plugin-pwa>@vite-pwa/assets-generator": "^2.0.0"
allowBuilds:
"@ffmpeg-installer/darwin-arm64": true
"@ffmpeg-installer/darwin-x64": true
+1 -1
View File
@@ -1,6 +1,6 @@
# BookOrbit - Server
NestJS 11 backend running on Fastify.
NestJS 12 backend running on Fastify.
## Running
+21 -21
View File
@@ -62,18 +62,18 @@
"@fastify/helmet": "^13.1.1",
"@fastify/multipart": "^10.1.2",
"@fastify/static": "^10.1.5",
"@nestjs/common": "^11.2.6",
"@nestjs/config": "^4.0.4",
"@nestjs/core": "^11.2.6",
"@nestjs/jwt": "^11.0.2",
"@nestjs/passport": "^11.0.5",
"@nestjs/platform-fastify": "^11.2.6",
"@nestjs/platform-socket.io": "^11.2.6",
"@nestjs/schedule": "^6.1.3",
"@nestjs/swagger": "^11.4.7",
"@nestjs/terminus": "^11.1.1",
"@nestjs/common": "^12.1.1",
"@nestjs/config": "^12.0.1",
"@nestjs/core": "^12.1.1",
"@nestjs/jwt": "^12.0.2",
"@nestjs/passport": "^12.0.0",
"@nestjs/platform-fastify": "^12.1.1",
"@nestjs/platform-socket.io": "^12.1.1",
"@nestjs/schedule": "^12.0.2",
"@nestjs/swagger": "^12.0.2",
"@nestjs/terminus": "^12.1.0",
"@nestjs/throttler": "^6.7.1",
"@nestjs/websockets": "^11.2.6",
"@nestjs/websockets": "^12.1.1",
"@types/archiver": "^8.0.0",
"archiver": "~8.0.0",
"bcryptjs": "^3.0.3",
@@ -84,17 +84,17 @@
"cron": "^4.4.0",
"date-fns-tz": "^3.2.0",
"drizzle-orm": "^0.45.3",
"fast-xml-parser": "^5.11.1",
"fast-xml-parser": "^5.11.2",
"fastest-levenshtein": "^1.0.16",
"fastify": "^5.12.5",
"iconv-lite": "^0.7.3",
"jose": "^6.2.12",
"langs": "^2.0.0",
"ms": "^2.1.3",
"mysql2": "^3.24.4",
"nestjs-pino": "^4.6.1",
"mysql2": "^3.24.5",
"nestjs-pino": "^5.2.1",
"node-unrar-js": "^2.0.2",
"nodemailer": "^9.1.1",
"nodemailer": "^10.0.12",
"passport": "^0.7.0",
"passport-jwt": "^4.0.1",
"pdf-lib": "^1.17.1",
@@ -114,11 +114,11 @@
"@eslint/js": "^10.0.1",
"@ffmpeg-installer/ffmpeg": "^1.1.0",
"@ffprobe-installer/ffprobe": "^2.1.2",
"@nestjs/cli": "^11.0.24",
"@nestjs/schematics": "^11.1.0",
"@nestjs/testing": "^11.2.6",
"@nestjs/cli": "^12.0.8",
"@nestjs/schematics": "^12.0.6",
"@nestjs/testing": "^12.1.1",
"@swc/cli": "^0.8.1",
"@swc/core": "^1.16.2",
"@swc/core": "^1.16.12",
"@types/bcrypt": "^6.0.0",
"@types/express": "^5.0.6",
"@types/langs": "^2.0.5",
@@ -128,7 +128,7 @@
"@types/pg": "^8.23.1",
"@types/supertest": "^7.2.1",
"@types/unzipper": "^0.10.11",
"@vitest/coverage-v8": "^4.1.11",
"@vitest/coverage-v8": "^5.0.2",
"drizzle-kit": "^0.31.11",
"eslint": "^10.11.0",
"eslint-config-prettier": "^10.1.8",
@@ -144,6 +144,6 @@
"tsx": "^4.23.15",
"typescript": "^6.0.3",
"typescript-eslint": "^8.71.0",
"vitest": "^4.1.11"
"vitest": "^5.0.2"
}
}
@@ -1,4 +1,3 @@
import { SCHEDULE_CRON_OPTIONS } from '@nestjs/schedule/dist/schedule.constants';
import { describe, expect, it } from 'vitest';
import { SYSTEM_TIME_ZONE } from '../utils/timezone.utils';
@@ -11,9 +10,8 @@ describe('SystemCron', () => {
run(): void {}
}
expect(Reflect.getMetadata(SCHEDULE_CRON_OPTIONS, TestJob.prototype.run)).toEqual({
cronTime: '0 3 * * *',
timeZone: SYSTEM_TIME_ZONE,
});
const metadata = Reflect.getMetadataKeys(TestJob.prototype.run).map((key) => Reflect.getMetadata(key, TestJob.prototype.run));
expect(metadata).toContainEqual({ cronTime: '0 3 * * *', timeZone: SYSTEM_TIME_ZONE });
});
});