From 81f28c42fd8ccc3e54935902d59172e9084f9a9b Mon Sep 17 00:00:00 2001 From: kakkokari-gtyih <67428053+kakkokari-gtyih@users.noreply.github.com> Date: Fri, 15 May 2026 16:21:29 +0900 Subject: [PATCH 1/5] =?UTF-8?q?Revert=20"refactor(backend):=20=E5=A4=89?= =?UTF-8?q?=E6=8F=9B=E5=BE=8C.config.json=E3=81=AB=E7=B5=B1=E4=B8=80?= =?UTF-8?q?=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB+=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=E3=81=AA=E3=81=A9=20(#16929)"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 24bd1509677023ddd8a749bb7fbfe876c7627b48. --- .github/workflows/get-backend-memory.yml | 2 +- .../1745378064470-composite-note-index.js | 8 ++--- ...915-migrateSomeConfigFileSettingsToMeta.js | 8 +++-- .../backend/migration/js/migration-config.js | 31 ++++++++++++++++ packages/backend/ormconfig.js | 5 ++- packages/backend/package.json | 34 +++++++++++++++++- .../{compile_config.js => convert_config.js} | 35 +++++++++++-------- packages/backend/src/config.ts | 2 +- .../backend/test-federation/.config/dummy.yml | 2 -- .../.config/example.config.json | 29 --------------- .../.config/example.default.yml | 23 ++++++++++++ .../backend/test-federation/compose.a.yml | 8 +++-- .../backend/test-federation/compose.b.yml | 8 +++-- .../backend/test-federation/compose.tpl.yml | 8 ++--- packages/backend/test-federation/compose.yml | 4 +-- packages/backend/test-federation/setup.sh | 2 +- 16 files changed, 137 insertions(+), 72 deletions(-) create mode 100644 packages/backend/migration/js/migration-config.js rename packages/backend/scripts/{compile_config.js => convert_config.js} (59%) delete mode 100644 packages/backend/test-federation/.config/dummy.yml delete mode 100644 packages/backend/test-federation/.config/example.config.json create mode 100644 packages/backend/test-federation/.config/example.default.yml diff --git a/.github/workflows/get-backend-memory.yml b/.github/workflows/get-backend-memory.yml index aa4bf5e3a45..66c8a00fe26 100644 --- a/.github/workflows/get-backend-memory.yml +++ b/.github/workflows/get-backend-memory.yml @@ -57,7 +57,7 @@ jobs: - name: Copy Configure run: cp .github/misskey/test.yml .config/default.yml - name: Compile Configure - run: pnpm compile-config + run: pnpm convert:config - name: Build run: pnpm build - name: Run migrations diff --git a/packages/backend/migration/1745378064470-composite-note-index.js b/packages/backend/migration/1745378064470-composite-note-index.js index 576bf7d19a9..12108a6b3cc 100644 --- a/packages/backend/migration/1745378064470-composite-note-index.js +++ b/packages/backend/migration/1745378064470-composite-note-index.js @@ -3,14 +3,14 @@ * SPDX-License-Identifier: AGPL-3.0-only */ -const isConcurrentIndexMigrationEnabled = process.env.MISSKEY_MIGRATION_CREATE_INDEX_CONCURRENTLY === '1'; +import { isConcurrentIndexMigrationEnabled } from "./js/migration-config.js"; export class CompositeNoteIndex1745378064470 { name = 'CompositeNoteIndex1745378064470'; - transaction = isConcurrentIndexMigrationEnabled ? false : undefined; + transaction = isConcurrentIndexMigrationEnabled() ? false : undefined; async up(queryRunner) { - const concurrently = isConcurrentIndexMigrationEnabled; + const concurrently = isConcurrentIndexMigrationEnabled(); if (concurrently) { const hasValidIndex = await queryRunner.query(`SELECT indisvalid FROM pg_index INNER JOIN pg_class ON pg_index.indexrelid = pg_class.oid WHERE pg_class.relname = 'IDX_724b311e6f883751f261ebe378'`); @@ -29,7 +29,7 @@ export class CompositeNoteIndex1745378064470 { } async down(queryRunner) { - const mayConcurrently = isConcurrentIndexMigrationEnabled ? 'CONCURRENTLY' : ''; + const mayConcurrently = isConcurrentIndexMigrationEnabled() ? 'CONCURRENTLY' : ''; await queryRunner.query(`DROP INDEX IF EXISTS "IDX_724b311e6f883751f261ebe378"`); await queryRunner.query(`CREATE INDEX ${mayConcurrently} "IDX_5b87d9d19127bd5d92026017a7" ON "note" ("userId")`); } diff --git a/packages/backend/migration/1746949539915-migrateSomeConfigFileSettingsToMeta.js b/packages/backend/migration/1746949539915-migrateSomeConfigFileSettingsToMeta.js index cb8bb33459d..3243f43b915 100644 --- a/packages/backend/migration/1746949539915-migrateSomeConfigFileSettingsToMeta.js +++ b/packages/backend/migration/1746949539915-migrateSomeConfigFileSettingsToMeta.js @@ -3,15 +3,17 @@ * SPDX-License-Identifier: AGPL-3.0-only */ +import {loadConfig} from "./js/migration-config.js"; export class MigrateSomeConfigFileSettingsToMeta1746949539915 { name = 'MigrateSomeConfigFileSettingsToMeta1746949539915' async up(queryRunner) { + const config = loadConfig(); // $1 cannot be used in ALTER TABLE queries - await queryRunner.query(`ALTER TABLE "meta" ADD "proxyRemoteFiles" boolean NOT NULL DEFAULT TRUE`); - await queryRunner.query(`ALTER TABLE "meta" ADD "signToActivityPubGet" boolean NOT NULL DEFAULT TRUE`); - await queryRunner.query(`ALTER TABLE "meta" ADD "allowExternalApRedirect" boolean NOT NULL DEFAULT TRUE`); + await queryRunner.query(`ALTER TABLE "meta" ADD "proxyRemoteFiles" boolean NOT NULL DEFAULT ${config.proxyRemoteFiles}`); + await queryRunner.query(`ALTER TABLE "meta" ADD "signToActivityPubGet" boolean NOT NULL DEFAULT ${config.signToActivityPubGet}`); + await queryRunner.query(`ALTER TABLE "meta" ADD "allowExternalApRedirect" boolean NOT NULL DEFAULT ${!config.disallowExternalApRedirect}`); } async down(queryRunner) { diff --git a/packages/backend/migration/js/migration-config.js b/packages/backend/migration/js/migration-config.js new file mode 100644 index 00000000000..853735661bf --- /dev/null +++ b/packages/backend/migration/js/migration-config.js @@ -0,0 +1,31 @@ +/* + * SPDX-FileCopyrightText: syuilo and misskey-project + * SPDX-License-Identifier: AGPL-3.0-only + */ + +import { path as configYamlPath } from '../../built/config.js'; +import * as yaml from 'js-yaml'; +import fs from "node:fs"; + +export function isConcurrentIndexMigrationEnabled() { + return process.env.MISSKEY_MIGRATION_CREATE_INDEX_CONCURRENTLY === '1'; +} + +let loadedConfigCache = undefined; + +function loadConfigInternal() { + const config = yaml.load(fs.readFileSync(configYamlPath, 'utf-8')); + + return { + disallowExternalApRedirect: Boolean(config.disallowExternalApRedirect ?? false), + proxyRemoteFiles: Boolean(config.proxyRemoteFiles ?? false), + signToActivityPubGet: Boolean(config.signToActivityPubGet ?? true), + } +} + +export function loadConfig() { + if (loadedConfigCache === undefined) { + loadedConfigCache = loadConfigInternal(); + } + return loadedConfigCache; +} diff --git a/packages/backend/ormconfig.js b/packages/backend/ormconfig.js index dabc0893f40..f979c36ad7f 100644 --- a/packages/backend/ormconfig.js +++ b/packages/backend/ormconfig.js @@ -1,8 +1,7 @@ import { DataSource } from 'typeorm'; import { loadConfig } from './built/config.js'; import { entities } from './built/postgres.js'; - -const isConcurrentIndexMigrationEnabled = process.env.MISSKEY_MIGRATION_CREATE_INDEX_CONCURRENTLY === '1'; +import { isConcurrentIndexMigrationEnabled } from "./migration/js/migration-config.js"; const config = loadConfig(); @@ -16,5 +15,5 @@ export default new DataSource({ extra: config.db.extra, entities: entities, migrations: ['migration/*.js'], - migrationsTransactionMode: isConcurrentIndexMigrationEnabled ? 'each' : 'all', + migrationsTransactionMode: isConcurrentIndexMigrationEnabled() ? 'each' : 'all', }); diff --git a/packages/backend/package.json b/packages/backend/package.json index 1a19f02eab5..02ff86466bf 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -7,6 +7,7 @@ "node": "^22.15.0 || ^24.10.0" }, "scripts": { +<<<<<<< HEAD "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", @@ -30,8 +31,39 @@ "test:fed": "cross-env NODE_ENV=test pnpm compile-config && vitest --config vitest.config.fed.ts", "test-and-coverage": "pnpm build:unit && cross-env NODE_ENV=test pnpm compile-config && vitest --coverage --config vitest.config.unit.ts", "test-and-coverage:e2e": "pnpm build:e2e && cross-env NODE_ENV=test pnpm compile-config && vitest --coverage --config vitest.config.e2e.ts", +======= + "start": "pnpm convert:config && node ./built/boot/entry.js", + "start:inspect": "pnpm convert:config && node --inspect ./built/boot/entry.js", + "start:test": "pnpm convert:config && cross-env NODE_ENV=test node ./built/boot/entry.js", + "migrate": "pnpm convert:config && pnpm typeorm migration:run -d ormconfig.js", + "revert": "pnpm convert:config && pnpm typeorm migration:revert -d ormconfig.js", + "cli": "pnpm convert:config && node ./built/boot/cli.js", + "check:connect": "pnpm convert:config && node ./scripts/check_connect.js", + "convert:config": "node ./scripts/convert_config.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": "pnpm convert:config && node ./scripts/watch.mjs", + "restart": "pnpm build && pnpm start", + "dev": "pnpm convert:config && node ./scripts/dev.mjs", + "typecheck": "tsc --noEmit && tsc -p test --noEmit && tsc -p test-federation --noEmit", + "eslint": "eslint --quiet \"{src,test-federation}/**/*.ts\"", + "lint": "pnpm typecheck && pnpm eslint", + "jest": "pnpm convert:config && cross-env NODE_ENV=test node ./jest.js --forceExit --config jest.config.unit.cjs", + "jest:e2e": "pnpm convert:config && cross-env NODE_ENV=test node ./jest.js --forceExit --config jest.config.e2e.cjs", + "jest:fed": "pnpm convert:config && node ./jest.js --forceExit --config jest.config.fed.cjs", + "jest-and-coverage": "pnpm convert:config && cross-env NODE_ENV=test node ./jest.js --coverage --forceExit --config jest.config.unit.cjs", + "jest-and-coverage:e2e": "pnpm convert:config && cross-env NODE_ENV=test node ./jest.js --coverage --forceExit --config jest.config.e2e.cjs", + "jest-clear": "pnpm convert:config && cross-env NODE_ENV=test node ./jest.js --clearCache", + "test": "pnpm jest", + "test:e2e": "pnpm build && pnpm build:test && 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", +>>>>>>> parent of 24bd150967 (refactor(backend): 変換後.config.jsonに統一するように+修正など (#16929)) "check-migrations": "node scripts/check_migrations_clean.js", - "generate-api-json": "pnpm compile-config && node ./scripts/generate_api_json.js" + "generate-api-json": "pnpm convert:config && node ./scripts/generate_api_json.js" }, "optionalDependencies": { "@tensorflow/tfjs": "4.22.0", diff --git a/packages/backend/scripts/compile_config.js b/packages/backend/scripts/convert_config.js similarity index 59% rename from packages/backend/scripts/compile_config.js rename to packages/backend/scripts/convert_config.js index e78fa3dc9f2..e93baa409a1 100644 --- a/packages/backend/scripts/compile_config.js +++ b/packages/backend/scripts/convert_config.js @@ -17,38 +17,43 @@ const _filename = fileURLToPath(import.meta.url); const _dirname = dirname(_filename); const configDir = resolve(_dirname, '../../../.config'); -const OUTPUT_PATH = resolve(_dirname, '../../../built/.config.json'); - -// TODO: yamlのパースに失敗したときのエラーハンドリング /** * YAMLファイルをJSONファイルに変換 * @param {string} ymlPath - YAMLファイルのパス + * @param {string} jsonPath - JSONファイルの出力パス */ -function yamlToJson(ymlPath) { +function convertYamlToJson(ymlPath, jsonPath) { if (!fs.existsSync(ymlPath)) { - console.warn(`YAML file not found: ${ymlPath}`); + console.log(`skipped: ${ymlPath} is not found`); return; } - console.log(`${ymlPath} → ${OUTPUT_PATH}`); - const yamlContent = fs.readFileSync(ymlPath, 'utf-8'); const jsonContent = yaml.load(yamlContent); - if (!fs.existsSync(dirname(OUTPUT_PATH))) { - fs.mkdirSync(dirname(OUTPUT_PATH), { recursive: true }); - } - fs.writeFileSync(OUTPUT_PATH, JSON.stringify({ + fs.writeFileSync(jsonPath, JSON.stringify({ '_NOTE_': 'This file is auto-generated from YAML file. DO NOT EDIT.', ...jsonContent, }), 'utf-8'); + console.log(`✓ ${ymlPath} → ${jsonPath}`); } +// default.yml と test.yml を変換 +convertYamlToJson( + resolve(configDir, 'default.yml'), + resolve(configDir, 'default.json'), +); + +convertYamlToJson( + resolve(configDir, 'test.yml'), + resolve(configDir, 'test.json'), +); + +// MISSKEY_CONFIG_YML 環境変数が指定されている場合も変換 if (process.env.MISSKEY_CONFIG_YML) { const customYmlPath = resolve(configDir, process.env.MISSKEY_CONFIG_YML); - yamlToJson(customYmlPath); -} else { - yamlToJson(resolve(configDir, process.env.NODE_ENV === 'test' ? 'test.yml' : 'default.yml')); + const customJsonPath = customYmlPath.replace(/\.ya?ml$/i, '.json'); + convertYamlToJson(customYmlPath, customJsonPath); } -console.log('Configuration compiled ✓'); +console.log('Configuration compiled'); diff --git a/packages/backend/src/config.ts b/packages/backend/src/config.ts index d67fe6fc6fa..c0cec45af47 100644 --- a/packages/backend/src/config.ts +++ b/packages/backend/src/config.ts @@ -251,7 +251,7 @@ export function loadConfig(): Config { const frontendManifestExists = fs.existsSync(resolve(projectBuiltDir, '_frontend_vite_/manifest.json')); const frontendEmbedManifestExists = fs.existsSync(resolve(projectBuiltDir, '_frontend_embed_vite_/manifest.json')); - const config = JSON.parse(fs.readFileSync(compiledConfigFilePath, 'utf-8')) as Source; + const config = JSON.parse(fs.readFileSync(path, 'utf-8')) as Source; const url = tryCreateUrl(config.url ?? process.env.MISSKEY_URL ?? ''); const version = meta.version; diff --git a/packages/backend/test-federation/.config/dummy.yml b/packages/backend/test-federation/.config/dummy.yml deleted file mode 100644 index 841cab97832..00000000000 --- a/packages/backend/test-federation/.config/dummy.yml +++ /dev/null @@ -1,2 +0,0 @@ -url: https://example.com/ -port: 3000 diff --git a/packages/backend/test-federation/.config/example.config.json b/packages/backend/test-federation/.config/example.config.json deleted file mode 100644 index 2035d1a2009..00000000000 --- a/packages/backend/test-federation/.config/example.config.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "url": "https://${HOST}/", - "port": 3000, - "db": { - "host": "db.${HOST}", - "port": 5432, - "db": "misskey", - "user": "postgres", - "pass": "postgres" - }, - "dbReplications": false, - "trustProxy": true, - "redis": { - "host": "redis.test", - "port": 6379 - }, - "id": "aidx", - "proxyBypassHosts": [ - "api.deepl.com", - "api-free.deepl.com", - "www.recaptcha.net", - "hcaptcha.com", - "challenges.cloudflare.com" - ], - "allowedPrivateNetworks": [ - "127.0.0.1/32", - "172.20.0.0/16" - ] -} diff --git a/packages/backend/test-federation/.config/example.default.yml b/packages/backend/test-federation/.config/example.default.yml new file mode 100644 index 00000000000..b1cd3bdba82 --- /dev/null +++ b/packages/backend/test-federation/.config/example.default.yml @@ -0,0 +1,23 @@ +url: https://${HOST}/ +port: 3000 +db: + host: db.${HOST} + port: 5432 + db: misskey + user: postgres + pass: postgres +dbReplications: false +trustProxy: true +redis: + host: redis.test + port: 6379 +id: 'aidx' +proxyBypassHosts: + - api.deepl.com + - api-free.deepl.com + - www.recaptcha.net + - hcaptcha.com + - challenges.cloudflare.com +allowedPrivateNetworks: + - 127.0.0.1/32 + - 172.20.0.0/16 diff --git a/packages/backend/test-federation/compose.a.yml b/packages/backend/test-federation/compose.a.yml index ec9a2cf2afd..97dda9ffbfb 100644 --- a/packages/backend/test-federation/compose.a.yml +++ b/packages/backend/test-federation/compose.a.yml @@ -37,8 +37,12 @@ services: - internal_network_a volumes: - type: bind - source: ./.config/a.test.config.json - target: /misskey/built/._config_.json + source: ./.config/a.test.default.yml + target: /misskey/.config/default.yml + read_only: true + - type: bind + source: ../scripts/convert_config.js + target: /misskey/packages/backend/scripts/convert_config.js read_only: true db.a.test: diff --git a/packages/backend/test-federation/compose.b.yml b/packages/backend/test-federation/compose.b.yml index 92219344069..7eae3bb8d8c 100644 --- a/packages/backend/test-federation/compose.b.yml +++ b/packages/backend/test-federation/compose.b.yml @@ -37,8 +37,12 @@ services: - internal_network_b volumes: - type: bind - source: ./.config/b.test.config.json - target: /misskey/built/._config_.json + source: ./.config/b.test.default.yml + target: /misskey/.config/default.yml + read_only: true + - type: bind + source: ../scripts/convert_config.js + target: /misskey/packages/backend/scripts/convert_config.js read_only: true db.b.test: diff --git a/packages/backend/test-federation/compose.tpl.yml b/packages/backend/test-federation/compose.tpl.yml index d5e87cc47c8..a312dcefd65 100644 --- a/packages/backend/test-federation/compose.tpl.yml +++ b/packages/backend/test-federation/compose.tpl.yml @@ -21,10 +21,6 @@ services: - type: bind source: ../../../built target: /misskey/built - read_only: false - - type: bind - source: ./.config/dummy.yml - target: /misskey/.config/default.yml read_only: true - type: bind source: ../assets @@ -51,8 +47,8 @@ services: target: /misskey/packages/backend/package.json read_only: true - type: bind - source: ../scripts/compile_config.js - target: /misskey/packages/backend/scripts/compile_config.js + source: ../scripts/convert_config.js + target: /misskey/packages/backend/scripts/convert_config.js read_only: true - type: bind source: ../../misskey-js/built diff --git a/packages/backend/test-federation/compose.yml b/packages/backend/test-federation/compose.yml index 53e297f8678..a6ed60e81a9 100644 --- a/packages/backend/test-federation/compose.yml +++ b/packages/backend/test-federation/compose.yml @@ -51,8 +51,8 @@ services: target: /misskey/packages/backend/vitest.config.fed.ts read_only: true - type: bind - source: ../scripts/compile_config.js - target: /misskey/packages/backend/scripts/compile_config.js + source: ../scripts/convert_config.js + target: /misskey/packages/backend/scripts/convert_config.js read_only: true - type: bind source: ../../misskey-js/built diff --git a/packages/backend/test-federation/setup.sh b/packages/backend/test-federation/setup.sh index 15aa2eee7f3..1bc3a2a87c0 100644 --- a/packages/backend/test-federation/setup.sh +++ b/packages/backend/test-federation/setup.sh @@ -28,7 +28,7 @@ function generate { -days 500 if [ ! -f .config/docker.env ]; then cp .config/example.docker.env .config/docker.env; fi if [ ! -f .config/$1.conf ]; then sed "s/\${HOST}/$1/g" .config/example.conf > .config/$1.conf; fi - if [ ! -f .config/$1.default.yml ]; then sed "s/\${HOST}/$1/g" .config/example.config.json > .config/$1.config.json; fi + if [ ! -f .config/$1.default.yml ]; then sed "s/\${HOST}/$1/g" .config/example.default.yml > .config/$1.default.yml; fi } generate a.test From 59c73d2b3d0445b06767371ec27fa30c037fd81a Mon Sep 17 00:00:00 2001 From: kakkokari-gtyih <67428053+kakkokari-gtyih@users.noreply.github.com> Date: Fri, 15 May 2026 16:26:07 +0900 Subject: [PATCH 2/5] =?UTF-8?q?Revert=20"enhance(backend):=20=E8=B5=B7?= =?UTF-8?q?=E5=8B=95=E5=89=8D=E3=81=ABconfig=E3=82=92json=E5=8C=96=20(#169?= =?UTF-8?q?23)"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 1facca1ac59af0da21e85f17ded97b39e179dafe. --- package.json | 6 +- packages/backend/package.json | 60 +++++-------------- packages/backend/scripts/convert_config.js | 59 ------------------ packages/backend/src/config.ts | 20 +++---- .../backend/test-federation/compose.a.yml | 4 -- .../backend/test-federation/compose.b.yml | 4 -- .../backend/test-federation/compose.tpl.yml | 4 -- packages/backend/test-federation/compose.yml | 4 -- pnpm-lock.yaml | 25 ++++---- 9 files changed, 40 insertions(+), 146 deletions(-) delete mode 100644 packages/backend/scripts/convert_config.js diff --git a/package.json b/package.json index 1a32dc48bec..f90c2603dad 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/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", + "start": "pnpm check:connect && cd packages/backend && node ./built/boot/entry.js", + "start:inspect": "cd packages/backend && node --inspect ./built/boot/entry.js", + "start:test": "ncp ./.github/misskey/test.yml ./.config/test.yml && cd packages/backend && cross-env NODE_ENV=test node ./built/boot/entry.js", "cli": "cd packages/backend && pnpm cli", "init": "pnpm migrate", "migrate": "cd packages/backend && pnpm migrate", diff --git a/packages/backend/package.json b/packages/backend/package.json index 02ff86466bf..5d11712d099 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -7,15 +7,13 @@ "node": "^22.15.0 || ^24.10.0" }, "scripts": { -<<<<<<< HEAD - "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 ./built/cli.js", - "check:connect": "pnpm compile-config && node ./scripts/check_connect.js", - "compile-config": "node ./scripts/compile_config.js", + "start": "node ./built/boot/entry.js", + "start:inspect": "node --inspect ./built/boot/entry.js", + "start:test": "cross-env NODE_ENV=test node ./built/boot/entry.js", + "migrate": "pnpm typeorm migration:run -d ormconfig.js", + "revert": "pnpm typeorm migration:revert -d ormconfig.js", + "cli": "node ./built/boot/cli.js", + "check:connect": "node ./scripts/check_connect.js", "build": "rolldown -c", "build:unit": "rolldown -c --sourcemap", "build:e2e": "rolldown -c --e2e", @@ -26,44 +24,13 @@ "typecheck": "tsgo --noEmit && tsgo -p test --noEmit && tsgo -p test-federation --noEmit", "eslint": "eslint --quiet \"{src,test-federation}/**/*.ts\"", "lint": "pnpm typecheck && pnpm eslint", - "test": "pnpm build:unit && cross-env NODE_ENV=test pnpm compile-config && vitest --config vitest.config.unit.ts", - "test:e2e": "pnpm build:e2e && cross-env NODE_ENV=test pnpm compile-config && vitest --config vitest.config.e2e.ts", - "test:fed": "cross-env NODE_ENV=test pnpm compile-config && vitest --config vitest.config.fed.ts", - "test-and-coverage": "pnpm build:unit && cross-env NODE_ENV=test pnpm compile-config && vitest --coverage --config vitest.config.unit.ts", - "test-and-coverage:e2e": "pnpm build:e2e && cross-env NODE_ENV=test pnpm compile-config && vitest --coverage --config vitest.config.e2e.ts", -======= - "start": "pnpm convert:config && node ./built/boot/entry.js", - "start:inspect": "pnpm convert:config && node --inspect ./built/boot/entry.js", - "start:test": "pnpm convert:config && cross-env NODE_ENV=test node ./built/boot/entry.js", - "migrate": "pnpm convert:config && pnpm typeorm migration:run -d ormconfig.js", - "revert": "pnpm convert:config && pnpm typeorm migration:revert -d ormconfig.js", - "cli": "pnpm convert:config && node ./built/boot/cli.js", - "check:connect": "pnpm convert:config && node ./scripts/check_connect.js", - "convert:config": "node ./scripts/convert_config.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": "pnpm convert:config && node ./scripts/watch.mjs", - "restart": "pnpm build && pnpm start", - "dev": "pnpm convert:config && node ./scripts/dev.mjs", - "typecheck": "tsc --noEmit && tsc -p test --noEmit && tsc -p test-federation --noEmit", - "eslint": "eslint --quiet \"{src,test-federation}/**/*.ts\"", - "lint": "pnpm typecheck && pnpm eslint", - "jest": "pnpm convert:config && cross-env NODE_ENV=test node ./jest.js --forceExit --config jest.config.unit.cjs", - "jest:e2e": "pnpm convert:config && cross-env NODE_ENV=test node ./jest.js --forceExit --config jest.config.e2e.cjs", - "jest:fed": "pnpm convert:config && node ./jest.js --forceExit --config jest.config.fed.cjs", - "jest-and-coverage": "pnpm convert:config && cross-env NODE_ENV=test node ./jest.js --coverage --forceExit --config jest.config.unit.cjs", - "jest-and-coverage:e2e": "pnpm convert:config && cross-env NODE_ENV=test node ./jest.js --coverage --forceExit --config jest.config.e2e.cjs", - "jest-clear": "pnpm convert:config && cross-env NODE_ENV=test node ./jest.js --clearCache", - "test": "pnpm jest", - "test:e2e": "pnpm build && pnpm build:test && 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", ->>>>>>> parent of 24bd150967 (refactor(backend): 変換後.config.jsonに統一するように+修正など (#16929)) + "test": "pnpm build:unit && vitest --config vitest.config.unit.ts", + "test:e2e": "pnpm build:e2e && vitest --config vitest.config.e2e.ts", + "test:fed": "vitest --config vitest.config.fed.ts", + "test-and-coverage": "pnpm build:unit && vitest --coverage --config vitest.config.unit.ts", + "test-and-coverage:e2e": "pnpm build:e2e && vitest --coverage --config vitest.config.e2e.ts", "check-migrations": "node scripts/check_migrations_clean.js", - "generate-api-json": "pnpm convert:config && node ./scripts/generate_api_json.js" + "generate-api-json": "node ./scripts/generate_api_json.js" }, "optionalDependencies": { "@tensorflow/tfjs": "4.22.0", @@ -139,6 +106,7 @@ "ip-cidr": "4.0.2", "ipaddr.js": "2.4.0", "is-svg": "6.1.0", + "js-yaml": "4.1.1", "json5": "2.2.3", "jsonld": "9.0.0", "juice": "11.1.1", diff --git a/packages/backend/scripts/convert_config.js b/packages/backend/scripts/convert_config.js deleted file mode 100644 index e93baa409a1..00000000000 --- a/packages/backend/scripts/convert_config.js +++ /dev/null @@ -1,59 +0,0 @@ -/* - * SPDX-FileCopyrightText: syuilo and misskey-project - * SPDX-License-Identifier: AGPL-3.0-only - */ - -/** - * YAMLファイルをJSONファイルに変換するスクリプト - * ビルド前に実行し、ランタイムにjs-yamlを含まないようにする - */ - -import fs from 'node:fs'; -import { resolve, dirname } from 'node:path'; -import { fileURLToPath } from 'node:url'; -import yaml from 'js-yaml'; - -const _filename = fileURLToPath(import.meta.url); -const _dirname = dirname(_filename); - -const configDir = resolve(_dirname, '../../../.config'); - -/** - * YAMLファイルをJSONファイルに変換 - * @param {string} ymlPath - YAMLファイルのパス - * @param {string} jsonPath - JSONファイルの出力パス - */ -function convertYamlToJson(ymlPath, jsonPath) { - if (!fs.existsSync(ymlPath)) { - console.log(`skipped: ${ymlPath} is not found`); - return; - } - - const yamlContent = fs.readFileSync(ymlPath, 'utf-8'); - const jsonContent = yaml.load(yamlContent); - fs.writeFileSync(jsonPath, JSON.stringify({ - '_NOTE_': 'This file is auto-generated from YAML file. DO NOT EDIT.', - ...jsonContent, - }), 'utf-8'); - console.log(`✓ ${ymlPath} → ${jsonPath}`); -} - -// default.yml と test.yml を変換 -convertYamlToJson( - resolve(configDir, 'default.yml'), - resolve(configDir, 'default.json'), -); - -convertYamlToJson( - resolve(configDir, 'test.yml'), - resolve(configDir, 'test.json'), -); - -// MISSKEY_CONFIG_YML 環境変数が指定されている場合も変換 -if (process.env.MISSKEY_CONFIG_YML) { - const customYmlPath = resolve(configDir, process.env.MISSKEY_CONFIG_YML); - const customJsonPath = customYmlPath.replace(/\.ya?ml$/i, '.json'); - convertYamlToJson(customYmlPath, customJsonPath); -} - -console.log('Configuration compiled'); diff --git a/packages/backend/src/config.ts b/packages/backend/src/config.ts index c0cec45af47..19fdedad44b 100644 --- a/packages/backend/src/config.ts +++ b/packages/backend/src/config.ts @@ -6,6 +6,7 @@ import * as fs from 'node:fs'; import { fileURLToPath } from 'node:url'; import { dirname, resolve } from 'node:path'; +import * as yaml from 'js-yaml'; import { type FastifyServerOptions } from 'fastify'; import type * as Sentry from '@sentry/node'; import type * as SentryVue from '@sentry/vue'; @@ -235,23 +236,22 @@ const configDir = resolve(rootDir, '.config'); /** Path of built directory */ const projectBuiltDir = resolve(rootDir, 'built'); -const compiledConfigFilePathForTest = resolve(projectBuiltDir, '._config_.json'); - -export const compiledConfigFilePath = fs.existsSync(compiledConfigFilePathForTest) - ? compiledConfigFilePathForTest - : resolve(projectBuiltDir, '.config.json'); +/** + * Path of configuration file + */ +export const path = process.env.MISSKEY_CONFIG_YML + ? resolve(configDir, process.env.MISSKEY_CONFIG_YML) + : process.env.NODE_ENV === 'test' + ? resolve(configDir, 'test.yml') + : resolve(configDir, 'default.yml'); export function loadConfig(): Config { - if (!fs.existsSync(compiledConfigFilePath)) { - throw new Error('Compiled configuration file not found. Try running \'pnpm compile-config\'.'); - } - const meta = JSON.parse(fs.readFileSync(resolve(projectBuiltDir, 'meta.json'), 'utf-8')); const frontendManifestExists = fs.existsSync(resolve(projectBuiltDir, '_frontend_vite_/manifest.json')); const frontendEmbedManifestExists = fs.existsSync(resolve(projectBuiltDir, '_frontend_embed_vite_/manifest.json')); - const config = JSON.parse(fs.readFileSync(path, 'utf-8')) as Source; + const config = yaml.load(fs.readFileSync(path, 'utf-8')) as Source; const url = tryCreateUrl(config.url ?? process.env.MISSKEY_URL ?? ''); const version = meta.version; diff --git a/packages/backend/test-federation/compose.a.yml b/packages/backend/test-federation/compose.a.yml index 97dda9ffbfb..433ee5c5e9d 100644 --- a/packages/backend/test-federation/compose.a.yml +++ b/packages/backend/test-federation/compose.a.yml @@ -40,10 +40,6 @@ services: source: ./.config/a.test.default.yml target: /misskey/.config/default.yml read_only: true - - type: bind - source: ../scripts/convert_config.js - target: /misskey/packages/backend/scripts/convert_config.js - read_only: true db.a.test: extends: diff --git a/packages/backend/test-federation/compose.b.yml b/packages/backend/test-federation/compose.b.yml index 7eae3bb8d8c..38e9bb738ba 100644 --- a/packages/backend/test-federation/compose.b.yml +++ b/packages/backend/test-federation/compose.b.yml @@ -40,10 +40,6 @@ services: source: ./.config/b.test.default.yml target: /misskey/.config/default.yml read_only: true - - type: bind - source: ../scripts/convert_config.js - target: /misskey/packages/backend/scripts/convert_config.js - read_only: true db.b.test: extends: diff --git a/packages/backend/test-federation/compose.tpl.yml b/packages/backend/test-federation/compose.tpl.yml index a312dcefd65..6650dcace3a 100644 --- a/packages/backend/test-federation/compose.tpl.yml +++ b/packages/backend/test-federation/compose.tpl.yml @@ -46,10 +46,6 @@ services: source: ../package.json target: /misskey/packages/backend/package.json read_only: true - - type: bind - source: ../scripts/convert_config.js - target: /misskey/packages/backend/scripts/convert_config.js - read_only: true - type: bind source: ../../misskey-js/built target: /misskey/packages/misskey-js/built diff --git a/packages/backend/test-federation/compose.yml b/packages/backend/test-federation/compose.yml index a6ed60e81a9..2d01fe423b6 100644 --- a/packages/backend/test-federation/compose.yml +++ b/packages/backend/test-federation/compose.yml @@ -50,10 +50,6 @@ services: source: ../vitest.config.fed.ts target: /misskey/packages/backend/vitest.config.fed.ts read_only: true - - type: bind - source: ../scripts/convert_config.js - target: /misskey/packages/backend/scripts/convert_config.js - read_only: true - type: bind source: ../../misskey-js/built target: /misskey/packages/misskey-js/built diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 248da08dd29..1e9f671e7bb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -252,6 +252,9 @@ importers: is-svg: specifier: 6.1.0 version: 6.1.0 + js-yaml: + specifier: 4.1.1 + version: 4.1.1 json5: specifier: 2.2.3 version: 2.2.3 @@ -331,8 +334,8 @@ importers: specifier: 3.4.1 version: 3.4.1 re2: - specifier: 1.24.0 - version: 1.24.0 + specifier: 1.24.1 + version: 1.24.1 reflect-metadata: specifier: 0.2.2 version: 0.2.2 @@ -526,9 +529,6 @@ importers: fkill: specifier: 10.0.3 version: 10.0.3 - js-yaml: - specifier: 4.1.1 - version: 4.1.1 pid-port: specifier: 2.1.1 version: 2.1.1 @@ -7766,8 +7766,8 @@ packages: resolution: {integrity: sha512-BzQguy9W9NJgoVn2mRWzbFrFWWztGCcng2QI9+41frfk+Athwgx3qhqhvStz7ExeUUu7Kzw427sNzHpEZNINog==} engines: {node: '>=16.0.0'} - nan@2.26.2: - resolution: {integrity: sha512-0tTvBTYkt3tdGw22nrAy50x7gpbGCCFH3AFcyS5WiUu7Eu4vWlri1woE6qHBSfy11vksDqkiwjOnlR7WV8G1Hw==} + nan@2.27.0: + resolution: {integrity: sha512-hC+0LidcL3XE4rp1C4H54KujgXKzbfyTngZTwBByQxsOxCEKZT0MPQ4hOKUH2jU1OYstqdDH4onyHPDzcV0XdQ==} nanoid@3.3.12: resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} @@ -8662,8 +8662,9 @@ packages: resolution: {integrity: sha512-g8OUrgMXAR9ys/ZuJVfBr05sPPoMA7nHIVs8VEvg9QwM5W4GR2qSFEEHjsyHF1eWlBaf8Ev40WNjQFQ+nJTO3w==} engines: {node: '>=18'} - re2@1.24.0: - resolution: {integrity: sha512-pBm6cMaOb0Yb0kg0Sfw/k4LwDMkPScb/NVd7GrEllDwfsPZstsZIo93A6Nn0wZuWJw3h57GdzkrOk81EofKY/g==} + re2@1.24.1: + resolution: {integrity: sha512-uRl9cLDKuobJQp+6lVz7E3AyVszubUJ0fqAMWout4ocUWTIFvdHgpqLwwMh/vuNGGGJGh2p2mJZJIQr9am9M/A==} + engines: {node: '>=22'} react-docgen-typescript@2.4.0: resolution: {integrity: sha512-ZtAp5XTO5HRzQctjPU0ybY0RRCQO19X/8fxn3w7y2VVTUbGHDKULPTL4ky3vB05euSgG5NpALhEhDPvQ56wvXg==} @@ -17815,7 +17816,7 @@ snapshots: mylas@2.1.14: {} - nan@2.26.2: {} + nan@2.27.0: {} nanoid@3.3.12: {} @@ -18704,10 +18705,10 @@ snapshots: dependencies: setimmediate: 1.0.5 - re2@1.24.0: + re2@1.24.1: dependencies: install-artifact-from-github: 1.6.0 - nan: 2.26.2 + nan: 2.27.0 node-gyp: 12.3.0 react-docgen-typescript@2.4.0(typescript@5.9.3): From a19b540aa6027dd60b974fe076fc51f9eec006dd Mon Sep 17 00:00:00 2001 From: kakkokari-gtyih <67428053+kakkokari-gtyih@users.noreply.github.com> Date: Fri, 15 May 2026 16:30:40 +0900 Subject: [PATCH 3/5] fix --- .claude/docs/testing.md | 3 +-- .claude/skills/create-migration/SKILL.md | 1 - .github/copilot-instructions.md | 2 +- .github/workflows/get-backend-memory.yml | 2 -- package.json | 7 +++---- .../migration/1745378064470-composite-note-index.js | 8 ++++---- packages/backend/package.json | 12 ++++++------ 7 files changed, 15 insertions(+), 20 deletions(-) diff --git a/.claude/docs/testing.md b/.claude/docs/testing.md index 68fb5c39c5c..10fd6b664a0 100644 --- a/.claude/docs/testing.md +++ b/.claude/docs/testing.md @@ -2,7 +2,7 @@ ## Backend 全般の前提: `.config/test.yml` -backend のテストスクリプト (`test` / `test:e2e` / `test:fed`) はすべて内部で `cross-env NODE_ENV=test pnpm compile-config` を実行し、`.config/test.yml` を読み込む ([packages/backend/package.json](../../packages/backend/package.json), [packages/backend/scripts/compile_config.js](../../packages/backend/scripts/compile_config.js))。**未作成だとテスト自体が起動しない。** +backend のテストスクリプト (`test` / `test:e2e` / `test:fed`) はすべて `.config/test.yml` を読み込む。**未作成だとテスト自体が起動しない。** 未作成なら以下を 1 回だけ手動コピーする (どちらでも可): @@ -15,7 +15,6 @@ cp .github/misskey/test.yml .config/test.yml 補足: - ルートの `pnpm start:test` (Cypress 用にテストサーバーを起動するコマンド) を使う経路では実行時に `ncp` で自動コピーされる ([package.json](../../package.json))。それ以外で backend テストを直接走らせる時は上記の手動コピーが必要。 -- すでに `.config/test.yml` があれば各テストスクリプトの内部 `compile-config` で十分なので、追加で `pnpm --filter backend compile-config` を叩く必要はない。 - `pnpm start:test` は backend e2e テスト (`pnpm --filter backend test:e2e`) の前提ではない (ポート競合の元になるため使わないこと)。 ## Backend (Vitest 4, 3 設定) diff --git a/.claude/skills/create-migration/SKILL.md b/.claude/skills/create-migration/SKILL.md index 64f76cb9d71..45dc631b636 100644 --- a/.claude/skills/create-migration/SKILL.md +++ b/.claude/skills/create-migration/SKILL.md @@ -49,7 +49,6 @@ pnpm --filter backend exec typeorm migration:generate -d ormconfig.js -o --esm m - `pnpm build-pre` を実行して `built/meta.json` を生成する (`loadConfig()` が `built/meta.json` を必須とするため。`pnpm build` 済みであれば不要)。 - `.config/default.yml` が存在すること (なければ `.config/example.yml` を参考に作成する)。 -- `pnpm --filter backend compile-config` を実行して `built/.config.json` を生成する (`ormconfig.js` が `loadConfig()` 経由で必須とする。未実行だと "Compiled configuration file not found." エラーになる)。 - `pnpm --filter backend build` でエンティティを最新ビルド (CLI は `built/` を読む)。 - ローカル DB を起動する (`docker compose -f compose.local-db.yml up -d`)。 diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index b6164ebc4cf..dcb6e524d1c 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -41,7 +41,7 @@ SPDX-License-Identifier: AGPL-3.0-only - Frontend test: `pnpm --filter frontend test` - Migration 差分検査: `pnpm --filter backend check-migrations` -> **backend テスト (`test` / `test:e2e` / `test:fed`) 実行前に `.config/test.yml` が必要。** 未作成の場合は `ncp .github/misskey/test.yml .config/test.yml` (または `cp .github/misskey/test.yml .config/test.yml`) を実行してから走らせる。各テストスクリプトが内部で `cross-env NODE_ENV=test pnpm compile-config` を呼ぶため、コピー済みであれば追加の compile-config は不要。 +> **backend テスト (`test` / `test:e2e` / `test:fed`) 実行前に `.config/test.yml` が必要。** 未作成の場合は `ncp .github/misskey/test.yml .config/test.yml` (または `cp .github/misskey/test.yml .config/test.yml`) を実行してから走らせる。 変更範囲に応じて最も近いコマンドから優先して検証し、必要なら全体コマンドに広げること。 diff --git a/.github/workflows/get-backend-memory.yml b/.github/workflows/get-backend-memory.yml index 66c8a00fe26..b87d9f8f11d 100644 --- a/.github/workflows/get-backend-memory.yml +++ b/.github/workflows/get-backend-memory.yml @@ -56,8 +56,6 @@ jobs: run: git diff --exit-code pnpm-lock.yaml - name: Copy Configure run: cp .github/misskey/test.yml .config/default.yml - - name: Compile Configure - run: pnpm convert:config - name: Build run: pnpm build - name: Run migrations diff --git a/package.json b/package.json index f90c2603dad..9f76c7bb5e8 100644 --- a/package.json +++ b/package.json @@ -22,15 +22,14 @@ ], "private": true, "scripts": { - "compile-config": "cd packages/backend && pnpm compile-config", "build-pre": "node scripts/build-pre.mjs", "build-assets": "node ./scripts/build-assets.mjs", "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": "pnpm check:connect && cd packages/backend && node ./built/boot/entry.js", - "start:inspect": "cd packages/backend && node --inspect ./built/boot/entry.js", - "start:test": "ncp ./.github/misskey/test.yml ./.config/test.yml && cd packages/backend && cross-env NODE_ENV=test node ./built/boot/entry.js", + "start": "pnpm check:connect && cd packages/backend && node ./built/entry.js", + "start:inspect": "cd packages/backend && node --inspect ./built/entry.js", + "start:test": "ncp ./.github/misskey/test.yml ./.config/test.yml && cd packages/backend && 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/migration/1745378064470-composite-note-index.js b/packages/backend/migration/1745378064470-composite-note-index.js index 12108a6b3cc..576bf7d19a9 100644 --- a/packages/backend/migration/1745378064470-composite-note-index.js +++ b/packages/backend/migration/1745378064470-composite-note-index.js @@ -3,14 +3,14 @@ * SPDX-License-Identifier: AGPL-3.0-only */ -import { isConcurrentIndexMigrationEnabled } from "./js/migration-config.js"; +const isConcurrentIndexMigrationEnabled = process.env.MISSKEY_MIGRATION_CREATE_INDEX_CONCURRENTLY === '1'; export class CompositeNoteIndex1745378064470 { name = 'CompositeNoteIndex1745378064470'; - transaction = isConcurrentIndexMigrationEnabled() ? false : undefined; + transaction = isConcurrentIndexMigrationEnabled ? false : undefined; async up(queryRunner) { - const concurrently = isConcurrentIndexMigrationEnabled(); + const concurrently = isConcurrentIndexMigrationEnabled; if (concurrently) { const hasValidIndex = await queryRunner.query(`SELECT indisvalid FROM pg_index INNER JOIN pg_class ON pg_index.indexrelid = pg_class.oid WHERE pg_class.relname = 'IDX_724b311e6f883751f261ebe378'`); @@ -29,7 +29,7 @@ export class CompositeNoteIndex1745378064470 { } async down(queryRunner) { - const mayConcurrently = isConcurrentIndexMigrationEnabled() ? 'CONCURRENTLY' : ''; + const mayConcurrently = isConcurrentIndexMigrationEnabled ? 'CONCURRENTLY' : ''; await queryRunner.query(`DROP INDEX IF EXISTS "IDX_724b311e6f883751f261ebe378"`); await queryRunner.query(`CREATE INDEX ${mayConcurrently} "IDX_5b87d9d19127bd5d92026017a7" ON "note" ("userId")`); } diff --git a/packages/backend/package.json b/packages/backend/package.json index 5d11712d099..3cbb6f9286d 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -7,20 +7,20 @@ "node": "^22.15.0 || ^24.10.0" }, "scripts": { - "start": "node ./built/boot/entry.js", - "start:inspect": "node --inspect ./built/boot/entry.js", - "start:test": "cross-env NODE_ENV=test node ./built/boot/entry.js", + "start": "node ./built/entry.js", + "start:inspect": "node --inspect ./built/entry.js", + "start:test": "cross-env NODE_ENV=test node ./built/entry.js", "migrate": "pnpm typeorm migration:run -d ormconfig.js", "revert": "pnpm typeorm migration:revert -d ormconfig.js", - "cli": "node ./built/boot/cli.js", + "cli": "node ./built/cli.js", "check:connect": "node ./scripts/check_connect.js", "build": "rolldown -c", "build:unit": "rolldown -c --sourcemap", "build:e2e": "rolldown -c --e2e", "build:tsc": "tsgo -p tsconfig.json && tsc-alias -p tsconfig.json", - "watch": "pnpm compile-config && node ./scripts/watch.mjs", + "watch": "node ./scripts/watch.mjs", "restart": "pnpm build && pnpm start", - "dev": "pnpm compile-config && rolldown -c --watch", + "dev": "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", From e60f27d3aafe36785824269dfc2d00dc65880499 Mon Sep 17 00:00:00 2001 From: kakkokari-gtyih <67428053+kakkokari-gtyih@users.noreply.github.com> Date: Fri, 15 May 2026 17:51:55 +0900 Subject: [PATCH 4/5] fix --- packages/backend/package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/backend/package.json b/packages/backend/package.json index 3cbb6f9286d..6a317c815c0 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -200,7 +200,6 @@ "eslint-plugin-import": "2.32.0", "execa": "9.6.1", "fkill": "10.0.3", - "js-yaml": "4.1.1", "pid-port": "2.1.1", "rolldown": "1.0.0", "simple-oauth2": "5.1.0", From d21faae38c3d5145e6dfa1a8863379b74b02212d Mon Sep 17 00:00:00 2001 From: kakkokari-gtyih <67428053+kakkokari-gtyih@users.noreply.github.com> Date: Wed, 3 Jun 2026 09:17:15 +0900 Subject: [PATCH 5/5] fix: update ai documents --- .../references/knowledge/backend-testing.md | 3 +-- .../references/tasks/creating-migration.md | 1 - .../working-on-backend/scripts/prepare-generate.mjs | 11 ++++------- 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/.claude/skills/working-on-backend/references/knowledge/backend-testing.md b/.claude/skills/working-on-backend/references/knowledge/backend-testing.md index 10add7d84cc..4cae2b79beb 100644 --- a/.claude/skills/working-on-backend/references/knowledge/backend-testing.md +++ b/.claude/skills/working-on-backend/references/knowledge/backend-testing.md @@ -14,7 +14,7 @@ Misskey backend のテスト構成、`.config/test.yml` の前提、e2e テス ## 前提: `.config/test.yml` -backend のテストスクリプト (`test` / `test:e2e` / `test:fed`) はすべて内部で `cross-env NODE_ENV=test pnpm compile-config` を実行し、`.config/test.yml` を読み込む ([packages/backend/package.json](../../../../../packages/backend/package.json), [packages/backend/scripts/compile_config.js](../../../../../packages/backend/scripts/compile_config.js))。**未作成だとテスト自体が起動しない**。 +backend のテストスクリプト (`test` / `test:e2e` / `test:fed`) はすべて `.config/test.yml` を読み込む。**未作成だとテスト自体が起動しない。** 未作成なら以下を 1 回だけ手動コピーする (どちらでも可): @@ -27,7 +27,6 @@ cp .github/misskey/test.yml .config/test.yml 補足: - ルートの `pnpm start:test` (Cypress 用にテストサーバーを起動するコマンド) を使う経路では実行時に `ncp` で自動コピーされる ([package.json](../../../../../package.json))。それ以外で backend テストを直接走らせる時は上記の手動コピーが必要 -- すでに `.config/test.yml` があれば各テストスクリプトの内部 `compile-config` で十分なので、追加で `pnpm --filter backend compile-config` を叩く必要はない - `pnpm start:test` は backend e2e テスト (`pnpm --filter backend test:e2e`) の前提ではない (ポート競合の元になるため使わないこと) ## テスト種別と実行コマンド diff --git a/.claude/skills/working-on-backend/references/tasks/creating-migration.md b/.claude/skills/working-on-backend/references/tasks/creating-migration.md index 17653c2998b..671121cca8d 100644 --- a/.claude/skills/working-on-backend/references/tasks/creating-migration.md +++ b/.claude/skills/working-on-backend/references/tasks/creating-migration.md @@ -72,7 +72,6 @@ node .claude/skills/working-on-backend/scripts/prepare-generate.mjs スクリプトがやること: - `pnpm build-pre` → `built/meta.json` を生成 (`loadConfig()` が要求) -- `pnpm --filter backend compile-config` → `built/.config.json` を生成 (`ormconfig.js` の `loadConfig()` が要求するのはこれ。ソースの `.config/default.yml` はその入力なので、無ければ `.config/example.yml` から作っておく) - `pnpm --filter backend build` → エンティティを `built/` に反映 (CLI は `built/` を読む) - `docker compose -f compose.local-db.yml up -d --wait db` → ローカル DB (postgres) を起動。`--wait` は Docker Compose v2.1.1 (2021-11) 以降が必要 (v2 の `docker compose` 前提。EOL の `docker-compose` v1 は対象外) diff --git a/.claude/skills/working-on-backend/scripts/prepare-generate.mjs b/.claude/skills/working-on-backend/scripts/prepare-generate.mjs index d502faf6664..58bb3dd602b 100644 --- a/.claude/skills/working-on-backend/scripts/prepare-generate.mjs +++ b/.claude/skills/working-on-backend/scripts/prepare-generate.mjs @@ -23,7 +23,7 @@ function step(msg) { console.log(`\n==> ${msg}`); } function run(cmd) { console.log(`$ ${cmd}`); execSync(cmd, { stdio: 'inherit' }); } function fail(msg) { console.error(`ERROR: ${msg}`); process.exit(1); } -step('1/5 設定ファイルの確認'); +step('1/4 設定ファイルの確認'); if (!existsSync('.config/default.yml')) { fail([ '.config/default.yml が存在しません。', @@ -46,16 +46,13 @@ if (!existsSync('.config/docker.env')) { } console.log('OK: .config/default.yml と .config/docker.env あり'); -step('2/5 built/meta.json の生成 (build-pre)'); +step('2/4 built/meta.json の生成 (build-pre)'); run('pnpm build-pre'); -step('3/5 設定のコンパイル (compile-config -> built/.config.json)'); -run('pnpm --filter backend compile-config'); - -step('4/5 backend のビルド (エンティティを built/ へ反映)'); +step('3/4 backend のビルド (エンティティを built/ へ反映)'); run('pnpm --filter backend build'); -step('5/5 ローカル DB の起動 (postgres のみ・healthcheck 完了まで待機)'); +step('4/4 ローカル DB の起動 (postgres のみ・healthcheck 完了まで待機)'); // migration:generate が必要とするのは postgres だけ。db サービスに絞れば meilisearch.env 等が無くても動く。 // --wait は compose の pg_isready healthcheck 完了まで待つ。直後の migration:generate が // DB 未起動で失敗しないために必須。--wait は Docker Compose v2.1.1 (2021-11) で導入されており、