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