diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e1f35ed9..d3ae7189 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -469,8 +469,8 @@ jobs: - name: Verify player SEA bundle if: needs.changes.outputs.sea_player_changed == 'true' - run: pnpm exec tsx scripts/build-sea.ts --package player --bundle-only + run: node --conditions=source scripts/build-sea.ts --package player --bundle-only - name: Verify audio-renderer SEA bundle if: needs.changes.outputs.sea_audio_renderer_changed == 'true' - run: pnpm exec tsx scripts/build-sea.ts --package audio-renderer --bundle-only + run: node --conditions=source scripts/build-sea.ts --package audio-renderer --bundle-only diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e9d3143e..4dd79bec 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -88,7 +88,7 @@ jobs: shell: bash run: | set -euo pipefail - pnpm exec tsx --tsconfig tsconfig.typecheck.json scripts/release/resolve-package-releases.ts \ + node --conditions=source scripts/release/resolve-package-releases.ts \ --base "${{ steps.release_refs.outputs.release_base }}" \ --head "${{ steps.release_refs.outputs.release_target }}" \ --github-output "$GITHUB_OUTPUT" \ @@ -403,7 +403,7 @@ jobs: RELEASE_TARGET: ${{ needs.prepare.outputs.release_target }} run: | set -euo pipefail - pnpm exec tsx --tsconfig tsconfig.typecheck.json scripts/release/create-package-releases.ts \ + node --conditions=source scripts/release/create-package-releases.ts \ --repo "$GITHUB_REPOSITORY" \ --release-target "$RELEASE_TARGET" \ --releases-json tmp/release-data/releases.json \ diff --git a/package.json b/package.json index faf89d3d..80d970da 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "private": true, "description": "TypeScript monorepo for the be-music BMS/BMSON toolchain", "license": "MIT", + "type": "module", "scripts": { "build": "pnpm -r --sort --workspace-concurrency=Infinity run build", "clean": "pnpm -r run clean && rimraf coverage \"packages/*/node_modules/.vite\"", @@ -17,9 +18,9 @@ "format:check": "pnpm -r --parallel run format:check", "test": "vitest run", "test:coverage": "vitest run --coverage", - "bench": "tsx --tsconfig tsconfig.typecheck.json scripts/bench/exports.ts", - "bench:aggregate": "tsx --tsconfig tsconfig.typecheck.json scripts/bench/aggregate-results.ts", - "bench:compare": "tsx --tsconfig tsconfig.typecheck.json scripts/bench/compare-results.ts", + "bench": "node --conditions=source scripts/bench/exports.ts", + "bench:aggregate": "node --conditions=source scripts/bench/aggregate-results.ts", + "bench:compare": "node --conditions=source scripts/bench/compare-results.ts", "player": "pnpm --filter @be-music/player-tui run dev", "playlog": "pnpm --filter @be-music/player-tui run playlog", "player:web": "pnpm --filter @be-music/player-web-demo run dev", @@ -33,6 +34,17 @@ "stringify": "pnpm --filter @be-music/stringifier run dev" }, "devDependencies": { + "@be-music/audio-renderer": "workspace:*", + "@be-music/chart": "workspace:*", + "@be-music/editor": "workspace:*", + "@be-music/json": "workspace:*", + "@be-music/lr2-skin": "workspace:*", + "@be-music/parser": "workspace:*", + "@be-music/player": "workspace:*", + "@be-music/player-tui": "workspace:*", + "@be-music/player-web": "workspace:*", + "@be-music/stringifier": "workspace:*", + "@be-music/utils": "workspace:*", "@changesets/cli": "^3.0.1", "@types/node": "^26.4.0", "@vitest/coverage-v8": "^4.1.10", @@ -41,7 +53,6 @@ "rimraf": "^6.0.1", "tinybench": "^6.1.3", "tsdown": "^0.22.14", - "tsx": "^4.23.13", "typescript": "^7.0.2", "vite": "^8.2.2", "vitest": "^4.1.10" diff --git a/packages/audio-renderer/package.json b/packages/audio-renderer/package.json index 251b1711..1ac034bd 100644 --- a/packages/audio-renderer/package.json +++ b/packages/audio-renderer/package.json @@ -27,15 +27,15 @@ "scripts": { "build:bundle": "tsdown", "build": "tsdown", - "build:sea": "tsx ../../scripts/build-sea.ts --package audio-renderer", + "build:sea": "node --conditions=source ../../scripts/build-sea.ts --package audio-renderer", "clean": "rimraf dist tsconfig.tsbuildinfo", - "dev": "tsx --tsconfig ../../tsconfig.typecheck.json src/cli.ts", + "dev": "node --conditions=source src/cli.ts", "typecheck": "tsc -p tsconfig.typecheck.json --pretty", "lint": "oxlint .", "lint:fix": "oxlint . --fix", "format": "oxfmt . --write", "format:check": "oxfmt . --check", - "bench": "tsx --tsconfig ../../tsconfig.typecheck.json scripts/bench.ts" + "bench": "node --conditions=source scripts/bench.ts" }, "dependencies": { "@be-music/chart": "workspace:*", diff --git a/packages/audio-renderer/tsdown.config.ts b/packages/audio-renderer/tsdown.config.ts index 8f4e808f..da3be3dc 100644 --- a/packages/audio-renderer/tsdown.config.ts +++ b/packages/audio-renderer/tsdown.config.ts @@ -9,5 +9,6 @@ export default createPackageTsdownConfig({ entries: { index: 'src/index.ts', cli: 'src/cli.ts', + 'core/triggers': 'src/core/triggers.ts', }, }); diff --git a/packages/beatoraja-skin/package.json b/packages/beatoraja-skin/package.json index 38abe6e9..7ddd53f1 100644 --- a/packages/beatoraja-skin/package.json +++ b/packages/beatoraja-skin/package.json @@ -25,7 +25,7 @@ "lint:fix": "oxlint . --fix", "format": "oxfmt . --write", "format:check": "oxfmt . --check", - "bench": "tsx --tsconfig ../../tsconfig.typecheck.json scripts/bench.ts" + "bench": "node --conditions=source scripts/bench.ts" }, "dependencies": { "@be-music/utils": "workspace:*", diff --git a/packages/beatoraja-skin/src/fengari-types.d.ts b/packages/beatoraja-skin/src/fengari-types.d.ts index b823c2f1..a2d0e62e 100644 --- a/packages/beatoraja-skin/src/fengari-types.d.ts +++ b/packages/beatoraja-skin/src/fengari-types.d.ts @@ -106,7 +106,22 @@ declare module 'fengari' { } // `fengari-web` re-exports the same `lua` / `lauxlib` / `lualib` / `to_luastring` shapes as `fengari` itself, so we -// declare it as the same module surface. +// declare it as the same module surface. Unlike `fengari`, `fengari-web` ships a webpack UMD bundle whose +// `module.exports` is built at runtime (an IIFE return value) rather than plain `exports.x = ...` assignments, so +// Node's static cjs-module-lexer can't discover named exports on it — the package must be imported as a single +// default value and destructured, hence the shape below is a default export instead of `fengari`'s named ones. declare module 'fengari-web' { - export { lua_State, LuaCFunction, lua, lauxlib, lualib, to_luastring, to_jsstring, luastring_of } from 'fengari'; + import type { lua, lauxlib, lualib, lua_State, LuaCFunction, to_luastring, to_jsstring, luastring_of } from 'fengari'; + + export type { lua_State, LuaCFunction }; + + const fengariWeb: { + lua: typeof lua; + lauxlib: typeof lauxlib; + lualib: typeof lualib; + to_luastring: typeof to_luastring; + to_jsstring: typeof to_jsstring; + luastring_of: typeof luastring_of; + }; + export default fengariWeb; } diff --git a/packages/beatoraja-skin/src/lua.ts b/packages/beatoraja-skin/src/lua.ts index 3a5e6ccf..aedaeaf3 100644 --- a/packages/beatoraja-skin/src/lua.ts +++ b/packages/beatoraja-skin/src/lua.ts @@ -18,9 +18,10 @@ // The reference beatoraja themes only use `base` / `table` / `string` / `math` so the strip is non-disruptive. import { normalizePath } from '@be-music/utils/core'; -import { lauxlib, lua, lualib, to_luastring } from 'fengari-web'; +import fengariWeb from 'fengari-web'; import type { lua_State, LuaCFunction } from 'fengari-web'; +const { lauxlib, lua, lualib, to_luastring } = fengariWeb; const { LUA_OK, LUA_REGISTRYINDEX, @@ -262,8 +263,11 @@ class LuaRuntimeOwner { private refs = 0; private closed = false; context: BeatorajaLuaRuntimeContext | undefined; + readonly L: lua_State; - constructor(readonly L: lua_State) {} + constructor(L: lua_State) { + this.L = L; + } makeFunction(ref: number): BeatorajaLuaFunctionValue { this.refs += 1; diff --git a/packages/chart/package.json b/packages/chart/package.json index 46f33d8c..1fb8150f 100644 --- a/packages/chart/package.json +++ b/packages/chart/package.json @@ -25,7 +25,7 @@ "lint:fix": "oxlint . --fix", "format": "oxfmt . --write", "format:check": "oxfmt . --check", - "bench": "tsx --tsconfig ../../tsconfig.typecheck.json scripts/bench.ts" + "bench": "node --conditions=source scripts/bench.ts" }, "dependencies": { "@be-music/json": "workspace:*" diff --git a/packages/editor/package.json b/packages/editor/package.json index c1f97578..af983bde 100644 --- a/packages/editor/package.json +++ b/packages/editor/package.json @@ -23,13 +23,13 @@ "build:bundle": "tsdown", "build": "tsdown", "clean": "rimraf dist tsconfig.tsbuildinfo", - "dev": "tsx --tsconfig ../../tsconfig.typecheck.json src/cli.ts", + "dev": "node --conditions=source src/cli.ts", "typecheck": "tsc -p tsconfig.typecheck.json --pretty", "lint": "oxlint .", "lint:fix": "oxlint . --fix", "format": "oxfmt . --write", "format:check": "oxfmt . --check", - "bench": "tsx --tsconfig ../../tsconfig.typecheck.json scripts/bench.ts" + "bench": "node --conditions=source scripts/bench.ts" }, "dependencies": { "@be-music/chart": "workspace:*", diff --git a/packages/json/package.json b/packages/json/package.json index 0c56281d..8c7093c3 100644 --- a/packages/json/package.json +++ b/packages/json/package.json @@ -25,7 +25,7 @@ "lint:fix": "oxlint . --fix", "format": "oxfmt . --write", "format:check": "oxfmt . --check", - "bench": "tsx --tsconfig ../../tsconfig.typecheck.json scripts/bench.ts" + "bench": "node --conditions=source scripts/bench.ts" }, "dependencies": { "@be-music/utils": "workspace:*" diff --git a/packages/lr2-skin/package.json b/packages/lr2-skin/package.json index 5c34159a..ea93a11c 100644 --- a/packages/lr2-skin/package.json +++ b/packages/lr2-skin/package.json @@ -25,7 +25,7 @@ "lint:fix": "oxlint . --fix", "format": "oxfmt . --write", "format:check": "oxfmt . --check", - "bench": "tsx --tsconfig ../../tsconfig.typecheck.json scripts/bench.ts" + "bench": "node --conditions=source scripts/bench.ts" }, "dependencies": { "@be-music/chart": "workspace:*", diff --git a/packages/parser/package.json b/packages/parser/package.json index 553de79a..459c3768 100644 --- a/packages/parser/package.json +++ b/packages/parser/package.json @@ -23,13 +23,13 @@ "build:bundle": "tsdown", "build": "tsdown", "clean": "rimraf dist tsconfig.tsbuildinfo", - "dev": "tsx --tsconfig ../../tsconfig.typecheck.json src/cli.ts", + "dev": "node --conditions=source src/cli.ts", "typecheck": "tsc -p tsconfig.typecheck.json --pretty", "lint": "oxlint .", "lint:fix": "oxlint . --fix", "format": "oxfmt . --write", "format:check": "oxfmt . --check", - "bench": "tsx --tsconfig ../../tsconfig.typecheck.json scripts/bench.ts" + "bench": "node --conditions=source scripts/bench.ts" }, "dependencies": { "@be-music/chart": "workspace:*", diff --git a/packages/player-tui/package.json b/packages/player-tui/package.json index 0a4c679f..4eb24db3 100644 --- a/packages/player-tui/package.json +++ b/packages/player-tui/package.json @@ -23,18 +23,18 @@ "scripts": { "build:bundle": "tsdown", "build": "tsdown", - "build:sea": "tsx ../../scripts/build-sea.ts --package player", + "build:sea": "node --conditions=source ../../scripts/build-sea.ts --package player", "clean": "rimraf dist tsconfig.tsbuildinfo", - "dev": "tsx --tsconfig ../../tsconfig.typecheck.json src/cli.ts", - "playlog": "tsx --tsconfig ../../tsconfig.typecheck.json src/playlog-cli.ts", - "diag:keyboard": "tsx --tsconfig ../../tsconfig.typecheck.json src/keyboard-diagnostic.ts", - "diag:gameplay-input": "tsx --tsconfig ../../tsconfig.typecheck.json src/gameplay-input-diagnostic.ts", + "dev": "node --conditions=source src/cli.ts", + "playlog": "node --conditions=source src/playlog-cli.ts", + "diag:keyboard": "node --conditions=source src/keyboard-diagnostic.ts", + "diag:gameplay-input": "node --conditions=source src/gameplay-input-diagnostic.ts", "typecheck": "tsc -p tsconfig.typecheck.json --pretty", "lint": "oxlint .", "lint:fix": "oxlint . --fix", "format": "oxfmt . --write", "format:check": "oxfmt . --check", - "bench": "tsx --tsconfig ../../tsconfig.typecheck.json scripts/bench.ts" + "bench": "node --conditions=source scripts/bench.ts" }, "dependencies": { "@be-music/audio-renderer": "workspace:*", diff --git a/packages/player-tui/src/bga-video.ts b/packages/player-tui/src/bga-video.ts index 1aa37ccf..e6924b39 100644 --- a/packages/player-tui/src/bga-video.ts +++ b/packages/player-tui/src/bga-video.ts @@ -1,6 +1,5 @@ import { readFile } from 'node:fs/promises'; import { basename } from 'node:path'; -import { fileURLToPath } from 'node:url'; import { Worker } from 'node:worker_threads'; import { createAbortError, isAbortError, throwIfAborted } from '@be-music/utils/core'; import { loadOptionalNodeModule } from '@be-music/utils/optional-node-module'; @@ -244,7 +243,6 @@ export async function decodeVideoFramesToSourceFramesInWorker( : new Worker(resolveBgaVideoWorkerUrl(), { workerData: workerInitData, execArgv: resolveBgaVideoWorkerExecArgv(), - env: resolveBgaVideoWorkerEnv(), }); return await new Promise((resolve, reject) => { @@ -668,14 +666,3 @@ function resolveBgaVideoWorkerExecArgv(): string[] { return [...process.execArgv, '--conditions=source']; } -function resolveBgaVideoWorkerEnv(): NodeJS.ProcessEnv { - if (!import.meta.url.endsWith('.ts')) { - return process.env; - } - - return { - ...process.env, - TSX_TSCONFIG_PATH: - process.env.TSX_TSCONFIG_PATH ?? fileURLToPath(new URL('../../../tsconfig.typecheck.json', import.meta.url)), - }; -} diff --git a/packages/player-tui/src/node/node-gameplay-runtime.ts b/packages/player-tui/src/node/node-gameplay-runtime.ts index 46539d6c..cacd09d9 100644 --- a/packages/player-tui/src/node/node-gameplay-runtime.ts +++ b/packages/player-tui/src/node/node-gameplay-runtime.ts @@ -2,7 +2,6 @@ import { effect } from 'alien-signals'; import { createAbortError } from '@be-music/utils/core'; import type { LogEntry } from '@be-music/utils/log'; import type { BeMusicJson } from '@be-music/json'; -import { fileURLToPath } from 'node:url'; import { Worker, type MessagePort } from 'node:worker_threads'; import { createPlayerInputSignalBus } from '@be-music/player/core/input-signal-bus'; import type { PlayerLoadProgress, PlayerSummary } from '@be-music/player/core/engine'; @@ -42,7 +41,6 @@ export async function runNodeGameplayRuntime(options: NodeGameplayRuntimeOptions : new Worker(resolveNodeGameplayWorkerUrl(), { workerData: createWorkerInitData(options), execArgv: resolveNodeGameplayWorkerExecArgv(), - env: resolveNodeGameplayWorkerEnv(), }); const writeOutput = options.writeOutput ?? ((text: string) => process.stdout.write(text)); @@ -310,18 +308,6 @@ function resolveNodeGameplayWorkerExecArgv(): string[] { return [...process.execArgv, '--conditions=source']; } -function resolveNodeGameplayWorkerEnv(): NodeJS.ProcessEnv { - if (!import.meta.url.endsWith('.ts')) { - return process.env; - } - - return { - ...process.env, - TSX_TSCONFIG_PATH: - process.env.TSX_TSCONFIG_PATH ?? fileURLToPath(new URL('../../../../tsconfig.typecheck.json', import.meta.url)), - }; -} - function postWorkerMessage( worker: Worker, message: NodeGameplayWorkerInboundMessage, diff --git a/packages/player-tui/src/node/node-ui-runtime.test.ts b/packages/player-tui/src/node/node-ui-runtime.test.ts index e079b9b8..e99e3959 100644 --- a/packages/player-tui/src/node/node-ui-runtime.test.ts +++ b/packages/player-tui/src/node/node-ui-runtime.test.ts @@ -217,11 +217,9 @@ describe('node ui runtime', () => { expect(messagesOfKind(worker, 'dispose')).toHaveLength(1); }); - test('passes tsx tsconfig path to the UI worker in source runs', async () => { + test('passes the source-conditions exec flag to the UI worker in source runs', async () => { const uiSignals = createPlayerUiSignalBus(createFrame()); const runtime = await createNodeUiRuntime(createContext(uiSignals)); - const workerEnv = workerState.lastWorkerOptions?.env; - const workerEnvObject = typeof workerEnv === 'object' ? (workerEnv as NodeJS.ProcessEnv) : undefined; const workerExecArgv = workerState.lastWorkerOptions?.execArgv; const workerData = workerState.lastWorkerOptions?.workerData as | { @@ -235,8 +233,6 @@ describe('node ui runtime', () => { } | undefined; - expect(typeof workerEnv).toBe('object'); - expect(workerEnvObject?.TSX_TSCONFIG_PATH).toContain('tsconfig.typecheck.json'); expect(workerExecArgv).toContain('--conditions=source'); expect(workerData).toMatchObject({ stdinIsTTY: Boolean(process.stdin.isTTY), diff --git a/packages/player-tui/src/node/node-ui-runtime.ts b/packages/player-tui/src/node/node-ui-runtime.ts index a3039105..d3ec134b 100644 --- a/packages/player-tui/src/node/node-ui-runtime.ts +++ b/packages/player-tui/src/node/node-ui-runtime.ts @@ -1,7 +1,6 @@ import { createAbortError, isAbortError } from '@be-music/utils/core'; import type { LogEntry } from '@be-music/utils/log'; import { effect } from 'alien-signals'; -import { fileURLToPath } from 'node:url'; import { MessageChannel, type MessagePort, Worker } from 'node:worker_threads'; import type { LaneBinding } from '../manual-input.ts'; import type { PlayerStateSignals } from '@be-music/player/state-signals'; @@ -62,7 +61,6 @@ export async function createNodeUiRuntime(options: NodeUiRuntimeOptions): Promis : new Worker(resolveNodeUiWorkerUrl(), { workerData: createWorkerInitData(options), execArgv: resolveNodeUiWorkerExecArgv(), - env: resolveNodeUiWorkerEnv(), }); const workerReady = await waitForWorkerReady(worker, options.loadSignal, options.onBgaLoadProgress, options.onLog); if (!workerReady.enabled) { @@ -326,18 +324,6 @@ function resolveNodeUiWorkerExecArgv(): string[] { return [...process.execArgv, '--conditions=source']; } -function resolveNodeUiWorkerEnv(): NodeJS.ProcessEnv { - if (!import.meta.url.endsWith('.ts')) { - return process.env; - } - - return { - ...process.env, - TSX_TSCONFIG_PATH: - process.env.TSX_TSCONFIG_PATH ?? fileURLToPath(new URL('../../../../tsconfig.typecheck.json', import.meta.url)), - }; -} - async function waitForWorkerReady( worker: Worker, signal: AbortSignal | undefined, diff --git a/packages/player-web-demo/src/main.ts b/packages/player-web-demo/src/main.ts index a5742159..808d9406 100644 --- a/packages/player-web-demo/src/main.ts +++ b/packages/player-web-demo/src/main.ts @@ -419,7 +419,9 @@ class PlayerWebDemoApp { * disarmAutoRecord} so the flag doesn't survive into a future session that shouldn't be auto-captured. */ private autoRecordArmed = false; - public constructor(private readonly elements: PlayerWebDemoElements) { + private readonly elements: PlayerWebDemoElements; + public constructor(elements: PlayerWebDemoElements) { + this.elements = elements; this.guiState = { autoPlay: false, autoPauseOnBlur: false, diff --git a/packages/player-web/package.json b/packages/player-web/package.json index 91c152ad..3c5a721f 100644 --- a/packages/player-web/package.json +++ b/packages/player-web/package.json @@ -49,7 +49,7 @@ "lint:fix": "oxlint . --fix", "format": "oxfmt . --write", "format:check": "oxfmt . --check", - "bench": "tsx --tsconfig ../../tsconfig.typecheck.json scripts/bench.ts" + "bench": "node --conditions=source scripts/bench.ts" }, "dependencies": { "@be-music/audio-renderer": "workspace:*", diff --git a/packages/player-web/src/scene/beatoraja/shared-scene.ts b/packages/player-web/src/scene/beatoraja/shared-scene.ts index 4d2afb98..46b967cd 100644 --- a/packages/player-web/src/scene/beatoraja/shared-scene.ts +++ b/packages/player-web/src/scene/beatoraja/shared-scene.ts @@ -241,11 +241,13 @@ export function isBeatorajaSceneInputReady(startMs: number, inputDelayMs: number export class BeatorajaSceneBgmPlayer { private audioContext: AudioContext | undefined; private bgmSource: AudioBufferSourceNode | undefined; + private readonly logLabel: string; + private readonly isDisposed: () => boolean; - constructor( - private readonly logLabel: string, - private readonly isDisposed: () => boolean, - ) {} + constructor(logLabel: string, isDisposed: () => boolean) { + this.logLabel = logLabel; + this.isDisposed = isDisposed; + } async start(bytes: Uint8Array | undefined): Promise { if (bytes === undefined) return; diff --git a/packages/player-web/src/scene/lr2/decide.ts b/packages/player-web/src/scene/lr2/decide.ts index 8e5483dc..edd06a14 100644 --- a/packages/player-web/src/scene/lr2/decide.ts +++ b/packages/player-web/src/scene/lr2/decide.ts @@ -169,8 +169,11 @@ export class PixiDecideView { private inputUnlockHandle: ReturnType | undefined; private inputUnlocked = false; private readonly timerStartedAt = new Map(); + private readonly options: PixiDecideViewOptions; - public constructor(private readonly options: PixiDecideViewOptions = {}) {} + public constructor(options: PixiDecideViewOptions = {}) { + this.options = options; + } private get app(): Application { if (!this.host) { diff --git a/packages/player-web/src/scene/lr2/gameplay.ts b/packages/player-web/src/scene/lr2/gameplay.ts index ab9be53d..25fbebe0 100644 --- a/packages/player-web/src/scene/lr2/gameplay.ts +++ b/packages/player-web/src/scene/lr2/gameplay.ts @@ -1112,8 +1112,10 @@ export class PixiGameplayView { * `globalThis.__BE_MUSIC_PERF__ = true`). When disabled the wrapper adds no measurable overhead. */ private readonly perf = new PerfTracker('gameplay'); + private readonly options: PixiGameplayViewOptions; - public constructor(private readonly options: PixiGameplayViewOptions = {}) { + public constructor(options: PixiGameplayViewOptions = {}) { + this.options = options; if (options.initialHiSpeed !== undefined && Number.isFinite(options.initialHiSpeed)) { // Snap to the same 1/1000 grid `adjustHiSpeed` uses so a host-supplied `1.5000000000000002` (the obvious // float-drift failure mode of repeated +0.1 steps) lands on the canonical grid value the in-game adjust hotkey diff --git a/packages/player-web/src/scene/lr2/result.ts b/packages/player-web/src/scene/lr2/result.ts index 0ba95353..8c86ca61 100644 --- a/packages/player-web/src/scene/lr2/result.ts +++ b/packages/player-web/src/scene/lr2/result.ts @@ -298,8 +298,11 @@ export class PixiResultView { * interpolator (`elapsedSinceTimer`) and `isDestinationVisible`'s timer-active gating. */ private readonly timerStartedAt = new Map(); + private options: PixiResultViewOptions; - public constructor(private options: PixiResultViewOptions = {}) {} + public constructor(options: PixiResultViewOptions = {}) { + this.options = options; + } private get app(): Application { if (!this.host) { diff --git a/packages/player-web/src/scene/lr2/select.ts b/packages/player-web/src/scene/lr2/select.ts index e5805301..7d9ca205 100644 --- a/packages/player-web/src/scene/lr2/select.ts +++ b/packages/player-web/src/scene/lr2/select.ts @@ -886,8 +886,10 @@ export class PixiSongSelectView { * multiple times before the first decode resolves. */ private readonly oneShotDecoding = new Set(); + private options: PixiSongSelectViewOptions; - public constructor(private options: PixiSongSelectViewOptions = {}) { + public constructor(options: PixiSongSelectViewOptions = {}) { + this.options = options; this.selectBgmBytes = options.selectBgm; this.setOneShotBytes('decide', options.decideBgm); this.setSystemSounds(options.systemSounds); diff --git a/packages/player-web/src/scene/pixi-utils.ts b/packages/player-web/src/scene/pixi-utils.ts index 8997e1f6..3da45294 100644 --- a/packages/player-web/src/scene/pixi-utils.ts +++ b/packages/player-web/src/scene/pixi-utils.ts @@ -76,8 +76,10 @@ export class ChildPool { private idleFramesSprites = 0; private idleFramesGraphics = 0; private idleFramesTexts = 0; + private readonly layer: Container; - public constructor(private readonly layer: Container) { + public constructor(layer: Container) { + this.layer = layer; this.graphicsHost = new Container(); this.spriteHost = new Container(); this.textHost = new Container(); diff --git a/packages/player-web/src/skin/beatoraja/audio.ts b/packages/player-web/src/skin/beatoraja/audio.ts index 41c838b0..b4af29dc 100644 --- a/packages/player-web/src/skin/beatoraja/audio.ts +++ b/packages/player-web/src/skin/beatoraja/audio.ts @@ -77,8 +77,10 @@ export class BeatorajaSkinAudioPlayer { /** Active looped sources, keyed by the resolved bundle path. `audioStop(path)` consults this. */ private readonly loopingSources = new Map>(); private disposed = false; + private readonly options: BeatorajaSkinAudioPlayerOptions; - public constructor(private readonly options: BeatorajaSkinAudioPlayerOptions) { + public constructor(options: BeatorajaSkinAudioPlayerOptions) { + this.options = options; this.ownsContext = options.audioContext === undefined; this.context = options.audioContext; } diff --git a/packages/player/package.json b/packages/player/package.json index aad9cdd6..009f804c 100644 --- a/packages/player/package.json +++ b/packages/player/package.json @@ -120,7 +120,7 @@ "lint:fix": "oxlint . --fix", "format": "oxfmt . --write", "format:check": "oxfmt . --check", - "bench": "tsx --tsconfig ../../tsconfig.typecheck.json scripts/bench.ts" + "bench": "node --conditions=source scripts/bench.ts" }, "dependencies": { "@be-music/audio-renderer": "workspace:*", diff --git a/packages/player/src/playlog/simulate.ts b/packages/player/src/playlog/simulate.ts index fc435a76..3240fe6d 100644 --- a/packages/player/src/playlog/simulate.ts +++ b/packages/player/src/playlog/simulate.ts @@ -143,11 +143,12 @@ class PlaylogSimulation { private slow = 0; private exScore = 0; private lastAdvanceUs = Number.NEGATIVE_INFINITY; + private readonly playlog: BeMusicPlaylog; + private readonly config: RulesetConfig; - constructor( - private readonly playlog: BeMusicPlaylog, - private readonly config: RulesetConfig, - ) { + constructor(playlog: BeMusicPlaylog, config: RulesetConfig) { + this.playlog = playlog; + this.config = config; this.gauge = new RulesetGauge(config.gauge); this.buildLanes(); } diff --git a/packages/player/src/ruleset/gauge.ts b/packages/player/src/ruleset/gauge.ts index c48f9035..535cf87b 100644 --- a/packages/player/src/ruleset/gauge.ts +++ b/packages/player/src/ruleset/gauge.ts @@ -26,8 +26,10 @@ export class RulesetGauge { /** Set once a survival gauge has bottomed out. The run keeps judging; the gauge stays dead. */ failedMidPlay = false; private dead = false; + readonly spec: GaugeSpec; - constructor(readonly spec: GaugeSpec) { + constructor(spec: GaugeSpec) { + this.spec = spec; this.value = spec.initial; } diff --git a/packages/stringifier/package.json b/packages/stringifier/package.json index 93bb9698..827e78b9 100644 --- a/packages/stringifier/package.json +++ b/packages/stringifier/package.json @@ -23,13 +23,13 @@ "build:bundle": "tsdown", "build": "tsdown", "clean": "rimraf dist tsconfig.tsbuildinfo", - "dev": "tsx --tsconfig ../../tsconfig.typecheck.json src/cli.ts", + "dev": "node --conditions=source src/cli.ts", "typecheck": "tsc -p tsconfig.typecheck.json --pretty", "lint": "oxlint .", "lint:fix": "oxlint . --fix", "format": "oxfmt . --write", "format:check": "oxfmt . --check", - "bench": "tsx --tsconfig ../../tsconfig.typecheck.json scripts/bench.ts" + "bench": "node --conditions=source scripts/bench.ts" }, "dependencies": { "@be-music/chart": "workspace:*", diff --git a/packages/utils/package.json b/packages/utils/package.json index 9fd4a2af..82dc7b75 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -60,7 +60,7 @@ "lint:fix": "oxlint . --fix", "format": "oxfmt . --write", "format:check": "oxfmt . --check", - "bench": "tsx --tsconfig ../../tsconfig.typecheck.json scripts/bench.ts" + "bench": "node --conditions=source scripts/bench.ts" }, "dependencies": { "isoworker": "^0.2.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 379132ce..4cc17b1b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,39 @@ importers: .: devDependencies: + '@be-music/audio-renderer': + specifier: workspace:* + version: link:packages/audio-renderer + '@be-music/chart': + specifier: workspace:* + version: link:packages/chart + '@be-music/editor': + specifier: workspace:* + version: link:packages/editor + '@be-music/json': + specifier: workspace:* + version: link:packages/json + '@be-music/lr2-skin': + specifier: workspace:* + version: link:packages/lr2-skin + '@be-music/parser': + specifier: workspace:* + version: link:packages/parser + '@be-music/player': + specifier: workspace:* + version: link:packages/player + '@be-music/player-tui': + specifier: workspace:* + version: link:packages/player-tui + '@be-music/player-web': + specifier: workspace:* + version: link:packages/player-web + '@be-music/stringifier': + specifier: workspace:* + version: link:packages/stringifier + '@be-music/utils': + specifier: workspace:* + version: link:packages/utils '@changesets/cli': specifier: ^3.0.1 version: 3.0.1 @@ -32,9 +65,6 @@ importers: tsdown: specifier: ^0.22.14 version: 0.22.14(tsx@4.23.13)(typescript@7.0.2)(unrun@0.2.37) - tsx: - specifier: ^4.23.13 - version: 4.23.13 typescript: specifier: ^7.0.2 version: 7.0.2 @@ -4829,6 +4859,7 @@ snapshots: '@esbuild/win32-arm64': 0.28.2 '@esbuild/win32-ia32': 0.28.2 '@esbuild/win32-x64': 0.28.2 + optional: true estree-walker@2.0.2: {} @@ -5837,6 +5868,7 @@ snapshots: esbuild: 0.28.2 optionalDependencies: fsevents: 2.3.3 + optional: true tty-browserify@0.0.1: {} diff --git a/scripts/build-sea.ts b/scripts/build-sea.ts index 29e16a0d..6fd34e64 100644 --- a/scripts/build-sea.ts +++ b/scripts/build-sea.ts @@ -132,7 +132,7 @@ const SEA_TARGETS: Record = { function printUsage() { process.stdout.write( [ - 'Usage: tsx scripts/build-sea.ts --package [options]', + 'Usage: node scripts/build-sea.ts --package [options]', '', 'Essential options:', ' -p, --package Target package to build SEA for',