diff --git a/apps/server/src/application/coordinators/disconnectCoordinator.ts b/apps/server/src/application/coordinators/disconnectCoordinator.ts index b284eb2..18f23bf 100644 --- a/apps/server/src/application/coordinators/disconnectCoordinator.ts +++ b/apps/server/src/application/coordinators/disconnectCoordinator.ts @@ -12,7 +12,7 @@ import { resolveCoordinatorRuntime } from "./runtimeCoordinatorSupport"; /** 切断調停で利用する入力ポートと出力ポートの契約 */ -export type DisconnectCoordinatorParams = { +type DisconnectCoordinatorParams = { socketId: string; } & DisconnectCoordinatorDeps & { gameOutput: Pick; diff --git a/apps/server/src/domains/game/application/services/BotRosterService.ts b/apps/server/src/domains/game/application/services/BotRosterService.ts index 2073868..3aca566 100644 --- a/apps/server/src/domains/game/application/services/BotRosterService.ts +++ b/apps/server/src/domains/game/application/services/BotRosterService.ts @@ -10,7 +10,7 @@ export type BotPlayerId = string & { readonly [botPlayerIdBrand]: true }; /** BotプレイヤーIDを生成する */ -export const createBotPlayerId = ( +const createBotPlayerId = ( roomId: string, serialNumber: number, ): BotPlayerId => { diff --git a/apps/server/src/domains/game/entities/bomb/bombDedup.ts b/apps/server/src/domains/game/entities/bomb/bombDedup.ts index d28ba33..e3955d3 100644 --- a/apps/server/src/domains/game/entities/bomb/bombDedup.ts +++ b/apps/server/src/domains/game/entities/bomb/bombDedup.ts @@ -17,7 +17,7 @@ }; /** 重複排除テーブルの期限切れエントリを削除する */ -export const cleanupExpiredBombDedup = ( +const cleanupExpiredBombDedup = ( dedupTable: Map, nowMs: number ): void => { diff --git a/apps/server/src/logging/contracts/payloadByScope.ts b/apps/server/src/logging/contracts/payloadByScope.ts index 63b10ac..0480671 100644 --- a/apps/server/src/logging/contracts/payloadByScope.ts +++ b/apps/server/src/logging/contracts/payloadByScope.ts @@ -5,7 +5,7 @@ import { protocol } from "@repo/shared"; import { gameDomainLogEvents, gameUseCaseLogEvents, roomDomainLogEvents, roomUseCaseLogEvents } from "../constants/eventNames"; import { logResults } from "../constants/results"; -import { logScopes, type LogScope } from "../constants/scopes"; +import { logScopes } from "../constants/scopes"; /** Network接続確立ログの契約 */ type NetworkConnectLogPayload = { @@ -276,6 +276,3 @@ [logScopes.ROOM_JOIN_SERVICE]: RoomJoinServiceLogPayload; [logScopes.ROOM_EXIT_SERVICE]: RoomExitServiceLogPayload; }; - -/** スコープごとのログペイロード型を参照するユーティリティ */ -export type LogPayloadOf = LogPayloadByScope[TScope]; diff --git a/apps/server/src/logging/index.ts b/apps/server/src/logging/index.ts index af0031a..3a35321 100644 --- a/apps/server/src/logging/index.ts +++ b/apps/server/src/logging/index.ts @@ -3,12 +3,8 @@ * logging配下の公開APIを集約して再公開する */ -/** ログ出力関数を再公開 */ -export { logEvent } from "./logger"; - /** ログスコープ定数と型を再公開 */ export { logScopes } from "./constants/scopes"; -export type { LogScope } from "./constants/scopes"; /** ログ結果値定数を再公開 */ export { logResults } from "./constants/results"; @@ -20,6 +16,3 @@ gameDomainLogEvents, roomDomainLogEvents, } from "./constants/eventNames"; - -/** ログペイロード契約型を再公開 */ -export type { LogPayloadByScope, LogPayloadOf } from "./contracts/payloadByScope"; diff --git a/apps/server/src/network/bootstrap/createServerRuntime.ts b/apps/server/src/network/bootstrap/createServerRuntime.ts index eb577e3..30600ac 100644 --- a/apps/server/src/network/bootstrap/createServerRuntime.ts +++ b/apps/server/src/network/bootstrap/createServerRuntime.ts @@ -9,7 +9,7 @@ import { createIo } from "./createIo"; /** 起動時に構築する実行コンテキスト */ -export type ServerRuntime = { +type ServerRuntime = { socketManager: SocketManager; }; diff --git a/apps/server/src/network/handlers/createOutputAdapters.ts b/apps/server/src/network/handlers/createOutputAdapters.ts index 2547214..abd3bd5 100644 --- a/apps/server/src/network/handlers/createOutputAdapters.ts +++ b/apps/server/src/network/handlers/createOutputAdapters.ts @@ -23,7 +23,7 @@ }; /** 切断処理で利用するゲームとルームの出力アダプタ集合 */ -export type DisconnectOutputAdapters = { +type DisconnectOutputAdapters = { game: GameDisconnectOutputAdapter; room: Pick; }; diff --git a/apps/server/src/network/handlers/index.ts b/apps/server/src/network/handlers/index.ts index 079d360..e6d1d4b 100644 --- a/apps/server/src/network/handlers/index.ts +++ b/apps/server/src/network/handlers/index.ts @@ -5,9 +5,3 @@ /** 接続イベントの共通ハンドラ登録関数を再公開する */ export { registerConnectionHandlers } from "./registerConnectionHandlers"; - -/** ゲームイベント受信ハンドラ登録関数を再公開する */ -export { registerGameHandlers } from "./game/registerGameHandlers"; - -/** ルームイベント受信ハンドラ登録関数を再公開する */ -export { registerRoomHandlers } from "./room/registerRoomHandlers"; diff --git a/apps/server/src/network/handlers/orchestratorEventLogger.ts b/apps/server/src/network/handlers/orchestratorEventLogger.ts index b7decd3..7cfb0a5 100644 --- a/apps/server/src/network/handlers/orchestratorEventLogger.ts +++ b/apps/server/src/network/handlers/orchestratorEventLogger.ts @@ -7,7 +7,7 @@ import { logResults, logScopes } from "@server/logging/index"; /** オーケストレータで未解決時に記録するイベント型 */ -export type MissingRoomNetworkEvent = +type MissingRoomNetworkEvent = | typeof protocol.SocketEvents.MOVE | typeof protocol.SocketEvents.PLACE_BOMB | typeof protocol.SocketEvents.BOMB_HIT_REPORT; diff --git a/apps/server/src/network/handlers/registerConnectionHandlers.ts b/apps/server/src/network/handlers/registerConnectionHandlers.ts index aa4b953..0703ca3 100644 --- a/apps/server/src/network/handlers/registerConnectionHandlers.ts +++ b/apps/server/src/network/handlers/registerConnectionHandlers.ts @@ -2,7 +2,7 @@ * registerConnectionHandlers * 接続時にルームとゲームの各ハンドラを登録する */ -import { Server, Socket } from "socket.io"; +import { Socket } from "socket.io"; import { protocol } from "@repo/shared"; import { disconnectCoordinator } from "@server/application/coordinators/disconnectCoordinator"; import { registerGameHandlers } from "./game/registerGameHandlers"; diff --git a/apps/server/src/network/handlers/registration/createConnectionRegistrationContext.ts b/apps/server/src/network/handlers/registration/createConnectionRegistrationContext.ts index 2a087a6..e9a17e3 100644 --- a/apps/server/src/network/handlers/registration/createConnectionRegistrationContext.ts +++ b/apps/server/src/network/handlers/registration/createConnectionRegistrationContext.ts @@ -10,13 +10,13 @@ } from "../createOutputAdapters"; /** 接続イベント調停で利用する依存束 */ -export type ConnectionHandlerDeps = { +type ConnectionHandlerDeps = { io: Server; socket: Socket; } & Omit; /** 接続イベント登録で利用する共通コンテキスト */ -export type ConnectionRegistrationContext = { +type ConnectionRegistrationContext = { deps: ConnectionHandlerDeps; socketOutputAdapters: SocketOutputAdapters; }; diff --git a/apps/server/src/network/handlers/registration/createSocketRegistrationContext.ts b/apps/server/src/network/handlers/registration/createSocketRegistrationContext.ts index 1eb2d3e..a8e03b4 100644 --- a/apps/server/src/network/handlers/registration/createSocketRegistrationContext.ts +++ b/apps/server/src/network/handlers/registration/createSocketRegistrationContext.ts @@ -7,7 +7,7 @@ import { createServerSocketOnBridge } from "../socketEventBridge"; /** 受信イベント登録で利用する共通コンテキスト */ -export type SocketRegistrationContext = { +type SocketRegistrationContext = { onEvent: ReturnType["onEvent"]; guardOnEvent: ReturnType["guardOnEvent"]; }; diff --git a/apps/server/src/network/handlers/registration/index.ts b/apps/server/src/network/handlers/registration/index.ts index d66cde1..9554126 100644 --- a/apps/server/src/network/handlers/registration/index.ts +++ b/apps/server/src/network/handlers/registration/index.ts @@ -7,15 +7,8 @@ export { createSocketRegistrationContext, } from "./createSocketRegistrationContext"; -export type { - SocketRegistrationContext, -} from "./createSocketRegistrationContext"; /** 接続イベント登録コンテキストを再公開する */ export { createConnectionRegistrationContext, } from "./createConnectionRegistrationContext"; -export type { - ConnectionHandlerDeps, - ConnectionRegistrationContext, -} from "./createConnectionRegistrationContext"; diff --git a/apps/server/src/network/types/connectionPorts.ts b/apps/server/src/network/types/connectionPorts.ts index 110e570..b025c7b 100644 --- a/apps/server/src/network/types/connectionPorts.ts +++ b/apps/server/src/network/types/connectionPorts.ts @@ -20,14 +20,14 @@ } from "@server/domains/room/application/ports/roomUseCasePorts"; /** 接続時のルーム処理で利用する入力ポート集合 */ -export type ConnectionRoomPort = +type ConnectionRoomPort = & JoinRoomPort & FindRoomByOwnerPort & FindRoomByPlayerPort & RoomPhaseTransitionPort; /** 接続時のゲームランタイム解決で利用する入力ポート集合 */ -export type ConnectionRuntimePort = +type ConnectionRuntimePort = & EnsureGameRuntimePort & FindGameByRoomPort & FindGameByPlayerPort; diff --git a/package.json b/package.json index bca0277..c586fb4 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,9 @@ "description": "", "main": "index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "echo \"Error: no test specified\" && exit 1", + "shared:prune": "node scripts/ts-prune-filter.mjs packages/shared/tsconfig.json packages/shared/ts-prune-allowlist.json", + "shared:prune:check": "node scripts/ts-prune-filter.mjs packages/shared/tsconfig.json packages/shared/ts-prune-allowlist.json --fail-on-findings" }, "keywords": [], "author": "", diff --git a/packages/shared/ts-prune-allowlist.json b/packages/shared/ts-prune-allowlist.json new file mode 100644 index 0000000..e63bfc8 --- /dev/null +++ b/packages/shared/ts-prune-allowlist.json @@ -0,0 +1,7 @@ +{ + "ignoreFiles": [ + "packages/shared/src/index.ts", + "packages/shared/src/config/index.ts" + ], + "ignoreExports": [] +} \ No newline at end of file diff --git a/scripts/ts-prune-filter.mjs b/scripts/ts-prune-filter.mjs new file mode 100644 index 0000000..37a48a5 --- /dev/null +++ b/scripts/ts-prune-filter.mjs @@ -0,0 +1,64 @@ +import { readFileSync } from "node:fs"; +import { spawnSync } from "node:child_process"; + +const [, , tsconfigPath, allowlistPath, ...restArgs] = process.argv; + +if (!tsconfigPath || !allowlistPath) { + console.error( + "Usage: node scripts/ts-prune-filter.mjs [--fail-on-findings]", + ); + process.exit(2); +} + +const failOnFindings = restArgs.includes("--fail-on-findings"); + +const allowlist = JSON.parse(readFileSync(allowlistPath, "utf8")); +const ignoreFiles = new Set(allowlist.ignoreFiles ?? []); +const ignoreExports = new Set(allowlist.ignoreExports ?? []); + +const run = spawnSync( + "pnpm", + ["dlx", "ts-prune", "-p", tsconfigPath], + { encoding: "utf8" }, +); + +if (run.error) { + console.error(run.error.message); + process.exit(2); +} + +const stdout = run.stdout ?? ""; +const stderr = run.stderr ?? ""; +if (stderr.trim()) { + process.stderr.write(stderr); +} + +const lines = stdout + .split("\n") + .map((line) => line.trimEnd()) + .filter((line) => line.length > 0); + +const findings = lines.filter((line) => { + const match = line.match(/^(.+?):\d+\s+-\s+([^\s].*?)\s*(?:\(used in module\))?$/); + if (!match) { + return true; + } + + const filePath = match[1]; + const symbolName = match[2]; + if (ignoreFiles.has(filePath)) { + return false; + } + + return !ignoreExports.has(`${filePath}#${symbolName}`); +}); + +if (findings.length > 0) { + process.stdout.write(`${findings.join("\n")}\n`); +} + +if (failOnFindings && findings.length > 0) { + process.exit(1); +} + +process.exit(0); \ No newline at end of file