diff --git a/CHANGELOG.md b/CHANGELOG.md index e1efd9f1e4..9cdd81d2d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,11 @@ - Fix: 連合が無効化されたサーバーで一部の設定項目が空欄で表示される問題を修正 ### Server +- Enhance: メモリ使用量を削減 +- Enhance: 起動の高速化 + (Cherry-picked from https://github.com/MisskeyIO/misskey/pull/1410) +- Enhance: バックエンドの開発モード時の安定性向上 +- Fix: ファイルシステムを用いる処理におけるパスの取り扱いを改善 - Fix: `/api-doc` にアクセスできない問題を修正 - Fix: support `alsoKnownAs` from remote actors as either array or unwrapped singleton - Fix: ローカルに存在しないリモートアカウントに対するアカウント削除リクエストを受信した際に、そのユーザーを新規作成して削除する挙動を修正 diff --git a/Dockerfile b/Dockerfile index 19f9e8c9dc..d6c8d7e415 100644 --- a/Dockerfile +++ b/Dockerfile @@ -102,7 +102,6 @@ COPY --chown=misskey:misskey --from=native-builder /misskey/packages/misskey-js/ COPY --chown=misskey:misskey --from=native-builder /misskey/packages/misskey-reversi/built ./packages/misskey-reversi/built COPY --chown=misskey:misskey --from=native-builder /misskey/packages/misskey-bubble-game/built ./packages/misskey-bubble-game/built COPY --chown=misskey:misskey --from=native-builder /misskey/packages/backend/built ./packages/backend/built -COPY --chown=misskey:misskey --from=native-builder /misskey/packages/backend/src-js ./packages/backend/src-js COPY --chown=misskey:misskey --from=native-builder /misskey/packages/i18n/built ./packages/i18n/built COPY --chown=misskey:misskey --from=native-builder /misskey/fluent-emojis /misskey/fluent-emojis COPY --chown=misskey:misskey . ./ diff --git a/package.json b/package.json index 918aa6d585..0d090e871f 100644 --- a/package.json +++ b/package.json @@ -28,9 +28,9 @@ "build": "pnpm build-pre && pnpm -r build && pnpm build-assets", "build-storybook": "pnpm --filter frontend build-storybook", "build-misskey-js-with-types": "pnpm build-pre && pnpm --filter backend... --filter=!misskey-js build && pnpm --filter backend generate-api-json --no-build && ncp packages/backend/built/api.json packages/misskey-js/generator/api.json && pnpm --filter misskey-js update-autogen-code && pnpm --filter misskey-js build && pnpm --filter misskey-js api", - "start": "cd packages/backend && pnpm compile-config && node ./built/boot/entry.js", - "start:inspect": "cd packages/backend && pnpm compile-config && node --inspect ./built/boot/entry.js", - "start:test": "ncp ./.github/misskey/test.yml ./.config/test.yml && cd packages/backend && cross-env NODE_ENV=test pnpm compile-config && cross-env NODE_ENV=test node ./built/boot/entry.js", + "start": "cd packages/backend && pnpm compile-config && node ./built/entry.js", + "start:inspect": "cd packages/backend && pnpm compile-config && node --inspect ./built/entry.js", + "start:test": "ncp ./.github/misskey/test.yml ./.config/test.yml && cd packages/backend && cross-env NODE_ENV=test pnpm compile-config && cross-env NODE_ENV=test node ./built/entry.js", "cli": "cd packages/backend && pnpm cli", "init": "pnpm migrate", "migrate": "cd packages/backend && pnpm migrate", diff --git a/packages/backend/build.js b/packages/backend/build.js deleted file mode 100644 index 52ca09b7a8..0000000000 --- a/packages/backend/build.js +++ /dev/null @@ -1,121 +0,0 @@ -import fs from 'node:fs'; -import { fileURLToPath } from 'node:url'; -import { dirname, join } from 'node:path'; -import { build } from 'esbuild'; -import { swcPlugin } from 'esbuild-plugin-swc'; - -const _filename = fileURLToPath(import.meta.url); -const _dirname = dirname(_filename); -const _package = JSON.parse(fs.readFileSync(_dirname + '/package.json', 'utf-8')); - -const resolveTsPathsPlugin = { - name: 'resolve-ts-paths', - setup(build) { - build.onResolve({ filter: /^\.{1,2}\/.*\.js$/ }, (args) => { - if (args.importer) { - const absPath = join(args.resolveDir, args.path); - const tsPath = absPath.slice(0, -3) + '.ts'; - if (fs.existsSync(tsPath)) return { path: tsPath }; - const tsxPath = absPath.slice(0, -3) + '.tsx'; - if (fs.existsSync(tsxPath)) return { path: tsxPath }; - } - }); - }, -}; - -const externalIpaddrPlugin = { - name: 'external-ipaddr', - setup(build) { - build.onResolve({ filter: /^ipaddr\.js$/ }, (args) => { - return { path: args.path, external: true }; - }); - }, -}; - -/** @type {import('esbuild').BuildOptions} */ -const options = { - entryPoints: ['./src/boot/entry.ts'], - minify: true, - keepNames: true, - bundle: true, - outdir: './built/boot', - target: 'node22', - platform: 'node', - format: 'esm', - sourcemap: 'linked', - packages: 'external', - banner: { - js: 'import { createRequire as topLevelCreateRequire } from "module";' + - 'import ___url___ from "url";' + - 'const require = topLevelCreateRequire(import.meta.url);' + - 'const __filename = ___url___.fileURLToPath(import.meta.url);' + - 'const __dirname = ___url___.fileURLToPath(new URL(".", import.meta.url));', - }, - plugins: [ - externalIpaddrPlugin, - resolveTsPathsPlugin, - swcPlugin({ - jsc: { - parser: { - syntax: 'typescript', - decorators: true, - dynamicImport: true, - }, - transform: { - legacyDecorator: true, - decoratorMetadata: true, - }, - experimental: { - keepImportAssertions: true, - }, - baseUrl: join(_dirname, 'src'), - paths: { - '@/*': ['*'], - }, - target: 'esnext', - keepClassNames: true, - }, - }), - externalIpaddrPlugin, - ], - // external: [ - // 'slacc-*', - // 'class-transformer', - // 'class-validator', - // '@sentry/*', - // '@nestjs/websockets/socket-module', - // '@nestjs/microservices/microservices-module', - // '@nestjs/microservices', - // '@napi-rs/canvas-win32-x64-msvc', - // 'mock-aws-s3', - // 'aws-sdk', - // 'nock', - // 'sharp', - // 'jsdom', - // 're2', - // '@napi-rs/canvas', - // ], -}; - -const args = process.argv.slice(2).map(arg => arg.toLowerCase()); - -if (!args.includes('--no-clean')) { - fs.rmSync('./built', { recursive: true, force: true }); -} - -await buildSrc(); - -async function buildSrc() { - console.log(`[${_package.name}] start building...`); - - await build(options) - .then(() => { - console.log(`[${_package.name}] build succeeded.`); - }) - .catch((err) => { - process.stderr.write(err.stderr || err.message || err); - process.exit(1); - }); - - console.log(`[${_package.name}] finish building.`); -} diff --git a/packages/backend/ormconfig.js b/packages/backend/ormconfig.js index 1a8c146451..dabc0893f4 100644 --- a/packages/backend/ormconfig.js +++ b/packages/backend/ormconfig.js @@ -1,6 +1,6 @@ import { DataSource } from 'typeorm'; -import { loadConfig } from './src-js/config.js'; -import { entities } from './src-js/postgres.js'; +import { loadConfig } from './built/config.js'; +import { entities } from './built/postgres.js'; const isConcurrentIndexMigrationEnabled = process.env.MISSKEY_MIGRATION_CREATE_INDEX_CONCURRENTLY === '1'; diff --git a/packages/backend/package.json b/packages/backend/package.json index 53574ecce7..a011eb83ab 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -7,21 +7,22 @@ "node": "^22.15.0 || ^24.10.0" }, "scripts": { - "start": "pnpm compile-config && node ./built/boot/entry.js", - "start:inspect": "pnpm compile-config && node --inspect ./built/boot/entry.js", - "start:test": "cross-env NODE_ENV=test pnpm compile-config && cross-env NODE_ENV=test node ./built/boot/entry.js", + "start": "pnpm compile-config && node ./built/entry.js", + "start:inspect": "pnpm compile-config && node --inspect ./built/entry.js", + "start:test": "cross-env NODE_ENV=test pnpm compile-config && cross-env NODE_ENV=test node ./built/entry.js", "migrate": "pnpm compile-config && pnpm typeorm migration:run -d ormconfig.js", "revert": "pnpm compile-config && pnpm typeorm migration:revert -d ormconfig.js", - "cli": "pnpm compile-config && node ./src-js/boot/cli.js", + "cli": "pnpm compile-config && node ./built/cli.js", "check:connect": "pnpm compile-config && node ./scripts/check_connect.js", "compile-config": "node ./scripts/compile_config.js", - "build": "swc src -d src-js -D --strip-leading-paths && node ./build.js", - "build:test": "swc test-server -d built-test -D --config-file test-server/.swcrc --strip-leading-paths", + "build": "rolldown -c", + "build:unit": "rolldown -c --sourcemap", + "build:e2e": "swc src -d src-js -D --strip-leading-paths && 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": "tsgo -p tsconfig.json && tsc-alias -p tsconfig.json", "watch": "pnpm compile-config && node ./scripts/watch.mjs", "restart": "pnpm build && pnpm start", - "dev": "pnpm compile-config && node ./scripts/dev.mjs", + "dev": "pnpm compile-config && rolldown -c --watch", "typecheck": "tsgo --noEmit && tsgo -p test --noEmit && tsgo -p test-federation --noEmit", "eslint": "eslint --quiet \"{src,test-federation}/**/*.ts\"", "lint": "pnpm typecheck && pnpm eslint", @@ -31,11 +32,11 @@ "jest-and-coverage": "cross-env NODE_ENV=test pnpm compile-config && cross-env NODE_ENV=test node ./jest.js --coverage --forceExit --config jest.config.unit.cjs", "jest-and-coverage:e2e": "cross-env NODE_ENV=test pnpm compile-config && cross-env NODE_ENV=test node ./jest.js --coverage --forceExit --config jest.config.e2e.cjs", "jest-clear": "cross-env NODE_ENV=test pnpm compile-config && cross-env NODE_ENV=test node ./jest.js --clearCache", - "test": "pnpm jest", - "test:e2e": "pnpm build && pnpm build:test && pnpm jest:e2e", + "test": "pnpm build:unit && pnpm jest", + "test:e2e": "pnpm build:e2e && pnpm jest:e2e", "test:fed": "pnpm jest:fed", - "test-and-coverage": "pnpm jest-and-coverage", - "test-and-coverage:e2e": "pnpm build && pnpm build:test && pnpm jest-and-coverage:e2e", + "test-and-coverage": "pnpm build:unit && pnpm jest-and-coverage", + "test-and-coverage:e2e": "pnpm build:e2e && pnpm jest-and-coverage:e2e", "check-migrations": "node scripts/check_migrations_clean.js", "generate-api-json": "pnpm compile-config && node ./scripts/generate_api_json.js" }, @@ -179,6 +180,7 @@ "@jest/globals": "29.7.0", "@kitajs/ts-html-plugin": "4.1.4", "@nestjs/platform-express": "11.1.18", + "@rollup/plugin-esm-shim": "0.1.8", "@sentry/vue": "10.47.0", "@simplewebauthn/types": "12.0.0", "@swc/jest": "0.2.39", @@ -217,15 +219,14 @@ "aws-sdk-client-mock": "4.1.0", "cbor": "10.0.12", "cross-env": "10.1.0", - "esbuild-plugin-swc": "1.0.1", "eslint-plugin-import": "2.32.0", "execa": "9.6.1", "fkill": "10.0.3", "jest": "29.7.0", "jest-mock": "29.7.0", "js-yaml": "4.1.1", - "nodemon": "3.1.14", "pid-port": "2.1.1", + "rolldown": "1.0.0-rc.15", "simple-oauth2": "5.1.0", "supertest": "7.2.2", "vite": "8.0.7" diff --git a/packages/backend/rolldown.config.ts b/packages/backend/rolldown.config.ts new file mode 100644 index 0000000000..382a1f7290 --- /dev/null +++ b/packages/backend/rolldown.config.ts @@ -0,0 +1,107 @@ +import { defineConfig } from 'rolldown'; +import type { Plugin, ExternalOption } from 'rolldown'; +import { execa, execaNode } from 'execa'; +import type { ResultPromise } from 'execa'; +import esmShim from '@rollup/plugin-esm-shim'; + +/** + * Watchモード時にバックエンドの起動・停止制御を行うプラグイン + */ +function backendDevServerPlugin(): Plugin { + let backendProcess: ResultPromise | null = null; + + async function runBuildAssets() { + await execa('pnpm', ['run', 'build-assets'], { + cwd: '../../', + stdout: process.stdout, + stderr: process.stderr, + }); + } + + async function killBackendProcess() { + if (backendProcess) { + backendProcess.catch(() => {}); // backendProcess.kill()によって発生する例外を無視するためにcatch()を呼び出す + backendProcess.kill(); + await new Promise(resolve => backendProcess!.on('exit', resolve)); + backendProcess = null; + } + } + + return { + name: 'backend-dev-server', + async closeBundle() { + await runBuildAssets(); + if (backendProcess) { + await killBackendProcess(); + } + backendProcess = execaNode('./built/entry.js', { + stdout: process.stdout, + stderr: process.stderr, + env: { + NODE_ENV: 'development', + }, + }); + }, + async watchChange() { + if (backendProcess) { + await killBackendProcess(); + await runBuildAssets(); + } + }, + }; +} + +export default defineConfig((args) => { + const isWatchMode = args.watch != null && args.watch !== 'false'; + + // 通常のビルド時にexternalとするモジュール + const externalModules: ExternalOption = [ + /^slacc-.*/, + 'class-transformer', + 'class-validator', + /^@sentry\/.*/, + /^@sentry-internal\/.*/, + '@nestjs/websockets/socket-module', + '@nestjs/microservices/microservices-module', + '@nestjs/microservices', + /^@napi-rs\/.*/, + 'mock-aws-s3', + 'aws-sdk', + 'nock', + 'sharp', + 'jsdom', + 're2', + 'ipaddr.js', + 'oauth2orize', + ]; + + return { + input: [ + './src/boot/entry.ts', + './src/boot/cli.ts', + './src/config.ts', + './src/postgres.ts', + './src/server/api/openapi/gen-spec.ts', + ], + platform: 'node', + tsconfig: true, + plugins: [ + esmShim(), + (isWatchMode ? backendDevServerPlugin() : undefined), + ], + output: { + keepNames: true, + minify: !isWatchMode, + sourcemap: isWatchMode, + dir: './built', + cleanDir: !isWatchMode, + format: 'esm', + }, + watch: { + include: ['src/**/*.{ts,js,mjs,cjs,tsx,json}'], + clearScreen: false, + }, + // ビルドの高速化のために、watchモードのときは外部モジュールは全てバンドルしないようにする + external: isWatchMode ? [/node_modules/] : externalModules, + }; +}); diff --git a/packages/backend/scripts/check_connect.js b/packages/backend/scripts/check_connect.js index a1cb839303..9e2f214e93 100644 --- a/packages/backend/scripts/check_connect.js +++ b/packages/backend/scripts/check_connect.js @@ -4,8 +4,8 @@ */ import Redis from 'ioredis'; -import { loadConfig } from '../src-js/config.js'; -import { createPostgresDataSource } from '../src-js/postgres.js'; +import { loadConfig } from '../built/config.js'; +import { createPostgresDataSource } from '../built/postgres.js'; const config = loadConfig(); diff --git a/packages/backend/scripts/dev.mjs b/packages/backend/scripts/dev.mjs deleted file mode 100644 index db96eaf976..0000000000 --- a/packages/backend/scripts/dev.mjs +++ /dev/null @@ -1,63 +0,0 @@ -/* - * SPDX-FileCopyrightText: syuilo and misskey-project - * SPDX-License-Identifier: AGPL-3.0-only - */ - -import { execa, execaNode } from 'execa'; - -/** @type {import('execa').ExecaChildProcess | undefined} */ -let backendProcess; - -async function execBuildAssets() { - await execa('pnpm', ['run', 'build-assets'], { - cwd: '../../', - stdout: process.stdout, - stderr: process.stderr, - }) -} - -function execStart() { - // pnpm run start を呼び出したいが、windowsだとプロセスグループ単位でのkillが出来ずゾンビプロセス化するので - // 上記と同等の動きをするコマンドで子・孫プロセスを作らないようにしたい - backendProcess = execaNode('./built/boot/entry.js', [], { - stdout: process.stdout, - stderr: process.stderr, - env: { - 'NODE_ENV': 'development', - }, - }); -} - -async function killProc() { - if (backendProcess) { - backendProcess.catch(() => {}); // backendProcess.kill()によって発生する例外を無視するためにcatch()を呼び出す - backendProcess.kill(); - await new Promise(resolve => backendProcess.on('exit', resolve)); - backendProcess = undefined; - } -} - -(async () => { - execaNode( - './node_modules/nodemon/bin/nodemon.js', - [ - '-w', 'src', - '-e', 'ts,js,mjs,cjs,tsx,json,pug', - '--exec', 'pnpm', 'run', 'build', - ], - { - stdio: [process.stdin, process.stdout, process.stderr, 'ipc'], - serialization: "json", - }) - .on('message', async (message) => { - if (message.type === 'exit') { - // かならずbuild->build-assetsの順番で呼び出したいので、 - // 少々トリッキーだがnodemonからのexitイベントを利用してbuild-assets->startを行う。 - // pnpm restartをbuildが終わる前にbuild-assetsが動いてしまうので、バラバラに呼び出す必要がある - - await killProc(); - await execBuildAssets(); - execStart(); - } - }) -})(); diff --git a/packages/backend/scripts/generate_api_json.js b/packages/backend/scripts/generate_api_json.js index 237f63a4d3..8a7e0b062d 100644 --- a/packages/backend/scripts/generate_api_json.js +++ b/packages/backend/scripts/generate_api_json.js @@ -19,10 +19,10 @@ async function main() { } /** @type {import('../src/config.js')} */ - const { loadConfig } = await import('../src-js/config.js'); + const { loadConfig } = await import('../built/config.js'); /** @type {import('../src/server/api/openapi/gen-spec.js')} */ - const { genOpenapiSpec } = await import('../src-js/server/api/openapi/gen-spec.js'); + const { genOpenapiSpec } = await import('../built/gen-spec.js'); const config = loadConfig(); const spec = genOpenapiSpec(config, true); diff --git a/packages/backend/scripts/measure-memory.mjs b/packages/backend/scripts/measure-memory.mjs index 3f30e24fb4..7c058a131d 100644 --- a/packages/backend/scripts/measure-memory.mjs +++ b/packages/backend/scripts/measure-memory.mjs @@ -55,7 +55,7 @@ async function getMemoryUsage(pid) { async function measureMemory() { // Start the Misskey backend server using fork to enable IPC - const serverProcess = fork(join(__dirname, '../built/boot/entry.js'), ['expose-gc'], { + const serverProcess = fork(join(__dirname, '../built/entry.js'), ['expose-gc'], { cwd: join(__dirname, '..'), env: { ...process.env, diff --git a/packages/backend/src/boot/common.ts b/packages/backend/src/boot/common.ts index 268c07582d..25cc7c6797 100644 --- a/packages/backend/src/boot/common.ts +++ b/packages/backend/src/boot/common.ts @@ -4,16 +4,12 @@ */ import { NestFactory } from '@nestjs/core'; -import { ChartManagementService } from '@/core/chart/ChartManagementService.js'; -import { QueueProcessorService } from '@/queue/QueueProcessorService.js'; import { NestLogger } from '@/NestLogger.js'; -import { QueueProcessorModule } from '@/queue/QueueProcessorModule.js'; -import { QueueStatsService } from '@/daemons/QueueStatsService.js'; -import { ServerStatsService } from '@/daemons/ServerStatsService.js'; -import { ServerService } from '@/server/ServerService.js'; -import { MainModule } from '@/MainModule.js'; export async function server() { + const { MainModule } = await import('../MainModule.js'); + const { ServerService } = await import('../server/ServerService.js'); + const app = await NestFactory.createApplicationContext(MainModule, { logger: new NestLogger(), }); @@ -22,6 +18,10 @@ export async function server() { await serverService.launch(); if (process.env.NODE_ENV !== 'test') { + const { ChartManagementService } = await import('../core/chart/ChartManagementService.js'); + const { QueueStatsService } = await import('../daemons/QueueStatsService.js'); + const { ServerStatsService } = await import('../daemons/ServerStatsService.js'); + app.get(ChartManagementService).start(); app.get(QueueStatsService).start(); app.get(ServerStatsService).start(); @@ -31,6 +31,10 @@ export async function server() { } export async function jobQueue() { + const { QueueProcessorModule } = await import('../queue/QueueProcessorModule.js'); + const { QueueProcessorService } = await import('../queue/QueueProcessorService.js'); + const { ChartManagementService } = await import('../core/chart/ChartManagementService.js'); + const jobQueue = await NestFactory.createApplicationContext(QueueProcessorModule, { logger: new NestLogger(), }); diff --git a/packages/backend/src/boot/entry.ts b/packages/backend/src/boot/entry.ts index 3a33d198a5..6e37bf9e1c 100644 --- a/packages/backend/src/boot/entry.ts +++ b/packages/backend/src/boot/entry.ts @@ -13,8 +13,6 @@ import chalk from 'chalk'; import Xev from 'xev'; import Logger from '@/logger.js'; import { envOption } from '../env.js'; -import { masterMain } from './master.js'; -import { workerMain } from './worker.js'; import { readyRef } from './ready.js'; import 'reflect-metadata'; @@ -71,10 +69,12 @@ process.on('exit', code => { if (!envOption.disableClustering) { if (cluster.isPrimary) { logger.info(`Start main process... pid: ${process.pid}`); + const { masterMain } = await import('./master.js'); await masterMain(); ev.mount(); } else if (cluster.isWorker) { logger.info(`Start worker process... pid: ${process.pid}`); + const { workerMain } = await import('./worker.js'); await workerMain(); } else { throw new Error('Unknown process type'); @@ -82,6 +82,7 @@ if (!envOption.disableClustering) { } else { // 非clusterの場合はMasterのみが起動するため、Workerの処理は行わない(cluster.isWorker === trueの状態でこのブロックに来ることはない) logger.info(`Start main process... pid: ${process.pid}`); + const { masterMain } = await import('./master.js'); await masterMain(); ev.mount(); } diff --git a/packages/backend/src/config.ts b/packages/backend/src/config.ts index 6a83359d38..d2b11ef9f4 100644 --- a/packages/backend/src/config.ts +++ b/packages/backend/src/config.ts @@ -190,6 +190,7 @@ export type Config = { userAgent: string; frontendManifestExists: boolean; frontendEmbedManifestExists: boolean; + rootDir: string; mediaProxy: string; externalMediaProxyEnabled: boolean; videoThumbnailGenerator: string | null; @@ -330,6 +331,7 @@ export function loadConfig(): Config { userAgent: `Misskey/${version} (${config.url})`, frontendManifestExists: frontendManifestExists, frontendEmbedManifestExists: frontendEmbedManifestExists, + rootDir, perChannelMaxNoteCacheCount: config.perChannelMaxNoteCacheCount ?? 1000, perUserNotificationsMaxCount: config.perUserNotificationsMaxCount ?? 500, deactivateAntennaThreshold: config.deactivateAntennaThreshold ?? (1000 * 60 * 60 * 24 * 7), diff --git a/packages/backend/src/core/AiService.ts b/packages/backend/src/core/AiService.ts index 7d60995a7d..855ccc8b98 100644 --- a/packages/backend/src/core/AiService.ts +++ b/packages/backend/src/core/AiService.ts @@ -4,27 +4,31 @@ */ import * as fs from 'node:fs'; -import { fileURLToPath } from 'node:url'; -import { dirname } from 'node:path'; -import { Injectable } from '@nestjs/common'; +import { pathToFileURL } from 'node:url'; +import { resolve } from 'node:path'; +import { Injectable, Inject } from '@nestjs/common'; import { Mutex } from 'async-mutex'; import fetch from 'node-fetch'; +import { DI } from '@/di-symbols.js'; import { bindThis } from '@/decorators.js'; +import type { Config } from '@/config.js'; import type { NSFWJS, PredictionType } from 'nsfwjs/core'; -const _filename = fileURLToPath(import.meta.url); -const _dirname = dirname(_filename); - const REQUIRED_CPU_FLAGS_X64 = ['avx2', 'fma']; let isSupportedCpu: undefined | boolean = undefined; @Injectable() export class AiService { + private readonly modelDir: string; private model: NSFWJS; private modelLoadMutex: Mutex = new Mutex(); constructor( + @Inject(DI.config) + private config: Config, ) { + const md = resolve(this.config.rootDir, 'packages/backend/nsfw-model'); + this.modelDir = md.endsWith('/') ? md : md + '/'; } @bindThis @@ -46,7 +50,7 @@ export class AiService { const nsfw = await import('nsfwjs/core'); await this.modelLoadMutex.runExclusive(async () => { if (this.model == null) { - this.model = await nsfw.load(`file://${_dirname}/../../nsfw-model/`, { size: 299 }); + this.model = await nsfw.load(pathToFileURL(this.modelDir).toString(), { size: 299 }); } }); } diff --git a/packages/backend/src/core/InternalStorageService.ts b/packages/backend/src/core/InternalStorageService.ts index 4fb8a93e49..1f2f543962 100644 --- a/packages/backend/src/core/InternalStorageService.ts +++ b/packages/backend/src/core/InternalStorageService.ts @@ -5,29 +5,25 @@ import * as fs from 'node:fs'; import * as Path from 'node:path'; -import { fileURLToPath } from 'node:url'; -import { dirname } from 'node:path'; import { Inject, Injectable } from '@nestjs/common'; import { DI } from '@/di-symbols.js'; import type { Config } from '@/config.js'; import { bindThis } from '@/decorators.js'; -const _filename = fileURLToPath(import.meta.url); -const _dirname = dirname(_filename); - -const path = Path.resolve(_dirname, '../../../../files'); - @Injectable() export class InternalStorageService { + private readonly path: string; + constructor( @Inject(DI.config) private config: Config, ) { + this.path = Path.resolve(this.config.rootDir, 'files'); } @bindThis public resolvePath(key: string) { - return Path.resolve(path, key); + return Path.resolve(this.path, key); } @bindThis @@ -37,14 +33,14 @@ export class InternalStorageService { @bindThis public saveFromPath(key: string, srcPath: string) { - fs.mkdirSync(path, { recursive: true }); + fs.mkdirSync(this.path, { recursive: true }); fs.copyFileSync(srcPath, this.resolvePath(key)); return `${this.config.url}/files/${key}`; } @bindThis public saveFromBuffer(key: string, data: Buffer) { - fs.mkdirSync(path, { recursive: true }); + fs.mkdirSync(this.path, { recursive: true }); fs.writeFileSync(this.resolvePath(key), data); return `${this.config.url}/files/${key}`; } diff --git a/packages/backend/src/server/FileServerService.ts b/packages/backend/src/server/FileServerService.ts index f5034d0733..4a5ac799ad 100644 --- a/packages/backend/src/server/FileServerService.ts +++ b/packages/backend/src/server/FileServerService.ts @@ -4,8 +4,7 @@ */ import * as fs from 'node:fs'; -import { fileURLToPath } from 'node:url'; -import { dirname } from 'node:path'; +import { resolve } from 'node:path'; import { Inject, Injectable } from '@nestjs/common'; import type { Config } from '@/config.js'; import type { DriveFilesRepository } from '@/models/_.js'; @@ -25,11 +24,6 @@ import { FileServerFileResolver } from './file/FileServerFileResolver.js'; import { FileServerProxyHandler } from './file/FileServerProxyHandler.js'; import type { FastifyInstance, FastifyRequest, FastifyReply, FastifyPluginOptions } from 'fastify'; -const _filename = fileURLToPath(import.meta.url); -const _dirname = dirname(_filename); - -const assets = `${_dirname}/../../server/file/assets/`; - @Injectable() export class FileServerService { private logger: Logger; @@ -37,6 +31,8 @@ export class FileServerService { private proxyHandler: FileServerProxyHandler; private fileResolver: FileServerFileResolver; + private readonly assets: string; + constructor( @Inject(DI.config) private config: Config, @@ -52,6 +48,7 @@ export class FileServerService { private loggerService: LoggerService, ) { this.logger = this.loggerService.getLogger('server', 'gray'); + this.assets = resolve(this.config.rootDir, 'packages/backend/src/server/file/assets'); this.fileResolver = new FileServerFileResolver( this.driveFilesRepository, this.fileInfoService, @@ -61,13 +58,13 @@ export class FileServerService { this.driveHandler = new FileServerDriveHandler( this.config, this.fileResolver, - assets, + this.assets, this.videoProcessingService, ); this.proxyHandler = new FileServerProxyHandler( this.config, this.fileResolver, - assets, + this.assets, this.imageProcessingService, ); @@ -87,7 +84,7 @@ export class FileServerService { fastify.register((fastify, options, done) => { fastify.addHook('onRequest', handleRequestRedirectToOmitSearch); fastify.get('/files/app-default.jpg', (request, reply) => { - const file = fs.createReadStream(`${_dirname}/assets/dummy.png`); + const file = fs.createReadStream(`${this.assets}/dummy.png`); reply.header('Content-Type', 'image/jpeg'); reply.header('Cache-Control', 'max-age=31536000, immutable'); return reply.send(file); @@ -121,7 +118,7 @@ export class FileServerService { reply.header('Cache-Control', 'max-age=300'); if (request.query && 'fallback' in request.query) { - return reply.sendFile('/dummy.png', assets); + return reply.sendFile('/dummy.png', this.assets); } if (err instanceof StatusError && (err.statusCode === 302 || err.isClientError)) { diff --git a/packages/backend/src/server/web/ClientServerService.ts b/packages/backend/src/server/web/ClientServerService.ts index 49a802632f..7bbe78af61 100644 --- a/packages/backend/src/server/web/ClientServerService.ts +++ b/packages/backend/src/server/web/ClientServerService.ts @@ -4,9 +4,7 @@ */ import { randomUUID } from 'node:crypto'; -import { dirname, resolve } from 'node:path'; -import { fileURLToPath } from 'node:url'; -import * as fs from 'node:fs'; +import { resolve } from 'node:path'; import { Inject, Injectable } from '@nestjs/common'; import ms from 'ms'; import sharp from 'sharp'; @@ -67,35 +65,17 @@ import { ErrorPage } from './views/error.js'; import type { FastifyError, FastifyInstance, FastifyPluginOptions, FastifyReply } from 'fastify'; -const _filename = fileURLToPath(import.meta.url); -const _dirname = dirname(_filename); - -let rootDir = _dirname; -// 見つかるまで上に遡る -while (!fs.existsSync(resolve(rootDir, 'packages'))) { - const parentDir = dirname(rootDir); - if (parentDir === rootDir) { - throw new Error('Cannot find root directory'); - } - rootDir = parentDir; -} - -const backendRootDir = resolve(rootDir, 'packages/backend'); -const frontendRootDir = resolve(rootDir, 'packages/frontend'); - -const staticAssets = resolve(backendRootDir, 'assets'); -const clientAssets = resolve(frontendRootDir, 'assets'); -const assets = resolve(rootDir, 'built/_frontend_dist_'); -const swAssets = resolve(rootDir, 'built/_sw_dist_'); -const fluentEmojisDir = resolve(rootDir, 'fluent-emojis/dist'); -const twemojiDir = resolve(backendRootDir, 'node_modules/@discordapp/twemoji/dist/svg'); -const frontendViteOut = resolve(rootDir, 'built/_frontend_vite_'); -const frontendEmbedViteOut = resolve(rootDir, 'built/_frontend_embed_vite_'); -const tarball = resolve(rootDir, 'built/tarball'); - @Injectable() export class ClientServerService { - private logger: Logger; + private readonly staticAssets: string; + private readonly clientAssets: string; + private readonly assets: string; + private readonly swAssets: string; + private readonly fluentEmojisDir: string; + private readonly twemojiDir: string; + private readonly frontendViteOut: string; + private readonly frontendEmbedViteOut: string; + private readonly tarball: string; constructor( @Inject(DI.config) @@ -149,6 +129,17 @@ export class ClientServerService { private clientLoggerService: ClientLoggerService, ) { //this.createServer = this.createServer.bind(this); + const backendRootdir = resolve(this.config.rootDir, 'packages/backend'); + const frontendRootdir = resolve(this.config.rootDir, 'packages/frontend'); + this.staticAssets = resolve(backendRootdir, 'assets'); + this.clientAssets = resolve(frontendRootdir, 'assets'); + this.assets = resolve(this.config.rootDir, 'built/_frontend_dist_'); + this.swAssets = resolve(this.config.rootDir, 'built/_sw_dist_'); + this.fluentEmojisDir = resolve(this.config.rootDir, 'fluent-emojis/dist'); + this.twemojiDir = resolve(backendRootdir, 'node_modules/@discordapp/twemoji/dist/svg'); + this.frontendViteOut = resolve(this.config.rootDir, 'built/_frontend_vite_'); + this.frontendEmbedViteOut = resolve(this.config.rootDir, 'built/_frontend_embed_vite_'); + this.tarball = resolve(this.config.rootDir, 'built/tarball'); } @bindThis @@ -223,17 +214,17 @@ export class ClientServerService { //#region vite assets if (this.config.frontendEmbedManifestExists) { - console.log(`[ClientServerService] Using built frontend vite assets. ${frontendViteOut}`); + console.log(`[ClientServerService] Using built frontend vite assets. ${this.frontendViteOut}`); fastify.register((fastify, options, done) => { fastify.register(fastifyStatic, { - root: frontendViteOut, + root: this.frontendViteOut, prefix: '/vite/', maxAge: ms('30 days'), immutable: true, decorateReply: false, }); fastify.register(fastifyStatic, { - root: frontendEmbedViteOut, + root: this.frontendEmbedViteOut, prefix: '/embed_vite/', maxAge: ms('30 days'), immutable: true, @@ -265,21 +256,21 @@ export class ClientServerService { //#region static assets fastify.register(fastifyStatic, { - root: staticAssets, + root: this.staticAssets, prefix: '/static-assets/', maxAge: ms('7 days'), decorateReply: false, }); fastify.register(fastifyStatic, { - root: clientAssets, + root: this.clientAssets, prefix: '/client-assets/', maxAge: ms('7 days'), decorateReply: false, }); fastify.register(fastifyStatic, { - root: assets, + root: this.assets, prefix: '/assets/', maxAge: ms('7 days'), decorateReply: false, @@ -287,7 +278,7 @@ export class ClientServerService { fastify.register((fastify, options, done) => { fastify.register(fastifyStatic, { - root: tarball, + root: this.tarball, prefix: '/tarball/', maxAge: ms('30 days'), immutable: true, @@ -298,11 +289,11 @@ export class ClientServerService { }); fastify.get('/favicon.ico', async (request, reply) => { - return reply.sendFile('/favicon.ico', staticAssets); + return reply.sendFile('/favicon.ico', this.staticAssets); }); fastify.get('/apple-touch-icon.png', async (request, reply) => { - return reply.sendFile('/apple-touch-icon.png', staticAssets); + return reply.sendFile('/apple-touch-icon.png', this.staticAssets); }); fastify.get<{ Params: { path: string } }>('/fluent-emoji/:path(.*)', async (request, reply) => { @@ -315,7 +306,7 @@ export class ClientServerService { reply.header('Content-Security-Policy', 'default-src \'none\'; style-src \'unsafe-inline\''); - return reply.sendFile(path, fluentEmojisDir, { + return reply.sendFile(path, this.fluentEmojisDir, { maxAge: ms('30 days'), }); }); @@ -330,7 +321,7 @@ export class ClientServerService { reply.header('Content-Security-Policy', 'default-src \'none\'; style-src \'unsafe-inline\''); - return reply.sendFile(path, twemojiDir, { + return reply.sendFile(path, this.twemojiDir, { maxAge: ms('30 days'), }); }); @@ -344,7 +335,7 @@ export class ClientServerService { } const mask = await sharp( - `${twemojiDir}/${path.replace('.png', '')}.svg`, + `${this.twemojiDir}/${path.replace('.png', '')}.svg`, { density: 1000 }, ) .resize(488, 488) @@ -380,7 +371,7 @@ export class ClientServerService { // ServiceWorker fastify.get('/sw.js', async (request, reply) => { - return await reply.sendFile('/sw.js', swAssets, { + return await reply.sendFile('/sw.js', this.swAssets, { maxAge: ms('10 minutes'), }); }); @@ -390,7 +381,7 @@ export class ClientServerService { // Embed Javascript fastify.get('/embed.js', async (request, reply) => { - return await reply.sendFile('/embed.js', staticAssets, { + return await reply.sendFile('/embed.js', this.staticAssets, { maxAge: ms('1 day'), }); }); diff --git a/packages/backend/src/server/web/HtmlTemplateService.ts b/packages/backend/src/server/web/HtmlTemplateService.ts index 36272c81d5..2859b2b985 100644 --- a/packages/backend/src/server/web/HtmlTemplateService.ts +++ b/packages/backend/src/server/web/HtmlTemplateService.ts @@ -3,9 +3,8 @@ * SPDX-License-Identifier: AGPL-3.0-only */ -import { dirname, resolve } from 'node:path'; -import { fileURLToPath } from 'node:url'; -import { promises as fsp, existsSync } from 'node:fs'; +import { resolve } from 'node:path'; +import { promises as fsp } from 'node:fs'; import { languages } from 'i18n/const'; import { Injectable, Inject } from '@nestjs/common'; import { DI } from '@/di-symbols.js'; @@ -18,25 +17,11 @@ import type { Config } from '@/config.js'; import type { MiMeta } from '@/models/Meta.js'; import type { CommonData, ViteFiles } from './views/_.js'; -const _filename = fileURLToPath(import.meta.url); -const _dirname = dirname(_filename); - -let rootDir = _dirname; -// 見つかるまで上に遡る -while (!existsSync(resolve(rootDir, 'packages'))) { - const parentDir = dirname(rootDir); - if (parentDir === rootDir) { - throw new Error('Cannot find root directory'); - } - rootDir = parentDir; -} - -const frontendViteBuilt = resolve(rootDir, 'built/_frontend_vite_'); -const frontendEmbedViteBuilt = resolve(rootDir, 'built/_frontend_embed_vite_'); - @Injectable() export class HtmlTemplateService { private frontendAssetsFetched = false; + private readonly frontendViteBuilt: string; + private readonly frontendEmbedViteBuilt: string; public frontendViteFiles: ViteFiles | null = null; public frontendBootloaderJs: string | null = null; public frontendBootloaderCss: string | null = null; @@ -53,6 +38,8 @@ export class HtmlTemplateService { private metaEntityService: MetaEntityService, ) { + this.frontendViteBuilt = resolve(this.config.rootDir, 'built/_frontend_vite_'); + this.frontendEmbedViteBuilt = resolve(this.config.rootDir, 'built/_frontend_embed_vite_'); } // 初期ロードで読み込むべきファイルのパスを収集する。 @@ -118,22 +105,22 @@ export class HtmlTemplateService { embedBootJs, embedBootCss, ] = await Promise.all([ - fsp.readFile(resolve(frontendViteBuilt, 'loader/boot.js'), 'utf-8').catch(() => null), - fsp.readFile(resolve(frontendViteBuilt, 'loader/style.css'), 'utf-8').catch(() => null), - fsp.readFile(resolve(frontendEmbedViteBuilt, 'loader/boot.js'), 'utf-8').catch(() => null), - fsp.readFile(resolve(frontendEmbedViteBuilt, 'loader/style.css'), 'utf-8').catch(() => null), + fsp.readFile(resolve(this.frontendViteBuilt, 'loader/boot.js'), 'utf-8').catch(() => null), + fsp.readFile(resolve(this.frontendViteBuilt, 'loader/style.css'), 'utf-8').catch(() => null), + fsp.readFile(resolve(this.frontendEmbedViteBuilt, 'loader/boot.js'), 'utf-8').catch(() => null), + fsp.readFile(resolve(this.frontendEmbedViteBuilt, 'loader/style.css'), 'utf-8').catch(() => null), ]); let feViteManifest: Manifest | null = null; let embedFeViteManifest: Manifest | null = null; if (this.config.frontendManifestExists) { - const manifestContent = await fsp.readFile(resolve(frontendViteBuilt, 'manifest.json'), 'utf-8').catch(() => null); + const manifestContent = await fsp.readFile(resolve(this.frontendViteBuilt, 'manifest.json'), 'utf-8').catch(() => null); feViteManifest = manifestContent ? JSON.parse(manifestContent) : null; } if (this.config.frontendEmbedManifestExists) { - const manifestContent = await fsp.readFile(resolve(frontendEmbedViteBuilt, 'manifest.json'), 'utf-8').catch(() => null); + const manifestContent = await fsp.readFile(resolve(this.frontendEmbedViteBuilt, 'manifest.json'), 'utf-8').catch(() => null); embedFeViteManifest = manifestContent ? JSON.parse(manifestContent) : null; } diff --git a/packages/backend/test/unit/server/FileServerService.ts b/packages/backend/test/unit/server/FileServerService.ts index c88175c5c7..c4fc584ea3 100644 --- a/packages/backend/test/unit/server/FileServerService.ts +++ b/packages/backend/test/unit/server/FileServerService.ts @@ -296,7 +296,7 @@ describe('FileServerService', () => { }); expect(res.statusCode).toBe(404); - expect(res.headers['cache-control']).toBe('max-age=86400'); + expect(res.headers['cache-control']).toBe('public, max-age=0'); }); test('GET /files/:key 画像配信ヘッダを検証する', async () => { diff --git a/packages/frontend-builder/package.json b/packages/frontend-builder/package.json index 59efa18997..b02d3e16ee 100644 --- a/packages/frontend-builder/package.json +++ b/packages/frontend-builder/package.json @@ -20,7 +20,7 @@ "estree-walker": "3.0.3", "i18n": "workspace:*", "magic-string": "0.30.21", - "rolldown": "1.0.0-rc.13", + "rolldown": "1.0.0-rc.15", "vite": "8.0.7" } } diff --git a/packages/frontend-embed/package.json b/packages/frontend-embed/package.json index 640d7f2fd7..72dbb961a4 100644 --- a/packages/frontend-embed/package.json +++ b/packages/frontend-embed/package.json @@ -52,7 +52,6 @@ "intersection-observer": "0.12.2", "micromatch": "4.0.8", "msw": "2.12.14", - "nodemon": "3.1.14", "prettier": "3.8.1", "sass-embedded": "1.99.0", "start-server-and-test": "2.1.5", diff --git a/packages/frontend/package.json b/packages/frontend/package.json index bed86fc3fe..4fdaae5f00 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -127,7 +127,7 @@ "prettier": "3.8.1", "react": "19.2.4", "react-dom": "19.2.4", - "rolldown": "1.0.0-rc.13", + "rolldown": "1.0.0-rc.15", "sass-embedded": "1.99.0", "seedrandom": "3.0.5", "start-server-and-test": "2.1.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b5fc02de04..b901155409 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -409,6 +409,9 @@ importers: '@nestjs/platform-express': specifier: 11.1.18 version: 11.1.18(@nestjs/common@11.1.18(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.18) + '@rollup/plugin-esm-shim': + specifier: 0.1.8 + version: 0.1.8(rollup@4.60.1) '@sentry/vue': specifier: 10.47.0 version: 10.47.0(vue@3.5.32(typescript@5.9.3)) @@ -523,9 +526,6 @@ importers: cross-env: specifier: 10.1.0 version: 10.1.0 - esbuild-plugin-swc: - specifier: 1.0.1 - version: 1.0.1 eslint-plugin-import: specifier: 2.32.0 version: 2.32.0(@typescript-eslint/parser@8.58.0(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4) @@ -544,12 +544,12 @@ importers: js-yaml: specifier: 4.1.1 version: 4.1.1 - nodemon: - specifier: 3.1.14 - version: 3.1.14 pid-port: specifier: 2.1.1 version: 2.1.1 + rolldown: + specifier: 1.0.0-rc.15 + version: 1.0.0-rc.15 simple-oauth2: specifier: 5.1.0 version: 5.1.0 @@ -979,8 +979,8 @@ importers: specifier: 19.2.4 version: 19.2.4(react@19.2.4) rolldown: - specifier: 1.0.0-rc.13 - version: 1.0.0-rc.13 + specifier: 1.0.0-rc.15 + version: 1.0.0-rc.15 sass-embedded: specifier: 1.99.0 version: 1.99.0 @@ -1036,8 +1036,8 @@ importers: specifier: 0.30.21 version: 0.30.21 rolldown: - specifier: 1.0.0-rc.13 - version: 1.0.0-rc.13 + specifier: 1.0.0-rc.15 + version: 1.0.0-rc.15 vite: specifier: 8.0.7 version: 8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.1)(tsx@4.21.0) @@ -1181,9 +1181,6 @@ importers: msw: specifier: 2.12.14 version: 2.12.14(@types/node@24.12.2)(typescript@5.9.3) - nodemon: - specifier: 3.1.14 - version: 3.1.14 prettier: specifier: 3.8.1 version: 3.8.1 @@ -1958,12 +1955,21 @@ packages: '@emnapi/core@1.9.1': resolution: {integrity: sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==} + '@emnapi/core@1.9.2': + resolution: {integrity: sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==} + '@emnapi/runtime@1.9.1': resolution: {integrity: sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==} + '@emnapi/runtime@1.9.2': + resolution: {integrity: sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==} + '@emnapi/wasi-threads@1.2.0': resolution: {integrity: sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==} + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + '@epic-web/invariant@1.0.0': resolution: {integrity: sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==} @@ -3033,8 +3039,8 @@ packages: resolution: {integrity: sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw==} engines: {node: '>= 10'} - '@napi-rs/wasm-runtime@1.1.2': - resolution: {integrity: sha512-sNXv5oLJ7ob93xkZ1XnxisYhGYXfaG9f65/ZgYuAu3qt7b3NadcOEhLvx28hv31PgX8SZJRYrAIPQilQmFpLVw==} + '@napi-rs/wasm-runtime@1.1.3': + resolution: {integrity: sha512-xK9sGVbJWYb08+mTJt3/YV24WxvxpXcXtP6B172paPZ+Ts69Re9dAr7lKwJoeIx8OoeuimEiRZ7umkiUVClmmQ==} peerDependencies: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 @@ -3341,6 +3347,9 @@ packages: '@oxc-project/types@0.123.0': resolution: {integrity: sha512-YtECP/y8Mj1lSHiUWGSRzy/C6teUKlS87dEfuVKT09LgQbUsBW1rNg+MiJ4buGu3yuADV60gbIvo9/HplA56Ew==} + '@oxc-project/types@0.124.0': + resolution: {integrity: sha512-VBFWMTBvHxS11Z5Lvlr3IWgrwhMTXV+Md+EQF0Xf60+wAdsGFTBx7X7K/hP4pi8N7dcm1RvcHwDxZ16Qx8keUg==} + '@paralleldrive/cuid2@2.3.1': resolution: {integrity: sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==} @@ -3517,30 +3526,60 @@ packages: cpu: [arm64] os: [android] + '@rolldown/binding-android-arm64@1.0.0-rc.15': + resolution: {integrity: sha512-YYe6aWruPZDtHNpwu7+qAHEMbQ/yRl6atqb/AhznLTnD3UY99Q1jE7ihLSahNWkF4EqRPVC4SiR4O0UkLK02tA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + '@rolldown/binding-darwin-arm64@1.0.0-rc.13': resolution: {integrity: sha512-tz/v/8G77seu8zAB3A5sK3UFoOl06zcshEzhUO62sAEtrEuW/H1CcyoupOrD+NbQJytYgA4CppXPzlrmp4JZKA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] + '@rolldown/binding-darwin-arm64@1.0.0-rc.15': + resolution: {integrity: sha512-oArR/ig8wNTPYsXL+Mzhs0oxhxfuHRfG7Ikw7jXsw8mYOtk71W0OkF2VEVh699pdmzjPQsTjlD1JIOoHkLP1Fg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + '@rolldown/binding-darwin-x64@1.0.0-rc.13': resolution: {integrity: sha512-8DakphqOz8JrMYWTJmWA+vDJxut6LijZ8Xcdc4flOlAhU7PNVwo2MaWBF9iXjJAPo5rC/IxEFZDhJ3GC7NHvug==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] + '@rolldown/binding-darwin-x64@1.0.0-rc.15': + resolution: {integrity: sha512-YzeVqOqjPYvUbJSWJ4EDL8ahbmsIXQpgL3JVipmN+MX0XnXMeWomLN3Fb+nwCmP/jfyqte5I3XRSm7OfQrbyxw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + '@rolldown/binding-freebsd-x64@1.0.0-rc.13': resolution: {integrity: sha512-4wBQFfjDuXYN/SVI8inBF3Aa+isq40rc6VMFbk5jcpolUBTe5cYnMsHZ51nFWsx3PVyyNN3vgoESki0Hmr/4BA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] + '@rolldown/binding-freebsd-x64@1.0.0-rc.15': + resolution: {integrity: sha512-9Erhx956jeQ0nNTyif1+QWAXDRD38ZNjr//bSHrt6wDwB+QkAfl2q6Mn1k6OBPerznjRmbM10lgRb1Pli4xZPw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.13': resolution: {integrity: sha512-JW/e4yPIXLms+jmnbwwy5LA/LxVwZUWLN8xug+V200wzaVi5TEGIWQlh8o91gWYFxW609euI98OCCemmWGuPrw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.15': + resolution: {integrity: sha512-cVwk0w8QbZJGTnP/AHQBs5yNwmpgGYStL88t4UIaqcvYJWBfS0s3oqVLZPwsPU6M0zlW4GqjP0Zq5MnAGwFeGA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.13': resolution: {integrity: sha512-ZfKWpXiUymDnavepCaM6KG/uGydJ4l2nBmMxg60Ci4CbeefpqjPWpfaZM7PThOhk2dssqBAcwLc6rAyr0uTdXg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3548,6 +3587,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.15': + resolution: {integrity: sha512-eBZ/u8iAK9SoHGanqe/jrPnY0JvBN6iXbVOsbO38mbz+ZJsaobExAm1Iu+rxa4S1l2FjG0qEZn4Rc6X8n+9M+w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.13': resolution: {integrity: sha512-bmRg3O6Z0gq9yodKKWCIpnlH051sEfdVwt+6m5UDffAQMUUqU0xjnQqqAUm+Gu7ofAAly9DqiQDtKu2nPDEABA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3555,6 +3601,13 @@ packages: os: [linux] libc: [musl] + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.15': + resolution: {integrity: sha512-ZvRYMGrAklV9PEkgt4LQM6MjQX2P58HPAuecwYObY2DhS2t35R0I810bKi0wmaYORt6m/2Sm+Z+nFgb0WhXNcQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.13': resolution: {integrity: sha512-8Wtnbw4k7pMYN9B/mOEAsQ8HOiq7AZ31Ig4M9BKn2So4xRaFEhtCSa4ZJaOutOWq50zpgR4N5+L/opnlaCx8wQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3562,6 +3615,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.15': + resolution: {integrity: sha512-VDpgGBzgfg5hLg+uBpCLoFG5kVvEyafmfxGUV0UHLcL5irxAK7PKNeC2MwClgk6ZAiNhmo9FLhRYgvMmedLtnQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.13': resolution: {integrity: sha512-D/0Nlo8mQuxSMohNJUF2lDXWRsFDsHldfRRgD9bRgktj+EndGPj4DOV37LqDKPYS+osdyhZEH7fTakTAEcW7qg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3569,6 +3629,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.15': + resolution: {integrity: sha512-y1uXY3qQWCzcPgRJATPSOUP4tCemh4uBdY7e3EZbVwCJTY3gLJWnQABgeUetvED+bt1FQ01OeZwvhLS2bpNrAQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.13': resolution: {integrity: sha512-eRrPvat2YaVQcwwKi/JzOP6MKf1WRnOCr+VaI3cTWz3ZoLcP/654z90lVCJ4dAuMEpPdke0n+qyAqXDZdIC4rA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3576,6 +3643,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.15': + resolution: {integrity: sha512-023bTPBod7J3Y/4fzAN6QtpkSABR0rigtrwaP+qSEabUh5zf6ELr9Nc7GujaROuPY3uwdSIXWrvhn1KxOvurWA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-x64-musl@1.0.0-rc.13': resolution: {integrity: sha512-PsdONiFRp8hR8KgVjTWjZ9s7uA3uueWL0t74/cKHfM4dR5zXYv4AjB8BvA+QDToqxAFg4ZkcVEqeu5F7inoz5w==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3583,35 +3657,77 @@ packages: os: [linux] libc: [musl] + '@rolldown/binding-linux-x64-musl@1.0.0-rc.15': + resolution: {integrity: sha512-witB2O0/hU4CgfOOKUoeFgQ4GktPi1eEbAhaLAIpgD6+ZnhcPkUtPsoKKHRzmOoWPZue46IThdSgdo4XneOLYw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + '@rolldown/binding-openharmony-arm64@1.0.0-rc.13': resolution: {integrity: sha512-hCNXgC5dI3TVOLrPT++PKFNZ+1EtS0mLQwfXXXSUD/+rGlB65gZDwN/IDuxLpQP4x8RYYHqGomlUXzpO8aVI2w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] + '@rolldown/binding-openharmony-arm64@1.0.0-rc.15': + resolution: {integrity: sha512-UCL68NJ0Ud5zRipXZE9dF5PmirzJE4E4BCIOOssEnM7wLDsxjc6Qb0sGDxTNRTP53I6MZpygyCpY8Aa8sPfKPg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + '@rolldown/binding-wasm32-wasi@1.0.0-rc.13': resolution: {integrity: sha512-viLS5C5et8NFtLWw9Sw3M/w4vvnVkbWkO7wSNh3C+7G1+uCkGpr6PcjNDSFcNtmXY/4trjPBqUfcOL+P3sWy/g==} engines: {node: '>=14.0.0'} cpu: [wasm32] + '@rolldown/binding-wasm32-wasi@1.0.0-rc.15': + resolution: {integrity: sha512-ApLruZq/ig+nhaE7OJm4lDjayUnOHVUa77zGeqnqZ9pn0ovdVbbNPerVibLXDmWeUZXjIYIT8V3xkT58Rm9u5Q==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.13': resolution: {integrity: sha512-Fqa3Tlt1xL4wzmAYxGNFV36Hb+VfPc9PYU+E25DAnswXv3ODDu/yyWjQDbXMo5AGWkQVjLgQExuVu8I/UaZhPQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.15': + resolution: {integrity: sha512-KmoUoU7HnN+Si5YWJigfTws1jz1bKBYDQKdbLspz0UaqjjFkddHsqorgiW1mxcAj88lYUE6NC/zJNwT+SloqtA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.13': resolution: {integrity: sha512-/pLI5kPkGEi44TDlnbio3St/5gUFeN51YWNAk/Gnv6mEQBOahRBh52qVFVBpmrnU01n2yysvBML9Ynu7K4kGAQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.15': + resolution: {integrity: sha512-3P2A8L+x75qavWLe/Dll3EYBJLQmtkJN8rfh+U/eR3MqMgL/h98PhYI+JFfXuDPgPeCB7iZAKiqii5vqOvnA0g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@rolldown/pluginutils@1.0.0-rc.13': resolution: {integrity: sha512-3ngTAv6F/Py35BsYbeeLeecvhMKdsKm4AoOETVhAA+Qc8nrA2I0kF7oa93mE9qnIurngOSpMnQ0x2nQY2FPviA==} + '@rolldown/pluginutils@1.0.0-rc.15': + resolution: {integrity: sha512-UromN0peaE53IaBRe9W7CjrZgXl90fqGpK+mIZbA3qSTeYqg3pqpROBdIPvOG3F5ereDHNwoHBI2e50n1BDr1g==} + '@rolldown/pluginutils@1.0.0-rc.2': resolution: {integrity: sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==} + '@rollup/plugin-esm-shim@0.1.8': + resolution: {integrity: sha512-xEU0b/BShgDDSPjidhJd4R74J9xZ9jLVtFWNGtsUXyEsdwwwB1a3XOAwwGaNIyUHD6EhxPO21JMfUmJWoMn7SA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + '@rollup/plugin-json@6.1.0': resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} engines: {node: '>=14.0.0'} @@ -6092,6 +6208,9 @@ packages: resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} engines: {'0': node >= 6.0} + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} @@ -6619,9 +6738,6 @@ packages: es6-promisify@5.0.0: resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - esbuild-plugin-swc@1.0.1: - resolution: {integrity: sha512-K/basZARuDSHH7Krr7FdzwZF4WRLTcZa4c0R2FPuXCyYdh2nZMDdi6SYuuDv0MzKQY+jm0Afl4gltLsBzPesiQ==} - esbuild@0.27.4: resolution: {integrity: sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==} engines: {node: '>=18'} @@ -8621,6 +8737,9 @@ packages: engines: {node: '>=10'} hasBin: true + mlly@1.8.2: + resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} + mock-socket@9.3.1: resolution: {integrity: sha512-qxBgB7Qa2sEQgHFjj0dSigq7fX4k6Saisd5Nelwp2q8mlbAFh5dHV9JTTlF8viYJLSSWgMCZFUom8PJcMNBoJw==} engines: {node: '>= 8'} @@ -9184,6 +9303,9 @@ packages: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + plimit-lit@1.6.1: resolution: {integrity: sha512-B7+VDyb8Tl6oMJT9oSO2CW8XC/T4UcJGrwOVoNGwOQsQYhlpfajmrMj5xeejqaASq3V/EqThyOeATEOMuSEXiA==} engines: {node: '>=12'} @@ -9823,6 +9945,11 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + rolldown@1.0.0-rc.15: + resolution: {integrity: sha512-Ff31guA5zT6WjnGp0SXw76X6hzGRk/OQq2hE+1lcDe+lJdHSgnSX6nK3erbONHyCbpSj9a9E+uX/OvytZoWp2g==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + rollup@4.60.1: resolution: {integrity: sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -10924,6 +11051,9 @@ packages: engines: {node: '>=14.17'} hasBin: true + ufo@1.6.3: + resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} + uid2@0.0.4: resolution: {integrity: sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA==} @@ -12413,16 +12543,32 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/core@1.9.2': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.9.1': dependencies: tslib: 2.8.1 optional: true + '@emnapi/runtime@1.9.2': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/wasi-threads@1.2.0': dependencies: tslib: 2.8.1 optional: true + '@emnapi/wasi-threads@1.2.1': + dependencies: + tslib: 2.8.1 + optional: true + '@epic-web/invariant@1.0.0': {} '@esbuild/aix-ppc64@0.27.4': @@ -12860,7 +13006,7 @@ snapshots: '@img/sharp-wasm32@0.33.5': dependencies: - '@emnapi/runtime': 1.9.1 + '@emnapi/runtime': 1.9.2 optional: true '@img/sharp-win32-ia32@0.33.5': @@ -13397,13 +13543,20 @@ snapshots: '@napi-rs/nice-win32-x64-msvc': 1.1.1 optional: true - '@napi-rs/wasm-runtime@1.1.2(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)': + '@napi-rs/wasm-runtime@1.1.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)': dependencies: '@emnapi/core': 1.9.1 '@emnapi/runtime': 1.9.1 '@tybys/wasm-util': 0.10.1 optional: true + '@napi-rs/wasm-runtime@1.1.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + dependencies: + '@emnapi/core': 1.9.2 + '@emnapi/runtime': 1.9.2 + '@tybys/wasm-util': 0.10.1 + optional: true + '@nestjs/common@11.1.18(reflect-metadata@0.2.2)(rxjs@7.8.2)': dependencies: file-type: 21.3.4 @@ -13760,6 +13913,8 @@ snapshots: '@oxc-project/types@0.123.0': {} + '@oxc-project/types@0.124.0': {} + '@paralleldrive/cuid2@2.3.1': dependencies: '@noble/hashes': 1.8.0 @@ -13987,56 +14142,114 @@ snapshots: '@rolldown/binding-android-arm64@1.0.0-rc.13': optional: true + '@rolldown/binding-android-arm64@1.0.0-rc.15': + optional: true + '@rolldown/binding-darwin-arm64@1.0.0-rc.13': optional: true + '@rolldown/binding-darwin-arm64@1.0.0-rc.15': + optional: true + '@rolldown/binding-darwin-x64@1.0.0-rc.13': optional: true + '@rolldown/binding-darwin-x64@1.0.0-rc.15': + optional: true + '@rolldown/binding-freebsd-x64@1.0.0-rc.13': optional: true + '@rolldown/binding-freebsd-x64@1.0.0-rc.15': + optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.13': optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.15': + optional: true + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.13': optional: true + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.15': + optional: true + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.13': optional: true + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.15': + optional: true + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.13': optional: true + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.15': + optional: true + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.13': optional: true + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.15': + optional: true + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.13': optional: true + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.15': + optional: true + '@rolldown/binding-linux-x64-musl@1.0.0-rc.13': optional: true + '@rolldown/binding-linux-x64-musl@1.0.0-rc.15': + optional: true + '@rolldown/binding-openharmony-arm64@1.0.0-rc.13': optional: true + '@rolldown/binding-openharmony-arm64@1.0.0-rc.15': + optional: true + '@rolldown/binding-wasm32-wasi@1.0.0-rc.13': dependencies: '@emnapi/core': 1.9.1 '@emnapi/runtime': 1.9.1 - '@napi-rs/wasm-runtime': 1.1.2(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1) + '@napi-rs/wasm-runtime': 1.1.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1) + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.15': + dependencies: + '@emnapi/core': 1.9.2 + '@emnapi/runtime': 1.9.2 + '@napi-rs/wasm-runtime': 1.1.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) optional: true '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.13': optional: true + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.15': + optional: true + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.13': optional: true + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.15': + optional: true + '@rolldown/pluginutils@1.0.0-rc.13': {} + '@rolldown/pluginutils@1.0.0-rc.15': {} + '@rolldown/pluginutils@1.0.0-rc.2': {} + '@rollup/plugin-esm-shim@0.1.8(rollup@4.60.1)': + dependencies: + magic-string: 0.30.21 + mlly: 1.8.2 + optionalDependencies: + rollup: 4.60.1 + '@rollup/plugin-json@6.1.0(rollup@4.60.1)': dependencies: '@rollup/pluginutils': 5.3.0(rollup@4.60.1) @@ -16948,6 +17161,8 @@ snapshots: readable-stream: 3.6.2 typedarray: 0.0.6 + confbox@0.1.8: {} + config-chain@1.1.13: dependencies: ini: 1.3.8 @@ -17590,13 +17805,6 @@ snapshots: es6-promise: 4.2.8 optional: true - esbuild-plugin-swc@1.0.1: - dependencies: - '@swc/core': 1.15.21 - deepmerge: 4.3.1 - transitivePeerDependencies: - - '@swc/helpers' - esbuild@0.27.4: optionalDependencies: '@esbuild/aix-ppc64': 0.27.4 @@ -20178,6 +20386,13 @@ snapshots: mkdirp@1.0.4: optional: true + mlly@1.8.2: + dependencies: + acorn: 8.16.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.3 + mock-socket@9.3.1: {} module-details-from-path@1.0.4: {} @@ -20756,6 +20971,12 @@ snapshots: dependencies: find-up: 4.1.0 + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.2 + pathe: 2.0.3 + plimit-lit@1.6.1: dependencies: queue-lit: 1.5.2 @@ -21442,6 +21663,27 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.13 '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.13 + rolldown@1.0.0-rc.15: + dependencies: + '@oxc-project/types': 0.124.0 + '@rolldown/pluginutils': 1.0.0-rc.15 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-rc.15 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.15 + '@rolldown/binding-darwin-x64': 1.0.0-rc.15 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.15 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.15 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.15 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.15 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.15 + '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.15 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.15 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.15 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.15 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.15 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.15 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.15 + rollup@4.60.1: dependencies: '@types/estree': 1.0.8 @@ -22615,6 +22857,8 @@ snapshots: typescript@5.9.3: {} + ufo@1.6.3: {} + uid2@0.0.4: {} uid@2.0.2: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 040c45bcdd..827be65e5f 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -35,8 +35,10 @@ ignorePatchFailures: false minimumReleaseAge: 10080 # delay 7days to mitigate supply-chain attack minimumReleaseAgeExclude: - '@syuilo/aiscript' - - rolldown # 脆弱性対応。そのうち消す - - '@rolldown/*' # 脆弱性対応。そのうち消す + - rolldown # Bundle Backend そのうち消す + - '@rolldown/*' # Bundle Backend そのうち消す + - '@oxc-project/*' # Bundle Backend そのうち消す + - '@napi-rs/*' # Bundle Backend そのうち消す - vite # 脆弱性対応。そのうち消す # Renovate security update: lodash@4.18.1 - lodash@4.18.1 diff --git a/scripts/dev.mjs b/scripts/dev.mjs index b54004132a..c47a33b7fa 100644 --- a/scripts/dev.mjs +++ b/scripts/dev.mjs @@ -34,7 +34,7 @@ await Promise.all([ stdout: process.stdout, stderr: process.stderr, }), - execa('pnpm', ['--filter', 'backend...', 'build'], { + execa('pnpm', ['--filter', 'backend...', '--filter=!backend', 'build'], { cwd: _dirname + '/../', stdout: process.stdout, stderr: process.stderr,