From 584b6c0b07ba2e2e858c80e97c081e323d5ed59c Mon Sep 17 00:00:00 2001 From: Hyperblast Date: Fri, 30 Jan 2026 14:05:02 +0500 Subject: [PATCH 1/9] universal install_plugin.js script --- js/api_tests/src/install_plugin.js | 113 ++++++++++++++++++++++++++++ js/api_tests/src/test_context.js | 10 +-- js/{config.mjs => build_config.mjs} | 20 +++++ js/webui/webpack.config.js | 10 +-- 4 files changed, 137 insertions(+), 16 deletions(-) create mode 100755 js/api_tests/src/install_plugin.js rename js/{config.mjs => build_config.mjs} (71%) diff --git a/js/api_tests/src/install_plugin.js b/js/api_tests/src/install_plugin.js new file mode 100755 index 00000000..56104f24 --- /dev/null +++ b/js/api_tests/src/install_plugin.js @@ -0,0 +1,113 @@ +#!/usr/bin/env node + +import { getBuildConfig, getPluginBuildDir, getWebBuildDir } from '../../build_config.mjs' +import { callBySystem, selectBySystem } from './utils'; + +function getInstallPaths(buildConfig) +{ + const webRoot = 'beefweb.root'; + + return callBySystem({ + windows() + { + const targetDir = path.join( + process.env.APPDATA, + 'foobar2000-v2', + 'user-components-x64', + 'foo_beefweb'); + + const pluginFile = 'foo_beefweb.dll'; + + return [ + [ + path.join(getPluginBuildDir('foobar2000'), pluginFile), + path.join(targetDir, pluginFile), + ], + [ + getWebBuildDir(buildConfig), + path.join(targetDir, webRoot), + ] + ]; + }, + + mac() + { + const fooPluginFile = 'foo_beefweb.component'; + const ddbPluginFile = 'beefweb.dylib'; + + const fooTargetDir = path.join( + process.env.HOME, + 'Library', + 'foobar2000-v2', + 'user-components', + 'foo_beefweb'); + + const ddbTargetDir = path.join( + process.env.HOME, + 'Library', + 'Application Support', + 'Deadbeef', + 'Plugins'); + + return [ + [ + path.join(getPluginBuildDir('foobar2000'), fooPluginFile), + path.join(fooTargetDir, fooPluginFile), + ], + [ + path.join(getPluginBuildDir('deadbeef'), ddbPluginFile), + path.join(ddbTargetDir, pluginFile), + ], + [ + getWebBuildDir(buildConfig), + path.join(ddbTargetDir, webRoot), + ] + ] + }, + + posix() + { + const pluginFile = 'beefweb.so'; + + const targetDir = path.join( + process.env.HOME, + '.local', + 'lib', + 'deadbeef'); + + return [ + [ + path.join(getPluginBuildDir('deadbeef'), pluginFile), + path.join(targetDir, pluginFile), + ], + [ + getWebBuildDir(buildConfig), + path.join(targetDir, webRoot), + ] + ] + } + }); +} + +async function main() +{ + if (process.argv.length < 3) + { + console.error('usage:\n install_app.js install locally built plugin (via symlinks)'); + return 0; + } + + const buildType = process.argv[2]; + + try + { + return 0; + } + catch (e) + { + console.error(e.message); + return 1; + } +} + +main().then(exitCode => process.exit(exitCode)); diff --git a/js/api_tests/src/test_context.js b/js/api_tests/src/test_context.js index 876d4dc4..d62e55e3 100644 --- a/js/api_tests/src/test_context.js +++ b/js/api_tests/src/test_context.js @@ -1,6 +1,6 @@ import path from 'path' import fsObj from 'fs'; -import { getBuildConfig } from '../../config.mjs'; +import { getBuildConfig, getPluginBuildDir } from '../../build_config.mjs'; import RequestHandler from './request_handler.js'; import TestPlayerClient from './test_player_client.js'; import { testsRootDir } from './utils.js'; @@ -151,13 +151,7 @@ export class TestContextFactory { const buildType = process.env.BEEFWEB_TEST_BUILD_TYPE || 'Debug'; const port = parseInt(process.env.BEEFWEB_TEST_PORT) || 8879; - const { buildDir, isMultiConfig } = getBuildConfig(buildType); - const pluginBuildDir = path.join( - buildDir, - 'cpp', - 'server', - this.playerId, - isMultiConfig ? buildType : ''); + const pluginBuildDir = getPluginBuildDir(getBuildConfig(buildType), this.playerId);; const serverUrl = `http://127.0.0.1:${port}`; const webRootDir = path.join(testsRootDir, 'webroot'); diff --git a/js/config.mjs b/js/build_config.mjs similarity index 71% rename from js/config.mjs rename to js/build_config.mjs index 337e8ff1..3db40f34 100644 --- a/js/config.mjs +++ b/js/build_config.mjs @@ -36,10 +36,30 @@ function readBuildConfig(buildDir) } } +export function getPluginBuildDir(buildConfig, player) +{ + return path.join( + buildConfig.buildDir, + 'cpp', + 'server', + player, + buildConfig.isMultiConfig ? buildConfig.buildType : ''); +} + +export function getWebBuildDir(buildConfig) +{ + return path.join( + buildConfig.buildDir, + 'js', + 'webui', + buildConfig.isMultiConfig ? buildConfig.buildType : 'output'); +} + export function getBuildConfig(buildType) { const buildDir = getBuildDir(buildType); const buildConfig = readBuildConfig(buildDir); + buildConfig.buildType = buildType; buildConfig.buildDir = buildDir; return buildConfig; } diff --git a/js/webui/webpack.config.js b/js/webui/webpack.config.js index e1cc2b23..1a02b522 100644 --- a/js/webui/webpack.config.js +++ b/js/webui/webpack.config.js @@ -5,7 +5,7 @@ import MiniCssExtractPlugin from 'mini-css-extract-plugin' import CssMinimizerPlugin from 'css-minimizer-webpack-plugin' import TerserPlugin from 'terser-webpack-plugin' import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer' -import { getBuildConfig } from '../config.mjs'; +import { getBuildConfig, getWebBuildDir } from '../build_config.mjs'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -124,12 +124,6 @@ function configRelease(config) }); } -function getDefaultOutputDir(buildType) -{ - const { buildDir, isMultiConfig } = getBuildConfig(buildType); - return path.join(buildDir, 'js', 'webui', isMultiConfig ? buildType : 'output'); -} - function getBuildType(env) { const matchedTypes = []; @@ -169,7 +163,7 @@ function makeBuildParams(env) const buildType = getBuildType(env); if (!outputDir) - outputDir = getDefaultOutputDir(buildType); + outputDir = getWebBuildDir(getBuildConfig(buildType)); const sourceDir = path.join(__dirname, 'src'); From c4206dfbe65b388cd1ffb3bb0f654a760f9bd144 Mon Sep 17 00:00:00 2001 From: Hyperblast Date: Fri, 30 Jan 2026 20:08:09 +0500 Subject: [PATCH 2/9] implement install_plugin.js --- cpp/server/CMakeLists.txt | 12 ---- js/api_tests/src/install_plugin.js | 108 ++++++++++++++++++----------- js/api_tests/src/test_context.js | 2 +- js/build_config.mjs | 25 ++++--- js/webui/webpack.config.js | 4 +- 5 files changed, 87 insertions(+), 64 deletions(-) diff --git a/cpp/server/CMakeLists.txt b/cpp/server/CMakeLists.txt index 76aa80f3..63d0ad99 100644 --- a/cpp/server/CMakeLists.txt +++ b/cpp/server/CMakeLists.txt @@ -209,16 +209,4 @@ if(ENABLE_FOOBAR2000) add_subdirectory(foobar2000) endif() -if(ENABLE_TESTS) - add_subdirectory(tests) - - if(IS_MULTI_CONFIG) - set(CONFIG_JSON ${CMAKE_CURRENT_BINARY_DIR}/$/config.json) - else() - set(CONFIG_JSON ${CMAKE_CURRENT_BINARY_DIR}/config.json) - endif() - - file(GENERATE OUTPUT ${CONFIG_JSON} CONTENT "{\"webRoot\":\"${WEBUI_OUTPUT_DIR}\"}") -endif() - print_toolchain_flags() diff --git a/js/api_tests/src/install_plugin.js b/js/api_tests/src/install_plugin.js index 56104f24..7b56146a 100755 --- a/js/api_tests/src/install_plugin.js +++ b/js/api_tests/src/install_plugin.js @@ -1,16 +1,19 @@ #!/usr/bin/env node -import { getBuildConfig, getPluginBuildDir, getWebBuildDir } from '../../build_config.mjs' -import { callBySystem, selectBySystem } from './utils'; +import mkdirp from 'mkdirp'; +import fs from 'fs/promises'; +import path from 'path'; +import { getBuildConfig } from '../../build_config.mjs' +import { callBySystem, tryStat, rimraf } from './utils.js'; -function getInstallPaths(buildConfig) +function getSymlinks(buildConfig) { const webRoot = 'beefweb.root'; return callBySystem({ windows() { - const targetDir = path.join( + const installDir = path.join( process.env.APPDATA, 'foobar2000-v2', 'user-components-x64', @@ -19,14 +22,14 @@ function getInstallPaths(buildConfig) const pluginFile = 'foo_beefweb.dll'; return [ - [ - path.join(getPluginBuildDir('foobar2000'), pluginFile), - path.join(targetDir, pluginFile), - ], - [ - getWebBuildDir(buildConfig), - path.join(targetDir, webRoot), - ] + { + from: path.join(installDir, pluginFile), + to: path.join(buildConfig.pluginBuildDir.foobar2000, pluginFile), + }, + { + from: path.join(installDir, webRoot), + to: buildConfig.webBuildDir, + } ]; }, @@ -35,14 +38,14 @@ function getInstallPaths(buildConfig) const fooPluginFile = 'foo_beefweb.component'; const ddbPluginFile = 'beefweb.dylib'; - const fooTargetDir = path.join( + const fooInstallDir = path.join( process.env.HOME, 'Library', 'foobar2000-v2', 'user-components', 'foo_beefweb'); - const ddbTargetDir = path.join( + const ddbInstallDir = path.join( process.env.HOME, 'Library', 'Application Support', @@ -50,57 +53,82 @@ function getInstallPaths(buildConfig) 'Plugins'); return [ - [ - path.join(getPluginBuildDir('foobar2000'), fooPluginFile), - path.join(fooTargetDir, fooPluginFile), - ], - [ - path.join(getPluginBuildDir('deadbeef'), ddbPluginFile), - path.join(ddbTargetDir, pluginFile), - ], - [ - getWebBuildDir(buildConfig), - path.join(ddbTargetDir, webRoot), - ] - ] + { + from: path.join(fooInstallDir, fooPluginFile), + to: path.join(buildConfig.pluginBuildDir.foobar2000, fooPluginFile), + }, + { + from: path.join(buildConfig.pluginBuildDir.foobar2000, fooPluginFile, 'Contents', 'Resources', webRoot), + to: buildConfig.webBuildDir, + }, + { + from: path.join(ddbInstallDir, ddbPluginFile), + to: path.join(buildConfig.pluginBuildDir.deadbeef, ddbPluginFile), + }, + { + from: path.join(ddbInstallDir, webRoot), + to: buildConfig.webBuildDir, + } + ]; }, posix() { const pluginFile = 'beefweb.so'; - const targetDir = path.join( + const installDir = path.join( process.env.HOME, '.local', 'lib', 'deadbeef'); return [ - [ - path.join(getPluginBuildDir('deadbeef'), pluginFile), - path.join(targetDir, pluginFile), - ], - [ - getWebBuildDir(buildConfig), - path.join(targetDir, webRoot), - ] - ] + { + from: path.join(installDir, pluginFile), + to: path.join(buildConfig.pluginBuildDir.deadbeef, pluginFile), + }, + { + from: path.join(installDir, webRoot), + to: buildConfig.webBuildDir, + } + ]; } }); } +async function run(buildType) +{ + const buildConfig = getBuildConfig(buildType); + + for (let link of getSymlinks(buildConfig)) + { + const { from, to } = link; + + if (await tryStat(from)) + { + console.error(`removing ${from}`); + await rimraf(from); + } + + console.error(`adding link ${from} -> ${to}`); + mkdirp(path.dirname(from)); + await fs.symlink(to, from); + } +} + async function main() { if (process.argv.length < 3) { - console.error('usage:\n install_app.js install locally built plugin (via symlinks)'); + console.error('usage:'); + console.error(' install_app.js install locally built plugin (via symlinks)'); + console.error('warning: removes existing installed plugin'); return 0; } - const buildType = process.argv[2]; - try { + await run(process.argv[2]); return 0; } catch (e) diff --git a/js/api_tests/src/test_context.js b/js/api_tests/src/test_context.js index d62e55e3..b93e4c10 100644 --- a/js/api_tests/src/test_context.js +++ b/js/api_tests/src/test_context.js @@ -151,7 +151,7 @@ export class TestContextFactory { const buildType = process.env.BEEFWEB_TEST_BUILD_TYPE || 'Debug'; const port = parseInt(process.env.BEEFWEB_TEST_PORT) || 8879; - const pluginBuildDir = getPluginBuildDir(getBuildConfig(buildType), this.playerId);; + const pluginBuildDir = getBuildConfig(buildType).pluginBuildDir[this.playerId]; const serverUrl = `http://127.0.0.1:${port}`; const webRootDir = path.join(testsRootDir, 'webroot'); diff --git a/js/build_config.mjs b/js/build_config.mjs index 3db40f34..802dee4f 100644 --- a/js/build_config.mjs +++ b/js/build_config.mjs @@ -36,30 +36,37 @@ function readBuildConfig(buildDir) } } -export function getPluginBuildDir(buildConfig, player) +function getWebBuildDir(buildConfig) { return path.join( buildConfig.buildDir, - 'cpp', - 'server', - player, - buildConfig.isMultiConfig ? buildConfig.buildType : ''); + 'js', + 'webui', + buildConfig.isMultiConfig ? buildType : 'output') } -export function getWebBuildDir(buildConfig) +function getPluginBuildDir(buildConfig, player) { return path.join( buildConfig.buildDir, - 'js', - 'webui', - buildConfig.isMultiConfig ? buildConfig.buildType : 'output'); + 'cpp', + 'server', + player, + buildConfig.isMultiConfig ? buildConfig.buildType : ''); } export function getBuildConfig(buildType) { const buildDir = getBuildDir(buildType); const buildConfig = readBuildConfig(buildDir); + buildConfig.buildType = buildType; buildConfig.buildDir = buildDir; + buildConfig.webBuildDir = getWebBuildDir(buildConfig); + buildConfig.pluginBuildDir = { + deadbeef: getPluginBuildDir(buildConfig, 'deadbeef'), + foobar2000: getPluginBuildDir(buildConfig, 'foobar2000'), + }; + return buildConfig; } diff --git a/js/webui/webpack.config.js b/js/webui/webpack.config.js index 1a02b522..be091ce3 100644 --- a/js/webui/webpack.config.js +++ b/js/webui/webpack.config.js @@ -5,7 +5,7 @@ import MiniCssExtractPlugin from 'mini-css-extract-plugin' import CssMinimizerPlugin from 'css-minimizer-webpack-plugin' import TerserPlugin from 'terser-webpack-plugin' import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer' -import { getBuildConfig, getWebBuildDir } from '../build_config.mjs'; +import { getBuildConfig } from '../build_config.mjs'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -163,7 +163,7 @@ function makeBuildParams(env) const buildType = getBuildType(env); if (!outputDir) - outputDir = getWebBuildDir(getBuildConfig(buildType)); + outputDir = getBuildConfig(buildType).webBuildDir; const sourceDir = path.join(__dirname, 'src'); From 7914415f1f8f9d1f8f083d62538656e13cbcfd23 Mon Sep 17 00:00:00 2001 From: Hyperblast Date: Fri, 30 Jan 2026 20:13:07 +0500 Subject: [PATCH 3/9] remove old scripts, minor fix --- js/api_tests/src/install_plugin.js | 2 +- scripts/dev_install.cmd | 37 ------------------ scripts/dev_install.sh | 61 ------------------------------ 3 files changed, 1 insertion(+), 99 deletions(-) delete mode 100644 scripts/dev_install.cmd delete mode 100755 scripts/dev_install.sh diff --git a/js/api_tests/src/install_plugin.js b/js/api_tests/src/install_plugin.js index 7b56146a..b810918e 100755 --- a/js/api_tests/src/install_plugin.js +++ b/js/api_tests/src/install_plugin.js @@ -111,7 +111,7 @@ async function run(buildType) } console.error(`adding link ${from} -> ${to}`); - mkdirp(path.dirname(from)); + await mkdirp(path.dirname(from)); await fs.symlink(to, from); } } diff --git a/scripts/dev_install.cmd b/scripts/dev_install.cmd deleted file mode 100644 index 0e503b2d..00000000 --- a/scripts/dev_install.cmd +++ /dev/null @@ -1,37 +0,0 @@ -@setlocal - -@if [%1] == [] goto :usage -@if [%1] == [-?] goto :usage -@if [%1] == [--help] goto :usage - -set BUILD_TYPE=%1 -set PROFILE_DIR=%APPDATA%\foobar2000-v2 -set COMPONENT_DIR=%PROFILE_DIR%\user-components-x64\foo_beefweb -set CONFIG_DIR=%PROFILE_DIR%\beefweb - -mkdir "%COMPONENT_DIR%" -mkdir "%CONFIG_DIR%" - -cd "%~dp0..\build\%BUILD_TYPE%\cpp\server" - -@if errorlevel 1 ( - @echo Build directory does not exist, aborting - @goto :end -) - -copy /Y foobar2000\%BUILD_TYPE%\*.* "%COMPONENT_DIR%" -copy /Y %BUILD_TYPE%\config.json "%CONFIG_DIR%" - -@goto :end - -:usage -@echo Copy binaries and config file from current build directory to foobar2000 profile -@echo. -@echo Usage: -@echo %~nx0 ^ -@echo. -@echo Build types: -@echo Debug, Release, MinSizeRel, RelWithDebInfo -@echo. - -:end diff --git a/scripts/dev_install.sh b/scripts/dev_install.sh deleted file mode 100755 index f43ef08a..00000000 --- a/scripts/dev_install.sh +++ /dev/null @@ -1,61 +0,0 @@ -#!/bin/bash - -set -e - -cd "$(dirname $0)/.." - -plugin_file=beefweb.so -webui_root=beefweb.root - -function relink -{ - if [ -L "$1" ]; then - echo "removing existing link '$1'" - rm "$1" - elif [ -e "$1" ]; then - echo "target '$1' exists and is not a symbolic link, aborting" - exit 1 - fi - - echo "setting up link '$1' -> '$2'" - ln -s "$2" "$1" -} - -function install -{ - plugin_dir="$HOME/.local/lib/deadbeef" - server_build_dir="$(pwd)/build/$1/cpp/server/deadbeef" - webui_build_dir="$(pwd)/build/$1/js/webui/output" - - if [ ! -e "$plugin_dir" ]; then - mkdir -p "$plugin_dir" - fi - - relink "$plugin_dir/$plugin_file" "$server_build_dir/$plugin_file" - relink "$plugin_dir/$webui_root" "$webui_build_dir" -} - -usage="Add symlinks from ~/.local/lib/deadbeef to binaries in current build directory - -Usage: - $(basename $0) - -Build types: - Debug, Release, MinSizeRel, RelWithDebInfo -" - -case "$1" in - Debug|Release|MinSizeRel|RelWithDebInfo) - install "$1" - ;; - - - ""|-?|--help) - echo "$usage" - ;; - - *) - echo "invalid build type: $1, try --help" - exit 1 - ;; -esac From f300302a3efc6618a597fdaf838d7c891aa20af2 Mon Sep 17 00:00:00 2001 From: Hyperblast Date: Fri, 30 Jan 2026 20:22:08 +0500 Subject: [PATCH 4/9] add some debug --- cpp/server/settings.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cpp/server/settings.cpp b/cpp/server/settings.cpp index 29adb35e..93f74bef 100644 --- a/cpp/server/settings.cpp +++ b/cpp/server/settings.cpp @@ -127,6 +127,8 @@ bool SettingsData::isAllowedPath(const Path& path) const void SettingsData::initialize(const Path& resourceDir, const Path& profileDir) { + logDebug("init settings: resourceDir: %s, profileDir% s", resourceDir.c_str(), profileDir.c_str()); + assert(!resourceDir.empty()); assert(!profileDir.empty()); From 7ea421ccaf28a40a11b4b0e4352fea1211e69061 Mon Sep 17 00:00:00 2001 From: Hyperblast Date: Fri, 30 Jan 2026 20:24:40 +0500 Subject: [PATCH 5/9] minor fix 2 --- cpp/server/settings.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/server/settings.cpp b/cpp/server/settings.cpp index 93f74bef..a102d52d 100644 --- a/cpp/server/settings.cpp +++ b/cpp/server/settings.cpp @@ -127,7 +127,7 @@ bool SettingsData::isAllowedPath(const Path& path) const void SettingsData::initialize(const Path& resourceDir, const Path& profileDir) { - logDebug("init settings: resourceDir: %s, profileDir% s", resourceDir.c_str(), profileDir.c_str()); + logDebug("init settings: resourceDir = %s, profileDir = %s", resourceDir.c_str(), profileDir.c_str()); assert(!resourceDir.empty()); assert(!profileDir.empty()); From 9aafcf55bfae2ec44c82ef6208118cfc3b99959c Mon Sep 17 00:00:00 2001 From: Hyperblast Date: Fri, 30 Jan 2026 20:27:46 +0500 Subject: [PATCH 6/9] minor fix 3 --- js/api_tests/src/install_plugin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/api_tests/src/install_plugin.js b/js/api_tests/src/install_plugin.js index b810918e..ce1be37c 100755 --- a/js/api_tests/src/install_plugin.js +++ b/js/api_tests/src/install_plugin.js @@ -66,7 +66,7 @@ function getSymlinks(buildConfig) to: path.join(buildConfig.pluginBuildDir.deadbeef, ddbPluginFile), }, { - from: path.join(ddbInstallDir, webRoot), + from: path.join(buildConfig.pluginBuildDir.deadbeef, webRoot), to: buildConfig.webBuildDir, } ]; From 39ed25070797fb2d7805c03bc2f9527851662482 Mon Sep 17 00:00:00 2001 From: Hyperblast Date: Fri, 30 Jan 2026 20:34:51 +0500 Subject: [PATCH 7/9] fixes --- js/api_tests/src/install_plugin.js | 2 +- js/build_config.mjs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/api_tests/src/install_plugin.js b/js/api_tests/src/install_plugin.js index ce1be37c..7e22f04c 100755 --- a/js/api_tests/src/install_plugin.js +++ b/js/api_tests/src/install_plugin.js @@ -133,7 +133,7 @@ async function main() } catch (e) { - console.error(e.message); + console.error(e); return 1; } } diff --git a/js/build_config.mjs b/js/build_config.mjs index 802dee4f..ca92aa7c 100644 --- a/js/build_config.mjs +++ b/js/build_config.mjs @@ -42,7 +42,7 @@ function getWebBuildDir(buildConfig) buildConfig.buildDir, 'js', 'webui', - buildConfig.isMultiConfig ? buildType : 'output') + buildConfig.isMultiConfig ? buildConfig.buildType : 'output') } function getPluginBuildDir(buildConfig, player) From a1b72d69810399f2b05afce6d2a313efc05c7da5 Mon Sep 17 00:00:00 2001 From: Hyperblast Date: Fri, 30 Jan 2026 21:03:05 +0500 Subject: [PATCH 8/9] fixes & improvements --- cpp/server/CMakeLists.txt | 4 ++++ js/api_tests/src/install_plugin.js | 21 +++++++++++++++------ js/build_config.mjs | 20 ++++++++++++++++---- js/webui/webpack.config.js | 13 +++---------- 4 files changed, 38 insertions(+), 20 deletions(-) diff --git a/cpp/server/CMakeLists.txt b/cpp/server/CMakeLists.txt index 63d0ad99..ea1e78b4 100644 --- a/cpp/server/CMakeLists.txt +++ b/cpp/server/CMakeLists.txt @@ -209,4 +209,8 @@ if(ENABLE_FOOBAR2000) add_subdirectory(foobar2000) endif() +if(ENABLE_TESTS) + add_subdirectory(tests) +endif() + print_toolchain_flags() diff --git a/js/api_tests/src/install_plugin.js b/js/api_tests/src/install_plugin.js index 7e22f04c..7347c5ce 100755 --- a/js/api_tests/src/install_plugin.js +++ b/js/api_tests/src/install_plugin.js @@ -3,7 +3,7 @@ import mkdirp from 'mkdirp'; import fs from 'fs/promises'; import path from 'path'; -import { getBuildConfig } from '../../build_config.mjs' +import { buildTypes, getBuildConfig, getBuildType } from '../../build_config.mjs' import { callBySystem, tryStat, rimraf } from './utils.js'; function getSymlinks(buildConfig) @@ -96,8 +96,12 @@ function getSymlinks(buildConfig) }); } -async function run(buildType) +async function run(buildTypeRaw) { + const buildType = getBuildType(buildTypeRaw); + if (!buildType) + throw new Error(`Invalid build type: ${buildTypeRaw}`); + const buildConfig = getBuildConfig(buildType); for (let link of getSymlinks(buildConfig)) @@ -118,12 +122,17 @@ async function run(buildType) async function main() { - if (process.argv.length < 3) + if (process.argv.length !== 3) { - console.error('usage:'); + console.error('Usage:'); console.error(' install_app.js install locally built plugin (via symlinks)'); - console.error('warning: removes existing installed plugin'); - return 0; + console.error(); + console.error('Build types:'); + console.error(' ' + Object.values(buildTypes).join(' ')); + console.error(); + console.error('Warning:'); + console.error(' Existing installed plugin will be removed without backup'); + return process.argv.length > 3 ? 1 : 0; } try diff --git a/js/build_config.mjs b/js/build_config.mjs index ca92aa7c..1fe03c93 100644 --- a/js/build_config.mjs +++ b/js/build_config.mjs @@ -6,6 +6,13 @@ import os from 'os'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); +export const buildTypes = Object.freeze({ + debug: 'Debug', + release: 'Release', + minsizerel: 'MinSizeRel', + relwithdebinfo: 'RelWithDebInfo' +}); + function toAbsolutePath(p) { return path.isAbsolute(p) ? p : path.join(path.dirname(__dirname), p); @@ -55,6 +62,11 @@ function getPluginBuildDir(buildConfig, player) buildConfig.isMultiConfig ? buildConfig.buildType : ''); } +export function getBuildType(value) +{ + return buildTypes[value.toLowerCase()]; +} + export function getBuildConfig(buildType) { const buildDir = getBuildDir(buildType); @@ -63,10 +75,10 @@ export function getBuildConfig(buildType) buildConfig.buildType = buildType; buildConfig.buildDir = buildDir; buildConfig.webBuildDir = getWebBuildDir(buildConfig); - buildConfig.pluginBuildDir = { - deadbeef: getPluginBuildDir(buildConfig, 'deadbeef'), - foobar2000: getPluginBuildDir(buildConfig, 'foobar2000'), - }; + buildConfig.pluginBuildDir = {}; + + for (let player of ['deadbeef', 'foobar2000']) + buildConfig.pluginBuildDir[player] = getPluginBuildDir(buildConfig, player); return buildConfig; } diff --git a/js/webui/webpack.config.js b/js/webui/webpack.config.js index be091ce3..060c8984 100644 --- a/js/webui/webpack.config.js +++ b/js/webui/webpack.config.js @@ -5,18 +5,11 @@ import MiniCssExtractPlugin from 'mini-css-extract-plugin' import CssMinimizerPlugin from 'css-minimizer-webpack-plugin' import TerserPlugin from 'terser-webpack-plugin' import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer' -import { getBuildConfig } from '../build_config.mjs'; +import { buildTypes, getBuildConfig } from '../build_config.mjs'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); -const buildTypes = { - debug: 'Debug', - release: 'Release', - minsizerel: 'MinSizeRel', - relwithdebinfo: 'RelWithDebInfo' -}; - function configCommon(config, params) { // Common configuration @@ -132,7 +125,7 @@ function getBuildType(env) { // --env {type} - const buildType = buildTypes[key.toLowerCase()]; + const buildType = getBuildType(key); if (buildType) matchedTypes.push(buildType); } @@ -141,7 +134,7 @@ function getBuildType(env) { // --env buildType={type} - const buildType = buildTypes[env.buildType.toLowerCase()]; + const buildType = getBuildType(env.buildType); if (buildType) matchedTypes.push(buildType) else From 87226c8a3484142846899a2d5a0d0b6f5b9154da Mon Sep 17 00:00:00 2001 From: Hyperblast Date: Fri, 30 Jan 2026 21:07:36 +0500 Subject: [PATCH 9/9] more fixes --- js/webui/webpack.config.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/js/webui/webpack.config.js b/js/webui/webpack.config.js index 060c8984..1c6471d5 100644 --- a/js/webui/webpack.config.js +++ b/js/webui/webpack.config.js @@ -5,7 +5,7 @@ import MiniCssExtractPlugin from 'mini-css-extract-plugin' import CssMinimizerPlugin from 'css-minimizer-webpack-plugin' import TerserPlugin from 'terser-webpack-plugin' import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer' -import { buildTypes, getBuildConfig } from '../build_config.mjs'; +import { buildTypes, getBuildConfig, getBuildType as resolveBuildType } from '../build_config.mjs'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -125,7 +125,7 @@ function getBuildType(env) { // --env {type} - const buildType = getBuildType(key); + const buildType = resolveBuildType(key); if (buildType) matchedTypes.push(buildType); } @@ -134,7 +134,7 @@ function getBuildType(env) { // --env buildType={type} - const buildType = getBuildType(env.buildType); + const buildType = resolveBuildType(env.buildType); if (buildType) matchedTypes.push(buildType) else