diff --git a/package.json b/package.json index 171d03dd3..3b99f6e40 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "type": "git", "url": "https://github.com/MisskeyIO/misskey.git" }, - "packageManager": "pnpm@9.14.2", + "packageManager": "pnpm@9.15.0", "workspaces": [ "packages/frontend", "packages/backend", @@ -47,35 +47,36 @@ }, "resolutions": { "@tensorflow/tfjs-core": "4.22.0", - "axios": "1.7.7", - "chokidar": "4.0.1", - "cookie": "1.0.1", + "axios": "1.7.9", + "chokidar": "4.0.2", + "cookie": "1.0.2", "cookie-signature": "1.2.2", - "debug": "4.3.7", + "debug": "4.4.0", "esbuild": "0.24.0", "jpeg-js": "0.4.4", "lodash": "4.17.21", + "punycode": "npm:punycode.js@2.3.1", "sharp": "0.33.5", "tough-cookie": "5.0.0", "web-streams-polyfill": "4.0.0" }, "dependencies": { "cssnano": "7.0.6", - "execa": "9.5.1", + "execa": "9.5.2", "js-yaml": "4.1.0", "postcss": "8.4.49", - "terser": "5.36.0", + "terser": "5.37.0", "typescript": "5.7.2" }, "devDependencies": { - "@types/node": "22.10.0", + "@types/node": "22.10.2", "@typescript-eslint/eslint-plugin": "7.10.0", "@typescript-eslint/parser": "7.10.0", "cross-env": "7.0.3", - "cypress": "13.16.0", + "cypress": "13.17.0", "eslint": "8.57.1", "ncp": "2.0.0", - "start-server-and-test": "2.0.8" + "start-server-and-test": "2.0.9" }, "optionalDependencies": { "@tensorflow/tfjs-core": "4.22.0" diff --git a/packages/backend/.swcrc b/packages/backend/.swcrc index 0504a2d38..9593b0bf7 100644 --- a/packages/backend/.swcrc +++ b/packages/backend/.swcrc @@ -1,5 +1,5 @@ { - "$schema": "https://json.schemastore.org/swcrc", + "$schema": "https://swc.rs/schema.json", "jsc": { "parser": { "syntax": "typescript", @@ -17,7 +17,8 @@ "paths": { "@/*": ["*"] }, - "target": "es2022" + "target": "es2022", + "keepClassNames": true }, "minify": false } diff --git a/packages/backend/jest.config.e2e.cjs b/packages/backend/jest.config.e2e.cjs index 4502da47d..e2ab0c687 100644 --- a/packages/backend/jest.config.e2e.cjs +++ b/packages/backend/jest.config.e2e.cjs @@ -7,7 +7,7 @@ const base = require('./jest.config.cjs') module.exports = { ...base, - globalSetup: "/built-test/entry.js", + globalSetup: "/test-server/entry.mjs", setupFilesAfterEnv: ["/test/jest.setup.ts"], testMatch: [ "/test/e2e/**/*.ts", diff --git a/packages/backend/package.json b/packages/backend/package.json index 117acf95b..f4667fa4a 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -13,7 +13,6 @@ "revert": "pnpm typeorm migration:revert -d ormconfig.js", "check:connect": "node ./scripts/check_connect.js", "build": "swc src -d built -D --strip-leading-paths", - "build:test": "swc test-server -d built-test -D --config-file test-server/.swcrc --strip-leading-paths", "watch:swc": "swc src -d built -D -w --strip-leading-paths", "build:tsc": "tsc -p tsconfig.json && tsc-alias -p tsconfig.json", "watch": "node ./scripts/watch.mjs", @@ -23,27 +22,27 @@ "eslint": "eslint --quiet \"src/**/*.ts\"", "lint": "pnpm typecheck && pnpm eslint", "jest": "cross-env NODE_ENV=test node --experimental-vm-modules --experimental-import-meta-resolve node_modules/jest/bin/jest.js --forceExit --config jest.config.unit.cjs", - "jest:e2e": "cross-env NODE_ENV=test node --experimental-vm-modules --experimental-import-meta-resolve node_modules/jest/bin/jest.js --forceExit --config jest.config.e2e.cjs", + "jest:e2e": "cross-env NODE_ENV=test node --experimental-vm-modules --experimental-import-meta-resolve --no-experimental-require-module node_modules/jest/bin/jest.js --forceExit --config jest.config.e2e.cjs", "jest-and-coverage": "cross-env NODE_ENV=test node --experimental-vm-modules --experimental-import-meta-resolve node_modules/jest/bin/jest.js --coverage --forceExit --config jest.config.unit.cjs", - "jest-and-coverage:e2e": "cross-env NODE_ENV=test node --experimental-vm-modules --experimental-import-meta-resolve node_modules/jest/bin/jest.js --coverage --forceExit --config jest.config.e2e.cjs", + "jest-and-coverage:e2e": "cross-env NODE_ENV=test node --experimental-vm-modules --experimental-import-meta-resolve --no-experimental-require-module node_modules/jest/bin/jest.js --coverage --forceExit --config jest.config.e2e.cjs", "jest-clear": "cross-env NODE_ENV=test node --experimental-vm-modules --experimental-import-meta-resolve node_modules/jest/bin/jest.js --clearCache", "test": "pnpm jest", - "test:e2e": "pnpm build && pnpm build:test && pnpm jest:e2e", + "test:e2e": "pnpm build && pnpm jest:e2e", "test-and-coverage": "pnpm jest-and-coverage", - "test-and-coverage:e2e": "pnpm build && pnpm build:test && pnpm jest-and-coverage:e2e", + "test-and-coverage:e2e": "pnpm build && pnpm jest-and-coverage:e2e", "generate-api-json": "pnpm build && node ./scripts/generate_api_json.js" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.9.3", - "@swc/core-darwin-x64": "1.9.3", - "@swc/core-linux-arm-gnueabihf": "1.9.3", - "@swc/core-linux-arm64-gnu": "1.9.3", - "@swc/core-linux-arm64-musl": "1.9.3", - "@swc/core-linux-x64-gnu": "1.9.3", - "@swc/core-linux-x64-musl": "1.9.3", - "@swc/core-win32-arm64-msvc": "1.9.3", - "@swc/core-win32-ia32-msvc": "1.9.3", - "@swc/core-win32-x64-msvc": "1.9.3", + "@swc/core-darwin-arm64": "1.10.1", + "@swc/core-darwin-x64": "1.10.1", + "@swc/core-linux-arm-gnueabihf": "1.10.1", + "@swc/core-linux-arm64-gnu": "1.10.1", + "@swc/core-linux-arm64-musl": "1.10.1", + "@swc/core-linux-x64-gnu": "1.10.1", + "@swc/core-linux-x64-musl": "1.10.1", + "@swc/core-win32-arm64-msvc": "1.10.1", + "@swc/core-win32-ia32-msvc": "1.10.1", + "@swc/core-win32-x64-msvc": "1.10.1", "@tensorflow/tfjs": "4.22.0", "@tensorflow/tfjs-node": "4.22.0", "bufferutil": "4.0.8", @@ -64,34 +63,34 @@ }, "dependencies": { "@authenio/samlify-node-xmllint": "2.0.0", - "@aws-sdk/client-s3": "3.700.0", - "@aws-sdk/lib-storage": "3.700.0", + "@aws-sdk/client-s3": "3.714.0", + "@aws-sdk/lib-storage": "3.714.0", "@bull-board/api": "6.5.3", "@bull-board/fastify": "6.5.3", "@bull-board/ui": "6.5.3", "@discordapp/twemoji": "15.1.0", - "@elastic/elasticsearch": "8.16.2", - "@fastify/accepts": "5.0.1", + "@elastic/elasticsearch": "8.17.0", + "@fastify/accepts": "5.0.2", "@fastify/cookie": "11.0.1", "@fastify/cors": "10.0.1", "@fastify/express": "4.0.1", "@fastify/formbody": "8.0.1", - "@fastify/http-proxy": "10.0.2", + "@fastify/http-proxy": "11.0.0", "@fastify/multipart": "9.0.1", "@fastify/static": "8.0.3", "@fastify/view": "10.0.1", "@misskey-dev/sharp-read-bmp": "1.2.0", "@misskey-dev/summaly": "MisskeyIO/summaly#5.1.2", - "@napi-rs/canvas": "0.1.64", - "@nestjs/common": "10.4.9", - "@nestjs/core": "10.4.9", - "@nestjs/testing": "10.4.9", + "@napi-rs/canvas": "0.1.65", + "@nestjs/common": "10.4.15", + "@nestjs/core": "10.4.15", + "@nestjs/testing": "10.4.15", "@peertube/http-signature": "1.7.0", - "@simplewebauthn/server": "12.0.0", + "@simplewebauthn/server": "13.0.0", "@sinonjs/fake-timers": "11.3.1", - "@smithy/node-http-handler": "3.3.1", - "@swc/cli": "0.5.1", - "@swc/core": "1.9.3", + "@smithy/node-http-handler": "3.3.2", + "@swc/cli": "0.5.2", + "@swc/core": "1.10.1", "@twemoji/parser": "15.1.1", "accepts": "1.3.8", "ajv": "8.17.1", @@ -100,18 +99,18 @@ "bcryptjs": "2.4.3", "blurhash": "2.0.5", "body-parser": "1.20.3", - "bullmq": "5.29.1", + "bullmq": "5.34.2", "cacheable-lookup": "7.0.0", "cbor": "10.0.3", "chalk": "5.3.0", "chalk-template": "1.1.0", - "chokidar": "4.0.1", + "chokidar": "4.0.2", "cli-highlight": "2.1.11", "color-convert": "2.0.1", "content-disposition": "0.5.4", "date-fns": "4.1.0", "deep-email-validator": "0.1.21", - "fastify": "5.0.0", + "fastify": "5.2.0", "fastify-http-errors-enhanced": "6.0.0", "fastify-raw-body": "5.0.0", "feed": "4.2.2", @@ -119,7 +118,7 @@ "fluent-ffmpeg": "2.1.3", "form-data": "4.0.1", "got": "14.4.5", - "happy-dom": "15.11.6", + "happy-dom": "15.11.7", "hpagent": "1.2.0", "htmlescape": "1.1.1", "http-link-header": "1.1.3", @@ -133,7 +132,7 @@ "json5": "2.2.3", "jsonld": "8.3.2", "jsrsasign": "11.1.0", - "meilisearch": "0.45.0", + "meilisearch": "0.46.0", "mfm-js": "0.24.0", "microformats-parser": "2.0.2", "mime-types": "2.1.35", @@ -145,12 +144,12 @@ "node-fetch": "3.3.2", "node-forge": "1.3.1", "nodemailer": "6.9.16", - "nsfwjs": "2.4.2", + "nsfwjs": "4.2.0", "oauth": "0.10.0", "oauth2orize": "1.12.0", "oauth2orize-pkce": "0.1.2", "os-utils": "0.0.14", - "otpauth": "9.3.5", + "otpauth": "9.3.6", "parse5": "7.2.1", "pg": "8.13.1", "pino": "9.5.0", @@ -159,7 +158,7 @@ "probe-image-size": "7.2.3", "promise-limit": "2.7.0", "pug": "3.0.3", - "punycode": "2.3.1", + "punycode.js": "2.3.1", "qrcode": "1.5.4", "random-seed": "0.3.0", "ratelimiter": "3.4.1", @@ -176,7 +175,7 @@ "slacc": "0.0.10", "strict-event-emitter-types": "2.0.0", "stringz": "2.1.0", - "systeminformation": "5.23.5", + "systeminformation": "5.23.13", "tinycolor2": "1.6.0", "tmp": "0.2.3", "tsc-alias": "1.8.10", @@ -193,8 +192,7 @@ "devDependencies": { "@jest/globals": "29.7.0", "@misskey-dev/eslint-plugin": "1.0.0", - "@nestjs/platform-express": "10.4.9", - "@simplewebauthn/types": "12.0.0", + "@nestjs/platform-express": "10.4.15", "@swc/jest": "0.2.37", "@types/accepts": "1.3.7", "@types/archiver": "6.0.3", @@ -209,10 +207,10 @@ "@types/js-yaml": "4.0.9", "@types/jsdom": "21.1.7", "@types/jsonld": "1.5.15", - "@types/jsrsasign": "10.5.14", + "@types/jsrsasign": "10.5.15", "@types/mime-types": "2.1.4", "@types/ms": "0.7.34", - "@types/node": "22.10.0", + "@types/node": "22.10.2", "@types/node-forge": "1.3.11", "@types/nodemailer": "6.4.17", "@types/oauth": "0.9.6", @@ -220,7 +218,7 @@ "@types/oauth2orize-pkce": "0.1.2", "@types/pg": "8.11.10", "@types/pug": "2.0.10", - "@types/punycode": "2.1.4", + "@types/punycode.js": "npm:@types/punycode@2.1.4", "@types/qrcode": "1.5.5", "@types/random-seed": "0.3.5", "@types/ratelimiter": "3.4.6", @@ -240,11 +238,11 @@ "cross-env": "7.0.3", "eslint": "8.57.1", "eslint-plugin-import": "2.31.0", - "execa": "9.5.1", + "execa": "9.5.2", "fkill": "^9.0.0", "jest": "29.7.0", "jest-mock": "29.7.0", - "nodemon": "3.1.7", + "nodemon": "3.1.9", "pid-port": "1.0.0", "simple-oauth2": "5.1.0" } diff --git a/packages/backend/src/core/AiService.ts b/packages/backend/src/core/AiService.ts index 33b79be35..2eb9e97a4 100644 --- a/packages/backend/src/core/AiService.ts +++ b/packages/backend/src/core/AiService.ts @@ -3,13 +3,13 @@ * SPDX-License-Identifier: AGPL-3.0-only */ -import * as fs from 'node:fs'; import { fileURLToPath } from 'node:url'; import { dirname } from 'node:path'; import { Injectable } from '@nestjs/common'; import * as nsfw from 'nsfwjs'; import si from 'systeminformation'; import { Mutex } from 'async-mutex'; +import { sharpBmp } from '@misskey-dev/sharp-read-bmp'; import { bindThis } from '@/decorators.js'; import type Logger from '@/logger.js'; import { LoggerService } from '@/core/LoggerService.js'; @@ -33,7 +33,7 @@ export class AiService { } @bindThis - public async detectSensitive(path: string): Promise { + public async detectSensitive(path: string, mime: string): Promise { try { if (isSupportedCpu === undefined) { const cpuFlags = await this.getCpuFlags(); @@ -55,11 +55,16 @@ export class AiService { }); } - const buffer = await fs.promises.readFile(path); - const image = await tf.node.decodeImage(buffer, 3) as any; + const sharp = await sharpBmp(path, mime); + const { data, info } = await sharp + .resize(299, 299, { fit: 'inside' }) + .ensureAlpha() + .raw({ depth: 'int' }) + .toBuffer({ resolveWithObject: true }); + + const image = tf.tensor3d(data, [info.height, info.width, info.channels], 'int32'); try { - const predictions = await this.model.classify(image); - return predictions; + return await this.model.classify(image); } finally { image.dispose(); } diff --git a/packages/backend/src/core/FetchInstanceMetadataService.ts b/packages/backend/src/core/FetchInstanceMetadataService.ts index 231e09af1..3d7f22f2d 100644 --- a/packages/backend/src/core/FetchInstanceMetadataService.ts +++ b/packages/backend/src/core/FetchInstanceMetadataService.ts @@ -15,7 +15,6 @@ import { LoggerService } from '@/core/LoggerService.js'; import { HttpRequestService } from '@/core/HttpRequestService.js'; import { bindThis } from '@/decorators.js'; import { FederatedInstanceService } from '@/core/FederatedInstanceService.js'; -import type { DOMWindow } from 'jsdom'; type NodeInfo = { openRegistrations?: unknown; @@ -170,7 +169,7 @@ export class FetchInstanceMetadataService { } @bindThis - private async fetchDom(instance: MiInstance): Promise { + private async fetchDom(instance: MiInstance): Promise { this.logger.info(`Fetching HTML of ${instance.host} ...`); const url = 'https://' + instance.host; @@ -178,9 +177,8 @@ export class FetchInstanceMetadataService { const html = await this.httpRequestService.getHtml(url); const { window } = new JSDOM(html); - const doc = window.document; - return doc; + return window.document as Document; } @bindThis @@ -195,7 +193,7 @@ export class FetchInstanceMetadataService { } @bindThis - private async fetchFaviconUrl(instance: MiInstance, doc: DOMWindow['document'] | null): Promise { + private async fetchFaviconUrl(instance: MiInstance, doc: Document | null): Promise { const url = 'https://' + instance.host; if (doc) { @@ -221,7 +219,7 @@ export class FetchInstanceMetadataService { } @bindThis - private async fetchIconUrl(instance: MiInstance, doc: DOMWindow['document'] | null, manifest: Record | null): Promise { + private async fetchIconUrl(instance: MiInstance, doc: Document | null, manifest: Record | null): Promise { if (manifest && manifest.icons && manifest.icons.length > 0 && manifest.icons[0].src) { const url = 'https://' + instance.host; return (new URL(manifest.icons[0].src, url)).href; @@ -250,7 +248,7 @@ export class FetchInstanceMetadataService { } @bindThis - private async getThemeColor(info: NodeInfo | null, doc: DOMWindow['document'] | null, manifest: Record | null): Promise { + private async getThemeColor(info: NodeInfo | null, doc: Document | null, manifest: Record | null): Promise { const themeColor = info?.metadata?.themeColor ?? doc?.querySelector('meta[name="theme-color"]')?.getAttribute('content') ?? manifest?.theme_color; if (themeColor) { @@ -262,7 +260,7 @@ export class FetchInstanceMetadataService { } @bindThis - private async getSiteName(info: NodeInfo | null, doc: DOMWindow['document'] | null, manifest: Record | null): Promise { + private async getSiteName(info: NodeInfo | null, doc: Document | null, manifest: Record | null): Promise { if (info && info.metadata) { if (typeof info.metadata.nodeName === 'string') { return info.metadata.nodeName; @@ -287,7 +285,7 @@ export class FetchInstanceMetadataService { } @bindThis - private async getDescription(info: NodeInfo | null, doc: DOMWindow['document'] | null, manifest: Record | null): Promise { + private async getDescription(info: NodeInfo | null, doc: Document | null, manifest: Record | null): Promise { if (info && info.metadata) { if (typeof info.metadata.nodeDescription === 'string') { return info.metadata.nodeDescription; diff --git a/packages/backend/src/core/FileInfoService.ts b/packages/backend/src/core/FileInfoService.ts index a8f66b95f..31407db32 100644 --- a/packages/backend/src/core/FileInfoService.ts +++ b/packages/backend/src/core/FileInfoService.ts @@ -13,7 +13,7 @@ import * as fileType from 'file-type'; import FFmpeg from 'fluent-ffmpeg'; import isSvg from 'is-svg'; import probeImageSize from 'probe-image-size'; -import { type predictionType } from 'nsfwjs'; +import { type PredictionType } from 'nsfwjs'; import { sharpBmp } from '@misskey-dev/sharp-read-bmp'; import { encode } from 'blurhash'; import { createTempDir } from '@/misc/create-temp.js'; @@ -170,7 +170,7 @@ export class FileInfoService { let sensitive = false; let porn = false; - function judgePrediction(result: readonly predictionType[]): [sensitive: boolean, porn: boolean] { + function judgePrediction(result: readonly PredictionType[]): [sensitive: boolean, porn: boolean] { let sensitive = false; let porn = false; @@ -188,7 +188,7 @@ export class FileInfoService { 'image/png', 'image/webp', ].includes(mime)) { - const result = await this.aiService.detectSensitive(source); + const result = await this.aiService.detectSensitive(source, mime); if (result) { [sensitive, porn] = judgePrediction(result); } @@ -247,7 +247,7 @@ export class FileInfoService { } targetIndex = nextIndex; nextIndex += index; // fibonacci sequence によってフレーム数制限を掛ける - const result = await this.aiService.detectSensitive(path); + const result = await this.aiService.detectSensitive(path, 'image/png'); if (result) { results.push(judgePrediction(result)); } diff --git a/packages/backend/src/core/UtilityService.ts b/packages/backend/src/core/UtilityService.ts index 3f6d63609..16c71e971 100644 --- a/packages/backend/src/core/UtilityService.ts +++ b/packages/backend/src/core/UtilityService.ts @@ -4,7 +4,7 @@ */ import { URL } from 'node:url'; -import { toASCII } from 'punycode'; +import punycode from 'punycode.js'; import { Inject, Injectable } from '@nestjs/common'; import RE2 from 're2'; import { DI } from '@/di-symbols.js'; @@ -95,12 +95,12 @@ export class UtilityService { @bindThis public toPuny(host: string): string { - return toASCII(host.toLowerCase()); + return punycode.toASCII(host.toLowerCase()); } @bindThis public toPunyNullable(host: string | null | undefined): string | null { if (host == null) return null; - return toASCII(host.toLowerCase()); + return punycode.toASCII(host.toLowerCase()); } } diff --git a/packages/backend/src/core/WebAuthnService.ts b/packages/backend/src/core/WebAuthnService.ts index d0b65bf64..1cabc3460 100644 --- a/packages/backend/src/core/WebAuthnService.ts +++ b/packages/backend/src/core/WebAuthnService.ts @@ -32,7 +32,7 @@ import type { PublicKeyCredentialCreationOptionsJSON, PublicKeyCredentialRequestOptionsJSON, RegistrationResponseJSON, -} from '@simplewebauthn/types'; +} from '@simplewebauthn/server'; @Injectable() export class WebAuthnService { @@ -78,7 +78,6 @@ export class WebAuthnService { userID: isoUint8Array.fromUTF8String(userId), userName: userName, userDisplayName: userDisplayName, - attestationType: 'indirect', excludeCredentials: keys.map(key => (<{ id: string; transports?: AuthenticatorTransportFuture[]; }>{ id: key.id, transports: key.transports ?? undefined, diff --git a/packages/backend/src/server/ServerService.ts b/packages/backend/src/server/ServerService.ts index 08d718978..f534a40bb 100644 --- a/packages/backend/src/server/ServerService.ts +++ b/packages/backend/src/server/ServerService.ts @@ -271,7 +271,7 @@ export class ServerService implements OnApplicationShutdown { } }); } else { - fastify.listen({ port: this.config.port, host: '0.0.0.0' }); + fastify.listen({ port: this.config.port, host: '::' }); } await fastify.ready(); diff --git a/packages/backend/src/server/api/SigninApiService.ts b/packages/backend/src/server/api/SigninApiService.ts index ed661a1fa..c8f76550d 100644 --- a/packages/backend/src/server/api/SigninApiService.ts +++ b/packages/backend/src/server/api/SigninApiService.ts @@ -25,7 +25,7 @@ import { FastifyReplyError } from '@/misc/fastify-reply-error.js'; import { MetaService } from '@/core/MetaService.js'; import { RateLimiterService } from './RateLimiterService.js'; import { SigninService } from './SigninService.js'; -import type { AuthenticationResponseJSON } from '@simplewebauthn/types'; +import type { AuthenticationResponseJSON } from '@simplewebauthn/server'; import type { FastifyReply, FastifyRequest } from 'fastify'; import { randomUUID } from 'node:crypto'; diff --git a/packages/backend/src/server/api/endpoints/i/update.ts b/packages/backend/src/server/api/endpoints/i/update.ts index fb3ea38f8..62d64a8ff 100644 --- a/packages/backend/src/server/api/endpoints/i/update.ts +++ b/packages/backend/src/server/api/endpoints/i/update.ts @@ -559,7 +559,7 @@ export default class extends Endpoint { // eslint- const html = await this.httpRequestService.getHtml(url); const { window } = new JSDOM(html); - const doc = window.document; + const doc = window.document as Document; const myLink = `${this.config.url}/@${user.username}`; diff --git a/packages/backend/test-server/.eslintrc.cjs b/packages/backend/test-server/.eslintrc.cjs deleted file mode 100644 index c261741a3..000000000 --- a/packages/backend/test-server/.eslintrc.cjs +++ /dev/null @@ -1,32 +0,0 @@ -module.exports = { - parserOptions: { - tsconfigRootDir: __dirname, - project: ['./tsconfig.json'], - }, - extends: [ - '../../shared/.eslintrc.js', - ], - rules: { - 'import/order': ['warn', { - 'groups': ['builtin', 'external', 'internal', 'parent', 'sibling', 'index', 'object', 'type'], - 'pathGroups': [ - { - 'pattern': '@/**', - 'group': 'external', - 'position': 'after' - } - ], - }], - 'no-restricted-globals': [ - 'error', - { - 'name': '__dirname', - 'message': 'Not in ESModule. Use `import.meta.url` instead.' - }, - { - 'name': '__filename', - 'message': 'Not in ESModule. Use `import.meta.url` instead.' - } - ] - }, -}; diff --git a/packages/backend/test-server/.swcrc b/packages/backend/test-server/.swcrc deleted file mode 100644 index e3d693516..000000000 --- a/packages/backend/test-server/.swcrc +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/swcrc", - "jsc": { - "parser": { - "syntax": "typescript", - "dynamicImport": true, - "decorators": true - }, - "transform": { - "legacyDecorator": true, - "decoratorMetadata": true - }, - "experimental": { - "keepImportAssertions": true - }, - "baseUrl": "../built", - "paths": { - "@/*": ["*"] - }, - "target": "es2022" - }, - "minify": false -} diff --git a/packages/backend/test-server/entry.ts b/packages/backend/test-server/entry.mjs similarity index 83% rename from packages/backend/test-server/entry.ts rename to packages/backend/test-server/entry.mjs index 866a7e1f5..519429a5c 100644 --- a/packages/backend/test-server/entry.ts +++ b/packages/backend/test-server/entry.mjs @@ -2,10 +2,10 @@ import { portToPid } from 'pid-port'; import fkill from 'fkill'; import Fastify from 'fastify'; import { NestFactory } from '@nestjs/core'; -import { MainModule } from '@/MainModule.js'; -import { ServerService } from '@/server/ServerService.js'; -import { loadConfig } from '@/config.js'; -import { NestLogger } from '@/NestLogger.js'; +import { MainModule } from '../built/MainModule.js'; +import { ServerService } from '../built/server/ServerService.js'; +import { loadConfig } from '../built/config.js'; +import { NestLogger } from '../built/NestLogger.js'; const config = loadConfig(); const originEnv = JSON.stringify(process.env); @@ -56,7 +56,7 @@ async function killTestServer() { async function startControllerEndpoints(port = config.port + 1000) { const fastify = Fastify(); - fastify.post<{ Body: { key?: string, value?: string } }>('/env', async (req, res) => { + fastify.post('/env', async (req, res) => { console.log(req.body); const key = req.body['key']; if (!key) { @@ -69,7 +69,7 @@ async function startControllerEndpoints(port = config.port + 1000) { res.code(200).send({ success: true }); }); - fastify.post<{ Body: { key?: string, value?: string } }>('/env-reset', async (req, res) => { + fastify.post('/env-reset', async (req, res) => { process.env = JSON.parse(originEnv); res.code(200).send({ success: true }); }); diff --git a/packages/backend/test-server/tsconfig.json b/packages/backend/test-server/tsconfig.json deleted file mode 100644 index 705cecef3..000000000 --- a/packages/backend/test-server/tsconfig.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "compilerOptions": { - "allowJs": true, - "noEmitOnError": true, - "noImplicitAny": true, - "noImplicitReturns": true, - "noUnusedParameters": false, - "noUnusedLocals": false, - "noFallthroughCasesInSwitch": true, - "declaration": false, - "sourceMap": true, - "target": "es2022", - "module": "nodenext", - "moduleResolution": "nodenext", - "allowSyntheticDefaultImports": true, - "removeComments": false, - "noLib": false, - "strict": true, - "strictNullChecks": true, - "strictPropertyInitialization": false, - "skipLibCheck": true, - "experimentalDecorators": true, - "emitDecoratorMetadata": true, - "resolveJsonModule": true, - "isolatedModules": true, - "rootDir": "../src", - "baseUrl": "./", - "paths": { - "@/*": ["../src/*"] - }, - "outDir": "../built-test", - "types": [ - "node" - ], - "typeRoots": [ - "../src/@types", - "../node_modules/@types", - "../node_modules" - ], - "lib": [ - "esnext" - ] - }, - "compileOnSave": false, - "include": [ - "./**/*.ts", - "../src/**/*.ts" - ], - "exclude": [ - "../src/**/*.test.ts" - ] -} diff --git a/packages/backend/test/e2e/2fa.ts b/packages/backend/test/e2e/2fa.ts index bea57f36c..f73fdded9 100644 --- a/packages/backend/test/e2e/2fa.ts +++ b/packages/backend/test/e2e/2fa.ts @@ -18,7 +18,7 @@ import type { PublicKeyCredentialCreationOptionsJSON, PublicKeyCredentialRequestOptionsJSON, RegistrationResponseJSON, -} from '@simplewebauthn/types'; +} from '@simplewebauthn/server'; import type * as misskey from 'misskey-js'; describe('2要素認証', () => { diff --git a/packages/backend/test/tsconfig.json b/packages/backend/test/tsconfig.json index b98878771..bbc189bcd 100644 --- a/packages/backend/test/tsconfig.json +++ b/packages/backend/test/tsconfig.json @@ -28,8 +28,9 @@ "@/*": ["../src/*"] }, "typeRoots": [ + "../src/@types", "../node_modules/@types", - "../src/@types" + "../node_modules" ], "lib": [ "esnext" diff --git a/packages/frontend/package.json b/packages/frontend/package.json index 612e07826..c6d2e5df9 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -23,11 +23,11 @@ "@mcaptcha/vanilla-glue": "0.1.0-alpha-3", "@misskey-dev/browser-image-resizer": "2024.1.0", "@rollup/plugin-json": "6.1.0", - "@rollup/plugin-replace": "6.0.1", - "@rollup/plugin-typescript": "12.1.1", - "@rollup/pluginutils": "5.1.3", + "@rollup/plugin-replace": "6.0.2", + "@rollup/plugin-typescript": "12.1.2", + "@rollup/pluginutils": "5.1.4", "@syuilo/aiscript": "0.19.0", - "@tabler/icons-webfont": "3.22.0", + "@tabler/icons-webfont": "3.26.0", "@twemoji/parser": "15.1.1", "@vitejs/plugin-vue": "5.2.1", "@vue/compiler-sfc": "3.5.13", @@ -36,12 +36,12 @@ "broadcast-channel": "7.0.0", "buraha": "0.0.1", "canvas-confetti": "1.9.3", - "chart.js": "4.4.6", + "chart.js": "4.4.7", "chartjs-adapter-date-fns": "3.0.0", "chartjs-chart-matrix": "2.0.1", "chartjs-plugin-gradient": "0.6.1", "chartjs-plugin-zoom": "2.2.0", - "chromatic": "11.19.0", + "chromatic": "11.20.2", "compare-versions": "6.1.1", "cropperjs": "2.0.0-rc.0", "date-fns": "4.1.0", @@ -58,14 +58,14 @@ "misskey-js": "workspace:*", "misskey-reversi": "workspace:*", "photoswipe": "5.4.4", - "punycode": "2.3.1", - "rollup": "4.27.4", + "punycode.js": "2.3.1", + "rollup": "4.28.1", "sanitize-html": "2.13.1", - "sass": "1.81.0", - "shiki": "1.23.1", + "sass": "1.83.0", + "shiki": "1.24.2", "strict-event-emitter-types": "2.0.0", "textarea-caret": "3.1.0", - "three": "0.170.0", + "three": "0.171.0", "throttle-debounce": "5.0.2", "tinycolor2": "1.6.0", "tsc-alias": "1.8.10", @@ -73,7 +73,7 @@ "typescript": "5.7.2", "uuid": "11.0.3", "v-code-diff": "1.13.1", - "vite": "5.4.11", + "vite": "6.0.3", "vue": "3.5.13", "vue-gtag": "2.0.1", "vuedraggable": "next", @@ -82,61 +82,61 @@ "devDependencies": { "@misskey-dev/eslint-plugin": "1.0.0", "@misskey-dev/summaly": "MisskeyIO/summaly#5.1.2", - "@storybook/addon-actions": "8.4.5", - "@storybook/addon-essentials": "8.4.5", - "@storybook/addon-interactions": "8.4.5", - "@storybook/addon-links": "8.4.5", - "@storybook/addon-mdx-gfm": "8.4.5", - "@storybook/addon-storysource": "8.4.5", - "@storybook/blocks": "8.4.5", - "@storybook/components": "8.4.5", - "@storybook/core-events": "8.4.5", - "@storybook/manager-api": "8.4.5", - "@storybook/preview-api": "8.4.5", - "@storybook/react": "8.4.5", - "@storybook/react-vite": "8.4.5", - "@storybook/test": "8.4.5", - "@storybook/theming": "8.4.5", - "@storybook/types": "8.4.5", - "@storybook/vue3": "8.4.5", - "@storybook/vue3-vite": "8.4.5", + "@storybook/addon-actions": "8.4.7", + "@storybook/addon-essentials": "8.4.7", + "@storybook/addon-interactions": "8.4.7", + "@storybook/addon-links": "8.4.7", + "@storybook/addon-mdx-gfm": "8.4.7", + "@storybook/addon-storysource": "8.4.7", + "@storybook/blocks": "8.4.7", + "@storybook/components": "8.4.7", + "@storybook/core-events": "8.4.7", + "@storybook/manager-api": "8.4.7", + "@storybook/preview-api": "8.4.7", + "@storybook/react": "8.4.7", + "@storybook/react-vite": "8.4.7", + "@storybook/test": "8.4.7", + "@storybook/theming": "8.4.7", + "@storybook/types": "8.4.7", + "@storybook/vue3": "8.4.7", + "@storybook/vue3-vite": "8.4.7", "@testing-library/vue": "8.1.0", "@types/escape-regexp": "0.0.3", "@types/estree": "1.0.6", - "@types/matter-js": "0.19.7", + "@types/matter-js": "0.19.8", "@types/micromatch": "4.0.9", - "@types/node": "22.10.0", - "@types/punycode": "2.1.4", + "@types/node": "22.10.2", + "@types/punycode.js": "npm:@types/punycode@2.1.4", "@types/sanitize-html": "2.13.0", - "@types/three": "0.170.0", + "@types/three": "0.171.0", "@types/throttle-debounce": "5.0.2", "@types/tinycolor2": "1.4.6", "@types/ws": "8.5.13", "@typescript-eslint/eslint-plugin": "7.10.0", "@typescript-eslint/parser": "7.10.0", - "@vitest/coverage-v8": "2.1.6", + "@vitest/coverage-v8": "2.1.8", "@vue/runtime-core": "3.5.13", "acorn": "8.14.0", "cross-env": "7.0.3", - "cypress": "13.16.0", + "cypress": "13.17.0", "eslint": "8.57.1", "eslint-plugin-import": "2.31.0", - "eslint-plugin-vue": "9.31.0", + "eslint-plugin-vue": "9.32.0", "fast-glob": "3.3.2", - "happy-dom": "15.11.6", + "happy-dom": "15.11.7", "intersection-observer": "0.12.2", "micromatch": "4.0.8", - "msw": "2.6.6", + "msw": "2.7.0", "msw-storybook-addon": "2.0.4", - "nodemon": "3.1.7", - "prettier": "3.4.1", - "react": "18.3.1", - "react-dom": "18.3.1", - "start-server-and-test": "2.0.8", - "storybook": "8.4.5", + "nodemon": "3.1.9", + "prettier": "3.4.2", + "react": "19.0.0", + "react-dom": "19.0.0", + "start-server-and-test": "2.0.9", + "storybook": "8.4.7", "storybook-addon-misskey-theme": "github:misskey-dev/storybook-addon-misskey-theme", "vite-plugin-turbosnap": "1.0.3", - "vitest": "2.1.6", + "vitest": "2.1.8", "vitest-fetch-mock": "0.3.0", "vue-component-type-helpers": "2.1.10", "vue-eslint-parser": "9.4.3", diff --git a/packages/frontend/src/components/MkMention.vue b/packages/frontend/src/components/MkMention.vue index bfb49a416..a7ed1716f 100644 --- a/packages/frontend/src/components/MkMention.vue +++ b/packages/frontend/src/components/MkMention.vue @@ -14,7 +14,7 @@ SPDX-License-Identifier: AGPL-3.0-only