diff --git a/.github/workflows/browserlist-update.yml b/.github/workflows/browserlist-update.yml index 0f0a0ccb..0d21b2d9 100644 --- a/.github/workflows/browserlist-update.yml +++ b/.github/workflows/browserlist-update.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v6 + uses: actions/checkout@v7 with: fetch-depth: 0 - name: Configure git diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6e0c3450..8d9f19fc 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -43,12 +43,12 @@ jobs: version_next: ${{ steps.versions.outputs.version_next }} should_release: ${{ steps.versions.outputs.should_release }} steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 with: fetch-depth: 0 - name: Set up Homebrew id: set-up-homebrew - uses: Homebrew/actions/setup-homebrew@master + uses: Homebrew/actions/setup-homebrew@main - name: Install svu run: brew install --cask caarlos0/tap/svu - name: Compute next version for release @@ -72,7 +72,7 @@ jobs: sudo rm -rf /usr/share/dotnet sudo rm -rf "$AGENT_TOOLSDIRECTORY" - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 with: fetch-depth: 0 @@ -117,7 +117,7 @@ jobs: password: ${{ secrets.GITHUB_TOKEN }} - name: Setup Gradle - uses: gradle/actions/setup-gradle@v5 + uses: gradle/actions/setup-gradle@v6 - name: Build run: ./gradlew :komga:prepareThymeLeaf :komga:bootJar :komga-tray:jar diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 681818ab..440d9a0e 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -19,7 +19,7 @@ jobs: fail-fast: false name: Test server - ${{ matrix.os }} steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - name: Setup Java 21 uses: actions/setup-java@v5 with: @@ -28,7 +28,7 @@ jobs: distribution: 'temurin' - name: Setup Gradle - uses: gradle/actions/setup-gradle@v5 + uses: gradle/actions/setup-gradle@v6 - name: Build run: ./gradlew build :komga-tray:jar @@ -78,7 +78,7 @@ jobs: runs-on: ubuntu-latest name: Test webui builds steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - uses: actions/setup-node@v6 with: node-version-file: '.nvmrc' diff --git a/CHANGELOG.md b/CHANGELOG.md index 11276310..e67c53ed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,94 @@ +# [1.25.0](https://github.com/gotson/komga/compare/1.24.4...1.25.0) (2026-06-30) +## 🚀 Features +**komga** +- add support for solid rar4 archives ([5682a37](https://github.com/gotson/komga/commits/5682a37)) + +## 🐛 Fixes +**kobo** +- enfore content restriction ([bd8b773](https://github.com/gotson/komga/commits/bd8b773)) + +**openapi** +- flatten hierchical schemas ([275cb92](https://github.com/gotson/komga/commits/275cb92)) + +## 🛠 Build +**openapi** +- increase timeout for openapi generation ([4efb161](https://github.com/gotson/komga/commits/4efb161)) + +**webui** +- update Browserslist db ([9a3bbdd](https://github.com/gotson/komga/commits/9a3bbdd)) +- update Browserslist db ([ba6cb76](https://github.com/gotson/komga/commits/ba6cb76)) + +## ⚙️ Dependencies +**ci** +- bump actions/checkout from 6 to 7 ([5da5226](https://github.com/gotson/komga/commits/5da5226)) + +**komga** +- bump junrar to 7.6.0 ([ba628f9](https://github.com/gotson/komga/commits/ba628f9)) + +**webui** +- bump launch-editor from 2.6.0 to 2.14.1 in /komga-webui ([910512c](https://github.com/gotson/komga/commits/910512c)) +- bump axios from 1.15.2 to 1.16.0 in /komga-webui ([86362b1](https://github.com/gotson/komga/commits/86362b1)) +- bump qs from 6.14.2 to 6.15.2 in /komga-webui ([f9f402e](https://github.com/gotson/komga/commits/f9f402e)) +- bump js-cookie from 3.0.5 to 3.0.7 in /komga-webui ([3e9a0ea](https://github.com/gotson/komga/commits/3e9a0ea)) +- bump fast-uri from 3.1.0 to 3.1.2 in /komga-webui ([be5f88c](https://github.com/gotson/komga/commits/be5f88c)) +- bump @babel/plugin-transform-modules-systemjs ([0bd8edb](https://github.com/gotson/komga/commits/0bd8edb)) +- bump axios from 1.15.0 to 1.15.2 in /komga-webui ([737cc56](https://github.com/gotson/komga/commits/737cc56)) + +**unscoped** +- upgrade Spring Boot to 3.5.14 ([3d7615e](https://github.com/gotson/komga/commits/3d7615e)) + +# [1.24.4](https://github.com/gotson/komga/compare/1.24.3...1.24.4) (2026-04-24) +## 🐛 Fixes +**api** +- omit UserDto.ageRestriction instead of returning null ([e3a8cc6](https://github.com/gotson/komga/commits/e3a8cc6)) + +**epub** +- some TOC may not be parsed correctly ([5fc0b7e](https://github.com/gotson/komga/commits/5fc0b7e)) + +**kobo** +- proxy raw request body to kobo store ([4a7d9a6](https://github.com/gotson/komga/commits/4a7d9a6)), closes [#2289](https://github.com/gotson/komga/issues/2289) + +**koreader** +- also accept application/json on Accept header ([ddfe65d](https://github.com/gotson/komga/commits/ddfe65d)) + +**opds2** +- incorrect latest series navigation links ([717ef82](https://github.com/gotson/komga/commits/717ef82)), closes [#2285](https://github.com/gotson/komga/issues/2285) +- auth logo issue when using base url ([7c00661](https://github.com/gotson/komga/commits/7c00661)), closes [#2285](https://github.com/gotson/komga/issues/2285) + +## 🛠 Build +**docker** +- update base image to Ubuntu 26.04 for amd64 and arm64 ([5d14057](https://github.com/gotson/komga/commits/5d14057)) + +**webui** +- update Browserslist db ([7e0d680](https://github.com/gotson/komga/commits/7e0d680)) + +**unscoped** +- update homebrew action ([6c2621b](https://github.com/gotson/komga/commits/6c2621b)) + +## ⚙️ Dependencies +**ci** +- bump gradle/actions from 5 to 6 ([3ca9806](https://github.com/gotson/komga/commits/3ca9806)) + +**webui** +- bump @xmldom/xmldom from 0.8.12 to 0.8.13 in /komga-webui ([bb60a79](https://github.com/gotson/komga/commits/bb60a79)) +- bump axios from 1.13.5 to 1.15.0 in /komga-webui ([85edd8b](https://github.com/gotson/komga/commits/85edd8b)) +- bump follow-redirects in /komga-webui ([63de6aa](https://github.com/gotson/komga/commits/63de6aa)) +- bump lodash from 4.17.23 to 4.18.1 in /komga-webui ([b77554f](https://github.com/gotson/komga/commits/b77554f)) +- bump @xmldom/xmldom from 0.8.10 to 0.8.12 in /komga-webui ([5620e3f](https://github.com/gotson/komga/commits/5620e3f)) +- bump brace-expansion from 1.1.12 to 1.1.13 in /komga-webui ([263d3dd](https://github.com/gotson/komga/commits/263d3dd)) + +**unscoped** +- bump gradle-git-properties plugin from 2.5.2 to 2.5.7 ([dd9c3fa](https://github.com/gotson/komga/commits/dd9c3fa)) + +# [1.24.3](https://github.com/gotson/komga/compare/1.24.2...1.24.3) (2026-03-27) +## 🐛 Fixes +**webui** +- epub reader would not load ([b8ea79e](https://github.com/gotson/komga/commits/b8ea79e)) + +## ⚙️ Dependencies +**webui** +- bump node-forge from 1.3.2 to 1.4.0 in /komga-webui ([40dadcb](https://github.com/gotson/komga/commits/40dadcb)) + # [1.24.2](https://github.com/gotson/komga/compare/1.24.1...1.24.2) (2026-03-26) ## 🐛 Fixes **docker** diff --git a/gradle.properties b/gradle.properties index 72a12a51..ddadf38f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,2 +1,2 @@ -version=1.24.2 +version=1.25.0 org.gradle.jvmargs=-Xmx2G diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 6bd5699c..0cf30d32 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,9 +2,9 @@ sqliteJdbc = "3.50.2.0" nightmonkeys = "1.0.0" twelvemonkeys = "3.12.0" -springboot = "3.5.4" +springboot = "3.5.14" lucene = "9.9.1" # v10 requires JDK 21 -jooq = "3.19.24" # should be aligned with the version provided by Spring Boot +jooq = "3.19.32" # should be aligned with the version provided by Spring Boot [plugins] -gradleGitProperties = {id = "com.gorylenko.gradle-git-properties", version = "2.5.2"} +gradleGitProperties = {id = "com.gorylenko.gradle-git-properties", version = "2.5.7"} diff --git a/komga-webui/package-lock.json b/komga-webui/package-lock.json index 134dea34..7504b6f1 100644 --- a/komga-webui/package-lock.json +++ b/komga-webui/package-lock.json @@ -10,16 +10,16 @@ "dependencies": { "@d-i-t-a/reader": "github:gotson/R2D2BC#fork", "@w0s/isbn-verify": "^3.1.2", - "axios": "^1.13.5", + "axios": "^1.16.0", "chart.js": "^2.9.4", "core-js": "^3.8.3", "date-fns": "^2.30.0", "filesize": "^10.0.12", "js-file-downloader": "^1.1.25", "language-tags": "^1.0.9", - "lodash": "^4.17.23", + "lodash": "^4.18.1", "marked": "^15.0.4", - "qs": "^6.14.2", + "qs": "^6.15.2", "screenfull": "^5.2.0", "vue": "^2.6.14", "vue-chartkick": "^0.6.1", @@ -112,14 +112,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", - "license": "MIT", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", + "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" @@ -163,14 +162,15 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", "dependencies": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" @@ -289,13 +289,10 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dependencies": { - "@babel/types": "^7.22.5" - }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", "engines": { "node": ">=6.9.0" } @@ -312,26 +309,25 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", "dependencies": { - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz", - "integrity": "sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.15" + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -352,9 +348,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", "engines": { "node": ">=6.9.0" } @@ -396,6 +392,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, "dependencies": { "@babel/types": "^7.22.5" }, @@ -426,19 +423,17 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", - "license": "MIT", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", - "license": "MIT", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "engines": { "node": ">=6.9.0" } @@ -493,12 +488,11 @@ } }, "node_modules/@babel/parser": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", - "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", - "license": "MIT", + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", + "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", "dependencies": { - "@babel/types": "^7.27.0" + "@babel/types": "^7.29.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -1252,15 +1246,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz", - "integrity": "sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA==", + "version": "7.29.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.4.tgz", + "integrity": "sha512-N7QmZ0xRZfjHOfZeQLJjwgX2zS9pdGHSVl/cjSGlo4dXMqvurfxXDMKY4RqEKzPozV78VMcd0lxyG13mlbKc4w==", "dev": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.9", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5" + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.29.0" }, "engines": { "node": ">=6.9.0" @@ -1797,47 +1791,42 @@ } }, "node_modules/@babel/template": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", - "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", - "license": "MIT", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/parser": "^7.27.0", - "@babel/types": "^7.27.0" + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", - "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", - "license": "MIT", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -2730,16 +2719,12 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, "node_modules/@jridgewell/resolve-uri": { @@ -2750,14 +2735,6 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/source-map": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", @@ -2769,14 +2746,14 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -4660,9 +4637,9 @@ } }, "node_modules/@xmldom/xmldom": { - "version": "0.8.10", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", - "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", + "version": "0.8.13", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.13.tgz", + "integrity": "sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==", "engines": { "node": ">=10.0.0" } @@ -5216,13 +5193,13 @@ "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" }, "node_modules/axios": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz", - "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.0.tgz", + "integrity": "sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==", "dependencies": { - "follow-redirects": "^1.15.11", + "follow-redirects": "^1.16.0", "form-data": "^4.0.5", - "proxy-from-env": "^1.1.0" + "proxy-from-env": "^2.1.0" } }, "node_modules/babel-jest": { @@ -5488,9 +5465,9 @@ ] }, "node_modules/baseline-browser-mapping": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", - "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==", + "version": "2.10.40", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.40.tgz", + "integrity": "sha512-BSSLZ9/Cjjv7Gtj5B68ZzXcXUg8iOf3fme+FCuh8rC/Go+Kmh8cox7M3A8dolou16s64QjLPOSdngh7GxXvkSw==", "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.cjs" @@ -5632,9 +5609,9 @@ "integrity": "sha512-rJKn5ooC9u8q13IMCrW0RSp31pxBCHE3y9V/tp3TdWSLf8Em3p6Di4NBpfzbJge9YjjFEsD0RtFEjtvHL5VyEA==" }, "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5900,9 +5877,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001775", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001775.tgz", - "integrity": "sha512-s3Qv7Lht9zbVKE9XoTyRG6wVDCKdtOFIjBGg3+Yhn6JaytuNKPIjBMTMIY1AnOH3seL5mvF+x33oGAyK3hVt3A==", + "version": "1.0.30001800", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001800.tgz", + "integrity": "sha512-MMHtuAz9Ys840zAY5F4k6fV5GaivZ9sPk+nz0mY+GYVzRBnYkN0mpqkSR92oWRQ19yQWo4HvBV/FnC16AJX8MA==", "funding": [ { "type": "opencollective", @@ -7511,9 +7488,9 @@ } }, "node_modules/editorconfig/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", "dev": true, "dependencies": { "balanced-match": "^1.0.0" @@ -8927,9 +8904,9 @@ "dev": true }, "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", "dev": true, "funding": [ { @@ -9077,9 +9054,9 @@ } }, "node_modules/filehound/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", "dependencies": { "balanced-match": "^1.0.0" } @@ -9213,9 +9190,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", "funding": [ { "type": "individual", @@ -9704,6 +9681,7 @@ "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, "engines": { "node": ">=4" } @@ -13137,9 +13115,9 @@ } }, "node_modules/js-beautify/node_modules/brace-expansion": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", - "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, "dependencies": { "balanced-match": "^4.0.2" @@ -13194,12 +13172,12 @@ } }, "node_modules/js-cookie": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", - "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.7.tgz", + "integrity": "sha512-z/wZZgDrkNV1eA0ULjM/F9/50Ya8fbzgKneSpoPsXSGd0KnpdtHfOZWK+GcwLk+EZbS4F9RBhU+K2RgzuDaItw==", "dev": true, "engines": { - "node": ">=14" + "node": ">=20" } }, "node_modules/js-file-downloader": { @@ -13314,14 +13292,14 @@ "dev": true }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-buffer": { @@ -13455,13 +13433,13 @@ } }, "node_modules/launch-editor": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", - "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.14.1.tgz", + "integrity": "sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA==", "dev": true, "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.7.3" + "picocolors": "^1.1.1", + "shell-quote": "^1.8.4" } }, "node_modules/launch-editor-middleware": { @@ -13562,9 +13540,9 @@ } }, "node_modules/lodash": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==" + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==" }, "node_modules/lodash.clonedeep": { "version": "4.5.0", @@ -14357,9 +14335,9 @@ } }, "node_modules/node-forge": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.2.tgz", - "integrity": "sha512-6xKiQ+cph9KImrRh0VsjH2d8/GXA4FIMlgU4B757iI1ApvcyA9VlouP0yZJha01V+huImO+kKMU7ih+2+E14fw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.4.0.tgz", + "integrity": "sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==", "dev": true, "engines": { "node": ">= 6.13.0" @@ -15907,9 +15885,12 @@ } }, "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "engines": { + "node": ">=10" + } }, "node_modules/pseudomap": { "version": "1.0.2", @@ -15941,9 +15922,9 @@ } }, "node_modules/qs": { - "version": "6.14.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", - "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", + "version": "6.15.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", + "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", "dependencies": { "side-channel": "^1.1.0" }, @@ -17187,10 +17168,13 @@ } }, "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.4.tgz", + "integrity": "sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -20390,13 +20374,13 @@ } }, "@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "requires": { - "@babel/helper-validator-identifier": "^7.25.9", + "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "picocolors": "^1.1.1" } }, "@babel/compat-data": { @@ -20427,14 +20411,15 @@ } }, "@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", "requires": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" } }, "@babel/helper-annotate-as-pure": { @@ -20520,13 +20505,10 @@ "@babel/types": "^7.23.0" } }, - "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "requires": { - "@babel/types": "^7.22.5" - } + "@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==" }, "@babel/helper-member-expression-to-functions": { "version": "7.22.15", @@ -20537,23 +20519,22 @@ } }, "@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", "requires": { - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" } }, "@babel/helper-module-transforms": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz", - "integrity": "sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", "requires": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.15" + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" } }, "@babel/helper-optimise-call-expression": { @@ -20565,9 +20546,9 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==" + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==" }, "@babel/helper-remap-async-to-generator": { "version": "7.22.17", @@ -20594,6 +20575,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, "requires": { "@babel/types": "^7.22.5" } @@ -20615,14 +20597,14 @@ } }, "@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==" + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==" }, "@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==" + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==" }, "@babel/helper-validator-option": { "version": "7.22.15", @@ -20661,11 +20643,11 @@ } }, "@babel/parser": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", - "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", + "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", "requires": { - "@babel/types": "^7.27.0" + "@babel/types": "^7.29.0" } }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { @@ -21152,15 +21134,15 @@ } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz", - "integrity": "sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA==", + "version": "7.29.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.4.tgz", + "integrity": "sha512-N7QmZ0xRZfjHOfZeQLJjwgX2zS9pdGHSVl/cjSGlo4dXMqvurfxXDMKY4RqEKzPozV78VMcd0lxyG13mlbKc4w==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.9", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5" + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.29.0" } }, "@babel/plugin-transform-modules-umd": { @@ -21528,39 +21510,36 @@ } }, "@babel/template": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", - "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "requires": { - "@babel/code-frame": "^7.26.2", - "@babel/parser": "^7.27.0", - "@babel/types": "^7.27.0" + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" } }, "@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" } }, "@babel/types": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", - "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "requires": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" } }, "@bcoe/v8-coverage": { @@ -22225,13 +22204,12 @@ } }, "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, "@jridgewell/resolve-uri": { @@ -22239,11 +22217,6 @@ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==" }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" - }, "@jridgewell/source-map": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", @@ -22255,14 +22228,14 @@ } }, "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==" }, "@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "requires": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -23764,9 +23737,9 @@ } }, "@xmldom/xmldom": { - "version": "0.8.10", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", - "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==" + "version": "0.8.13", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.13.tgz", + "integrity": "sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==" }, "@xtuc/ieee754": { "version": "1.2.0", @@ -24148,13 +24121,13 @@ "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" }, "axios": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz", - "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.0.tgz", + "integrity": "sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==", "requires": { - "follow-redirects": "^1.15.11", + "follow-redirects": "^1.16.0", "form-data": "^4.0.5", - "proxy-from-env": "^1.1.0" + "proxy-from-env": "^2.1.0" } }, "babel-jest": { @@ -24349,9 +24322,9 @@ "dev": true }, "baseline-browser-mapping": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", - "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==" + "version": "2.10.40", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.40.tgz", + "integrity": "sha512-BSSLZ9/Cjjv7Gtj5B68ZzXcXUg8iOf3fme+FCuh8rC/Go+Kmh8cox7M3A8dolou16s64QjLPOSdngh7GxXvkSw==" }, "batch": { "version": "0.6.1", @@ -24472,9 +24445,9 @@ "integrity": "sha512-rJKn5ooC9u8q13IMCrW0RSp31pxBCHE3y9V/tp3TdWSLf8Em3p6Di4NBpfzbJge9YjjFEsD0RtFEjtvHL5VyEA==" }, "brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -24654,9 +24627,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001775", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001775.tgz", - "integrity": "sha512-s3Qv7Lht9zbVKE9XoTyRG6wVDCKdtOFIjBGg3+Yhn6JaytuNKPIjBMTMIY1AnOH3seL5mvF+x33oGAyK3hVt3A==" + "version": "1.0.30001800", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001800.tgz", + "integrity": "sha512-MMHtuAz9Ys840zAY5F4k6fV5GaivZ9sPk+nz0mY+GYVzRBnYkN0mpqkSR92oWRQ19yQWo4HvBV/FnC16AJX8MA==" }, "case-sensitive-paths-webpack-plugin": { "version": "2.4.0", @@ -25868,9 +25841,9 @@ }, "dependencies": { "brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", "dev": true, "requires": { "balanced-match": "^1.0.0" @@ -26939,9 +26912,9 @@ "dev": true }, "fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", "dev": true }, "fastq": { @@ -27052,9 +27025,9 @@ }, "dependencies": { "brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", "requires": { "balanced-match": "^1.0.0" } @@ -27165,9 +27138,9 @@ "dev": true }, "follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==" + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==" }, "for-each": { "version": "0.3.3", @@ -27498,7 +27471,8 @@ "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true }, "globalthis": { "version": "1.0.3", @@ -29979,9 +29953,9 @@ "dev": true }, "brace-expansion": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", - "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, "requires": { "balanced-match": "^4.0.2" @@ -30019,9 +29993,9 @@ } }, "js-cookie": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", - "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.7.tgz", + "integrity": "sha512-z/wZZgDrkNV1eA0ULjM/F9/50Ya8fbzgKneSpoPsXSGd0KnpdtHfOZWK+GcwLk+EZbS4F9RBhU+K2RgzuDaItw==", "dev": true }, "js-file-downloader": { @@ -30115,9 +30089,9 @@ } }, "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==" }, "json-buffer": { "version": "3.0.1", @@ -30227,13 +30201,13 @@ } }, "launch-editor": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", - "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.14.1.tgz", + "integrity": "sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA==", "dev": true, "requires": { - "picocolors": "^1.0.0", - "shell-quote": "^1.7.3" + "picocolors": "^1.1.1", + "shell-quote": "^1.8.4" } }, "launch-editor-middleware": { @@ -30311,9 +30285,9 @@ } }, "lodash": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==" + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==" }, "lodash.clonedeep": { "version": "4.5.0", @@ -30930,9 +30904,9 @@ } }, "node-forge": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.2.tgz", - "integrity": "sha512-6xKiQ+cph9KImrRh0VsjH2d8/GXA4FIMlgU4B757iI1ApvcyA9VlouP0yZJha01V+huImO+kKMU7ih+2+E14fw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.4.0.tgz", + "integrity": "sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==", "dev": true }, "node-int64": { @@ -32013,9 +31987,9 @@ } }, "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==" }, "pseudomap": { "version": "1.0.2", @@ -32044,9 +32018,9 @@ "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" }, "qs": { - "version": "6.14.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", - "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", + "version": "6.15.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", + "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", "requires": { "side-channel": "^1.1.0" } @@ -32960,9 +32934,9 @@ "dev": true }, "shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.4.tgz", + "integrity": "sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ==", "dev": true }, "shelljs": { diff --git a/komga-webui/package.json b/komga-webui/package.json index 870ccaef..f963b3ee 100644 --- a/komga-webui/package.json +++ b/komga-webui/package.json @@ -11,16 +11,16 @@ "dependencies": { "@d-i-t-a/reader": "github:gotson/R2D2BC#fork", "@w0s/isbn-verify": "^3.1.2", - "axios": "^1.13.5", + "axios": "^1.16.0", "chart.js": "^2.9.4", "core-js": "^3.8.3", "date-fns": "^2.30.0", "filesize": "^10.0.12", "js-file-downloader": "^1.1.25", "language-tags": "^1.0.9", - "lodash": "^4.17.23", + "lodash": "^4.18.1", "marked": "^15.0.4", - "qs": "^6.14.2", + "qs": "^6.15.2", "screenfull": "^5.2.0", "vue": "^2.6.14", "vue-chartkick": "^0.6.1", diff --git a/komga-webui/src/views/EpubReader.vue b/komga-webui/src/views/EpubReader.vue index 334f3351..c866b9cc 100644 --- a/komga-webui/src/views/EpubReader.vue +++ b/komga-webui/src/views/EpubReader.vue @@ -751,7 +751,7 @@ export default Vue.extend({ const fontFamiliesInjectables = this.fontFamiliesAdditional.map(x => ({ type: 'style', - url: new URL(`${urls.origin}api/v1/fonts/resource/${x}/css`, import.meta.url).toString(), + url: new URL(`${urls.origin}api/v1/fonts/resource/${x}/css`).toString(), fontFamily: x, })) diff --git a/komga/build.gradle.kts b/komga/build.gradle.kts index c5e15cdf..497c9efe 100644 --- a/komga/build.gradle.kts +++ b/komga/build.gradle.kts @@ -78,7 +78,7 @@ dependencies { implementation("org.apache.tika:tika-core:2.9.1") implementation("org.apache.commons:commons-compress:1.27.1") - implementation("com.github.junrar:junrar:7.5.5") + implementation("com.github.junrar:junrar:7.6.0") implementation("com.github.gotson.nightcompress:nightcompress:1.1.1") implementation("org.apache.pdfbox:pdfbox:3.0.5") implementation("net.grey-panther:natural-comparator:1.1") @@ -394,6 +394,7 @@ openApi { args.add("--spring.profiles.active=claim,generate-openapi") args.add("--server.port=8080") } + waitTimeInSeconds.set(60) } tasks.jacocoTestReport { diff --git a/komga/docker/Dockerfile.tpl b/komga/docker/Dockerfile.tpl index 6d1f5fc2..8a785e97 100644 --- a/komga/docker/Dockerfile.tpl +++ b/komga/docker/Dockerfile.tpl @@ -5,12 +5,11 @@ COPY assembly/${JAR} application.jar RUN java -Djarmode=tools -jar application.jar extract --layers --destination extracted # amd64 builder -FROM ubuntu:24.10 AS build-amd64 +FROM ubuntu:26.04 AS build-amd64 ENV JAVA_HOME=/opt/java/openjdk COPY --from=eclipse-temurin:23-jre $JAVA_HOME $JAVA_HOME ENV PATH="${JAVA_HOME}/bin:${PATH}" -RUN sed -i -re 's/([a-z]{2}\.)?archive.ubuntu.com|security.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list.d/ubuntu.sources && \ - apt -y update && \ +RUN apt -y update && \ apt -y install ca-certificates locales libjxl-dev libheif-dev libwebp-dev libarchive-dev wget curl && \ echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen && \ locale-gen en_US.UTF-8 && \ @@ -20,12 +19,11 @@ RUN sed -i -re 's/([a-z]{2}\.)?archive.ubuntu.com|security.ubuntu.com/old-releas ENV LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/usr/lib/x86_64-linux-gnu" # arm64 builder -FROM ubuntu:24.10 AS build-arm64 +FROM ubuntu:26.04 AS build-arm64 ENV JAVA_HOME=/opt/java/openjdk COPY --from=eclipse-temurin:23-jre $JAVA_HOME $JAVA_HOME ENV PATH="${JAVA_HOME}/bin:${PATH}" -RUN sed -i -re 's/([a-z]{2}\.)?ports.ubuntu.com\/ubuntu-ports/old-releases.ubuntu.com\/ubuntu/g' /etc/apt/sources.list.d/ubuntu.sources && \ - apt -y update && \ +RUN apt -y update && \ apt -y install ca-certificates locales libjxl-dev libheif-dev libwebp-dev libarchive-dev wget curl && \ echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen && \ locale-gen en_US.UTF-8 && \ diff --git a/komga/docs/openapi.json b/komga/docs/openapi.json index dfd17abf..01e5454a 100644 --- a/komga/docs/openapi.json +++ b/komga/docs/openapi.json @@ -7,7 +7,7 @@ "url": "https://github.com/gotson/komga/blob/master/LICENSE" }, "title": "Komga API", - "version": "1.24.2" + "version": "1.25.0" }, "externalDocs": { "description": "Komga documentation", @@ -8770,62 +8770,6 @@ }, "components": { "schemas": { - "After": { - "allOf": [ - { - "$ref": "#/components/schemas/Date" - }, - { - "type": "object", - "properties": { - "dateTime": { - "type": "string", - "format": "date-time" - } - } - } - ], - "required": [ - "dateTime" - ] - }, - "AgeRating": { - "allOf": [ - { - "$ref": "#/components/schemas/Series" - }, - { - "type": "object", - "properties": { - "ageRating": { - "oneOf": [ - { - "$ref": "#/components/schemas/GreaterThan" - }, - { - "$ref": "#/components/schemas/Is" - }, - { - "$ref": "#/components/schemas/IsNot" - }, - { - "$ref": "#/components/schemas/IsNotNullT" - }, - { - "$ref": "#/components/schemas/IsNullT" - }, - { - "$ref": "#/components/schemas/LessThan" - } - ] - } - } - } - ], - "required": [ - "ageRating" - ] - }, "AgeRestrictionDto": { "type": "object", "properties": { @@ -8867,155 +8811,6 @@ "restriction" ] }, - "AllOfBook": { - "allOf": [ - { - "$ref": "#/components/schemas/Book" - }, - { - "type": "object", - "properties": { - "allOf": { - "type": "array", - "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/AllOfBook" - }, - { - "$ref": "#/components/schemas/AnyOfBook" - }, - { - "$ref": "#/components/schemas/Author" - }, - { - "$ref": "#/components/schemas/Deleted" - }, - { - "$ref": "#/components/schemas/LibraryId" - }, - { - "$ref": "#/components/schemas/MediaProfile" - }, - { - "$ref": "#/components/schemas/MediaStatus" - }, - { - "$ref": "#/components/schemas/NumberSort" - }, - { - "$ref": "#/components/schemas/OneShot" - }, - { - "$ref": "#/components/schemas/Poster" - }, - { - "$ref": "#/components/schemas/ReadListId" - }, - { - "$ref": "#/components/schemas/ReadStatus" - }, - { - "$ref": "#/components/schemas/ReleaseDate" - }, - { - "$ref": "#/components/schemas/SeriesId" - }, - { - "$ref": "#/components/schemas/Tag" - }, - { - "$ref": "#/components/schemas/Title" - } - ] - } - } - } - } - ], - "required": [ - "allOf" - ] - }, - "AllOfSeries": { - "allOf": [ - { - "$ref": "#/components/schemas/Series" - }, - { - "type": "object", - "properties": { - "allOf": { - "type": "array", - "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/AgeRating" - }, - { - "$ref": "#/components/schemas/AllOfSeries" - }, - { - "$ref": "#/components/schemas/AnyOfSeries" - }, - { - "$ref": "#/components/schemas/Author" - }, - { - "$ref": "#/components/schemas/CollectionId" - }, - { - "$ref": "#/components/schemas/Complete" - }, - { - "$ref": "#/components/schemas/Deleted" - }, - { - "$ref": "#/components/schemas/Genre" - }, - { - "$ref": "#/components/schemas/Language" - }, - { - "$ref": "#/components/schemas/LibraryId" - }, - { - "$ref": "#/components/schemas/OneShot" - }, - { - "$ref": "#/components/schemas/Publisher" - }, - { - "$ref": "#/components/schemas/ReadStatus" - }, - { - "$ref": "#/components/schemas/ReleaseDate" - }, - { - "$ref": "#/components/schemas/SeriesStatus" - }, - { - "$ref": "#/components/schemas/SharingLabel" - }, - { - "$ref": "#/components/schemas/Tag" - }, - { - "$ref": "#/components/schemas/Title" - }, - { - "$ref": "#/components/schemas/TitleSort" - } - ] - } - } - } - } - ], - "required": [ - "allOf" - ] - }, "AlternateTitleDto": { "type": "object", "properties": { @@ -9048,155 +8843,6 @@ "title" ] }, - "AnyOfBook": { - "allOf": [ - { - "$ref": "#/components/schemas/Book" - }, - { - "type": "object", - "properties": { - "anyOf": { - "type": "array", - "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/AllOfBook" - }, - { - "$ref": "#/components/schemas/AnyOfBook" - }, - { - "$ref": "#/components/schemas/Author" - }, - { - "$ref": "#/components/schemas/Deleted" - }, - { - "$ref": "#/components/schemas/LibraryId" - }, - { - "$ref": "#/components/schemas/MediaProfile" - }, - { - "$ref": "#/components/schemas/MediaStatus" - }, - { - "$ref": "#/components/schemas/NumberSort" - }, - { - "$ref": "#/components/schemas/OneShot" - }, - { - "$ref": "#/components/schemas/Poster" - }, - { - "$ref": "#/components/schemas/ReadListId" - }, - { - "$ref": "#/components/schemas/ReadStatus" - }, - { - "$ref": "#/components/schemas/ReleaseDate" - }, - { - "$ref": "#/components/schemas/SeriesId" - }, - { - "$ref": "#/components/schemas/Tag" - }, - { - "$ref": "#/components/schemas/Title" - } - ] - } - } - } - } - ], - "required": [ - "anyOf" - ] - }, - "AnyOfSeries": { - "allOf": [ - { - "$ref": "#/components/schemas/Series" - }, - { - "type": "object", - "properties": { - "anyOf": { - "type": "array", - "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/AgeRating" - }, - { - "$ref": "#/components/schemas/AllOfSeries" - }, - { - "$ref": "#/components/schemas/AnyOfSeries" - }, - { - "$ref": "#/components/schemas/Author" - }, - { - "$ref": "#/components/schemas/CollectionId" - }, - { - "$ref": "#/components/schemas/Complete" - }, - { - "$ref": "#/components/schemas/Deleted" - }, - { - "$ref": "#/components/schemas/Genre" - }, - { - "$ref": "#/components/schemas/Language" - }, - { - "$ref": "#/components/schemas/LibraryId" - }, - { - "$ref": "#/components/schemas/OneShot" - }, - { - "$ref": "#/components/schemas/Publisher" - }, - { - "$ref": "#/components/schemas/ReadStatus" - }, - { - "$ref": "#/components/schemas/ReleaseDate" - }, - { - "$ref": "#/components/schemas/SeriesStatus" - }, - { - "$ref": "#/components/schemas/SharingLabel" - }, - { - "$ref": "#/components/schemas/Tag" - }, - { - "$ref": "#/components/schemas/Title" - }, - { - "$ref": "#/components/schemas/TitleSort" - } - ] - } - } - } - } - ], - "required": [ - "anyOf" - ] - }, "ApiKeyDto": { "type": "object", "properties": { @@ -9282,34 +8928,6 @@ "success" ] }, - "Author": { - "allOf": [ - { - "$ref": "#/components/schemas/Series" - }, - { - "type": "object", - "properties": { - "author": { - "oneOf": [ - { - "$ref": "#/components/schemas/Is" - }, - { - "$ref": "#/components/schemas/IsNot" - } - ] - } - } - }, - { - "$ref": "#/components/schemas/Book" - } - ], - "required": [ - "author" - ] - }, "AuthorDto": { "type": "object", "properties": { @@ -9342,44 +8960,6 @@ "role" ] }, - "Before": { - "allOf": [ - { - "$ref": "#/components/schemas/Date" - }, - { - "type": "object", - "properties": { - "dateTime": { - "type": "string", - "format": "date-time" - } - } - } - ], - "required": [ - "dateTime" - ] - }, - "BeginsWith": { - "allOf": [ - { - "$ref": "#/components/schemas/StringOp" - }, - { - "type": "object", - "properties": { - "value": { - "type": "string" - } - } - } - ], - "required": [ - "value" - ] - }, - "Book": {}, "BookDto": { "type": "object", "properties": { @@ -9727,75 +9307,13 @@ "type": "object", "properties": { "condition": { - "oneOf": [ - { - "$ref": "#/components/schemas/AllOfBook" - }, - { - "$ref": "#/components/schemas/AnyOfBook" - }, - { - "$ref": "#/components/schemas/Author" - }, - { - "$ref": "#/components/schemas/Deleted" - }, - { - "$ref": "#/components/schemas/LibraryId" - }, - { - "$ref": "#/components/schemas/MediaProfile" - }, - { - "$ref": "#/components/schemas/MediaStatus" - }, - { - "$ref": "#/components/schemas/NumberSort" - }, - { - "$ref": "#/components/schemas/OneShot" - }, - { - "$ref": "#/components/schemas/Poster" - }, - { - "$ref": "#/components/schemas/ReadListId" - }, - { - "$ref": "#/components/schemas/ReadStatus" - }, - { - "$ref": "#/components/schemas/ReleaseDate" - }, - { - "$ref": "#/components/schemas/SeriesId" - }, - { - "$ref": "#/components/schemas/Tag" - }, - { - "$ref": "#/components/schemas/Title" - } - ] + "$ref": "#/components/schemas/SearchConditionBook" }, "fullTextSearch": { "type": "string" } } }, - "Boolean": { - "discriminator": { - "propertyName": "operator" - }, - "properties": { - "operator": { - "type": "string" - } - }, - "required": [ - "operator" - ] - }, "ClaimStatus": { "type": "object", "properties": { @@ -9913,31 +9431,6 @@ "seriesIds" ] }, - "CollectionId": { - "allOf": [ - { - "$ref": "#/components/schemas/Series" - }, - { - "type": "object", - "properties": { - "collectionId": { - "oneOf": [ - { - "$ref": "#/components/schemas/Is" - }, - { - "$ref": "#/components/schemas/IsNot" - } - ] - } - } - } - ], - "required": [ - "collectionId" - ] - }, "CollectionUpdateDto": { "type": "object", "properties": { @@ -9955,90 +9448,6 @@ } } }, - "Complete": { - "allOf": [ - { - "$ref": "#/components/schemas/Series" - }, - { - "type": "object", - "properties": { - "complete": { - "oneOf": [ - { - "$ref": "#/components/schemas/IsFalse" - }, - { - "$ref": "#/components/schemas/IsTrue" - } - ] - } - } - } - ], - "required": [ - "complete" - ] - }, - "Contains": { - "allOf": [ - { - "$ref": "#/components/schemas/StringOp" - }, - { - "type": "object", - "properties": { - "value": { - "type": "string" - } - } - } - ], - "required": [ - "value" - ] - }, - "Date": { - "discriminator": { - "propertyName": "operator" - }, - "properties": { - "operator": { - "type": "string" - } - }, - "required": [ - "operator" - ] - }, - "Deleted": { - "allOf": [ - { - "$ref": "#/components/schemas/Series" - }, - { - "type": "object", - "properties": { - "deleted": { - "oneOf": [ - { - "$ref": "#/components/schemas/IsFalse" - }, - { - "$ref": "#/components/schemas/IsTrue" - } - ] - } - } - }, - { - "$ref": "#/components/schemas/Book" - } - ], - "required": [ - "deleted" - ] - }, "DirectoryListingDto": { "type": "object", "properties": { @@ -10078,219 +9487,6 @@ "showFiles" ] }, - "DoesNotBeginWith": { - "allOf": [ - { - "$ref": "#/components/schemas/StringOp" - }, - { - "type": "object", - "properties": { - "value": { - "type": "string" - } - } - } - ], - "required": [ - "value" - ] - }, - "DoesNotContain": { - "allOf": [ - { - "$ref": "#/components/schemas/StringOp" - }, - { - "type": "object", - "properties": { - "value": { - "type": "string" - } - } - } - ], - "required": [ - "value" - ] - }, - "DoesNotEndWith": { - "allOf": [ - { - "$ref": "#/components/schemas/StringOp" - }, - { - "type": "object", - "properties": { - "value": { - "type": "string" - } - } - } - ], - "required": [ - "value" - ] - }, - "EndsWith": { - "allOf": [ - { - "$ref": "#/components/schemas/StringOp" - }, - { - "type": "object", - "properties": { - "value": { - "type": "string" - } - } - } - ], - "required": [ - "value" - ] - }, - "EqualityAuthorMatch": { - "discriminator": { - "propertyName": "operator" - }, - "properties": { - "operator": { - "type": "string" - } - }, - "required": [ - "operator" - ] - }, - "EqualityMediaProfile": { - "discriminator": { - "propertyName": "operator" - }, - "properties": { - "operator": { - "type": "string" - } - }, - "required": [ - "operator" - ] - }, - "EqualityNullableString": { - "discriminator": { - "propertyName": "operator" - }, - "properties": { - "operator": { - "type": "string" - } - }, - "required": [ - "operator" - ] - }, - "EqualityPosterMatch": { - "discriminator": { - "propertyName": "operator" - }, - "properties": { - "operator": { - "type": "string" - } - }, - "required": [ - "operator" - ] - }, - "EqualityReadStatus": { - "discriminator": { - "propertyName": "operator" - }, - "properties": { - "operator": { - "type": "string" - } - }, - "required": [ - "operator" - ] - }, - "EqualityStatus": { - "discriminator": { - "propertyName": "operator" - }, - "properties": { - "operator": { - "type": "string" - } - }, - "required": [ - "operator" - ] - }, - "EqualityString": { - "discriminator": { - "propertyName": "operator" - }, - "properties": { - "operator": { - "type": "string" - } - }, - "required": [ - "operator" - ] - }, - "Genre": { - "allOf": [ - { - "$ref": "#/components/schemas/Series" - }, - { - "type": "object", - "properties": { - "genre": { - "oneOf": [ - { - "$ref": "#/components/schemas/Is" - }, - { - "$ref": "#/components/schemas/IsNot" - }, - { - "$ref": "#/components/schemas/IsNotNullT" - }, - { - "$ref": "#/components/schemas/IsNullT" - } - ] - } - } - } - ], - "required": [ - "genre" - ] - }, - "GreaterThan": { - "allOf": [ - { - "$ref": "#/components/schemas/NumericNullableInteger" - }, - { - "type": "object", - "properties": { - "value": {} - } - }, - { - "$ref": "#/components/schemas/NumericFloat" - } - ], - "required": [ - "value" - ] - }, "GroupCountDto": { "type": "object", "properties": { @@ -10340,176 +9536,6 @@ "type" ] }, - "Is": { - "allOf": [ - { - "$ref": "#/components/schemas/NumericNullableInteger" - }, - { - "type": "object", - "properties": { - "value": {} - } - }, - { - "$ref": "#/components/schemas/EqualityAuthorMatch" - }, - { - "$ref": "#/components/schemas/EqualityString" - }, - { - "$ref": "#/components/schemas/EqualityNullableString" - }, - { - "$ref": "#/components/schemas/EqualityReadStatus" - }, - { - "$ref": "#/components/schemas/EqualityStatus" - }, - { - "$ref": "#/components/schemas/StringOp" - }, - { - "$ref": "#/components/schemas/EqualityMediaProfile" - }, - { - "$ref": "#/components/schemas/NumericFloat" - }, - { - "$ref": "#/components/schemas/EqualityPosterMatch" - } - ], - "required": [ - "value" - ] - }, - "IsFalse": { - "allOf": [ - { - "$ref": "#/components/schemas/Boolean" - } - ] - }, - "IsInTheLast": { - "allOf": [ - { - "$ref": "#/components/schemas/Date" - }, - { - "type": "object", - "properties": { - "duration": { - "type": "string" - } - } - } - ], - "required": [ - "duration" - ] - }, - "IsNot": { - "allOf": [ - { - "$ref": "#/components/schemas/NumericNullableInteger" - }, - { - "type": "object", - "properties": { - "value": {} - } - }, - { - "$ref": "#/components/schemas/EqualityAuthorMatch" - }, - { - "$ref": "#/components/schemas/EqualityString" - }, - { - "$ref": "#/components/schemas/EqualityNullableString" - }, - { - "$ref": "#/components/schemas/EqualityReadStatus" - }, - { - "$ref": "#/components/schemas/EqualityStatus" - }, - { - "$ref": "#/components/schemas/StringOp" - }, - { - "$ref": "#/components/schemas/EqualityMediaProfile" - }, - { - "$ref": "#/components/schemas/NumericFloat" - }, - { - "$ref": "#/components/schemas/EqualityPosterMatch" - } - ], - "required": [ - "value" - ] - }, - "IsNotInTheLast": { - "allOf": [ - { - "$ref": "#/components/schemas/Date" - }, - { - "type": "object", - "properties": { - "duration": { - "type": "string" - } - } - } - ], - "required": [ - "duration" - ] - }, - "IsNotNull": { - "allOf": [ - { - "$ref": "#/components/schemas/Date" - } - ] - }, - "IsNotNullT": { - "allOf": [ - { - "$ref": "#/components/schemas/NumericNullableInteger" - }, - { - "$ref": "#/components/schemas/EqualityNullableString" - } - ] - }, - "IsNull": { - "allOf": [ - { - "$ref": "#/components/schemas/Date" - } - ] - }, - "IsNullT": { - "allOf": [ - { - "$ref": "#/components/schemas/NumericNullableInteger" - }, - { - "$ref": "#/components/schemas/EqualityNullableString" - } - ] - }, - "IsTrue": { - "allOf": [ - { - "$ref": "#/components/schemas/Boolean" - } - ] - }, "ItemDto": { "type": "object", "properties": { @@ -10590,50 +9616,6 @@ "read" ] }, - "Language": { - "allOf": [ - { - "$ref": "#/components/schemas/Series" - }, - { - "type": "object", - "properties": { - "language": { - "oneOf": [ - { - "$ref": "#/components/schemas/Is" - }, - { - "$ref": "#/components/schemas/IsNot" - } - ] - } - } - } - ], - "required": [ - "language" - ] - }, - "LessThan": { - "allOf": [ - { - "$ref": "#/components/schemas/NumericNullableInteger" - }, - { - "type": "object", - "properties": { - "value": {} - } - }, - { - "$ref": "#/components/schemas/NumericFloat" - } - ], - "required": [ - "value" - ] - }, "LibraryCreationDto": { "type": "object", "properties": { @@ -10916,34 +9898,6 @@ "unavailable" ] }, - "LibraryId": { - "allOf": [ - { - "$ref": "#/components/schemas/Series" - }, - { - "type": "object", - "properties": { - "libraryId": { - "oneOf": [ - { - "$ref": "#/components/schemas/Is" - }, - { - "$ref": "#/components/schemas/IsNot" - } - ] - } - } - }, - { - "$ref": "#/components/schemas/Book" - } - ], - "required": [ - "libraryId" - ] - }, "LibraryUpdateDto": { "type": "object", "description": "Fields to update. You can omit fields you don\u0027t want to update.", @@ -11114,56 +10068,6 @@ "status" ] }, - "MediaProfile": { - "allOf": [ - { - "$ref": "#/components/schemas/Book" - }, - { - "type": "object", - "properties": { - "mediaProfile": { - "oneOf": [ - { - "$ref": "#/components/schemas/Is" - }, - { - "$ref": "#/components/schemas/IsNot" - } - ] - } - } - } - ], - "required": [ - "mediaProfile" - ] - }, - "MediaStatus": { - "allOf": [ - { - "$ref": "#/components/schemas/Book" - }, - { - "type": "object", - "properties": { - "mediaStatus": { - "oneOf": [ - { - "$ref": "#/components/schemas/Is" - }, - { - "$ref": "#/components/schemas/IsNot" - } - ] - } - } - } - ], - "required": [ - "mediaStatus" - ] - }, "MediaType": { "type": "object", "properties": { @@ -11200,63 +10104,6 @@ } } }, - "NumberSort": { - "allOf": [ - { - "$ref": "#/components/schemas/Book" - }, - { - "type": "object", - "properties": { - "numberSort": { - "oneOf": [ - { - "$ref": "#/components/schemas/GreaterThan" - }, - { - "$ref": "#/components/schemas/Is" - }, - { - "$ref": "#/components/schemas/IsNot" - }, - { - "$ref": "#/components/schemas/LessThan" - } - ] - } - } - } - ], - "required": [ - "numberSort" - ] - }, - "NumericFloat": { - "discriminator": { - "propertyName": "operator" - }, - "properties": { - "operator": { - "type": "string" - } - }, - "required": [ - "operator" - ] - }, - "NumericNullableInteger": { - "discriminator": { - "propertyName": "operator" - }, - "properties": { - "operator": { - "type": "string" - } - }, - "required": [ - "operator" - ] - }, "OAuth2ClientDto": { "type": "object", "properties": { @@ -11272,34 +10119,6 @@ "registrationId" ] }, - "OneShot": { - "allOf": [ - { - "$ref": "#/components/schemas/Series" - }, - { - "type": "object", - "properties": { - "oneShot": { - "oneOf": [ - { - "$ref": "#/components/schemas/IsFalse" - }, - { - "$ref": "#/components/schemas/IsTrue" - } - ] - } - } - }, - { - "$ref": "#/components/schemas/Book" - } - ], - "required": [ - "oneShot" - ] - }, "PageAuthenticationActivityDto": { "type": "object", "properties": { @@ -11975,56 +10794,6 @@ "type" ] }, - "Poster": { - "allOf": [ - { - "$ref": "#/components/schemas/Book" - }, - { - "type": "object", - "properties": { - "poster": { - "oneOf": [ - { - "$ref": "#/components/schemas/Is" - }, - { - "$ref": "#/components/schemas/IsNot" - } - ] - } - } - } - ], - "required": [ - "poster" - ] - }, - "Publisher": { - "allOf": [ - { - "$ref": "#/components/schemas/Series" - }, - { - "type": "object", - "properties": { - "publisher": { - "oneOf": [ - { - "$ref": "#/components/schemas/Is" - }, - { - "$ref": "#/components/schemas/IsNot" - } - ] - } - } - } - ], - "required": [ - "publisher" - ] - }, "R2Device": { "type": "object", "properties": { @@ -12178,31 +10947,6 @@ "summary" ] }, - "ReadListId": { - "allOf": [ - { - "$ref": "#/components/schemas/Book" - }, - { - "type": "object", - "properties": { - "readListId": { - "oneOf": [ - { - "$ref": "#/components/schemas/Is" - }, - { - "$ref": "#/components/schemas/IsNot" - } - ] - } - } - } - ], - "required": [ - "readListId" - ] - }, "ReadListMatchDto": { "type": "object", "properties": { @@ -12405,74 +11149,6 @@ } } }, - "ReadStatus": { - "allOf": [ - { - "$ref": "#/components/schemas/Series" - }, - { - "type": "object", - "properties": { - "readStatus": { - "oneOf": [ - { - "$ref": "#/components/schemas/Is" - }, - { - "$ref": "#/components/schemas/IsNot" - } - ] - } - } - }, - { - "$ref": "#/components/schemas/Book" - } - ], - "required": [ - "readStatus" - ] - }, - "ReleaseDate": { - "allOf": [ - { - "$ref": "#/components/schemas/Series" - }, - { - "type": "object", - "properties": { - "releaseDate": { - "oneOf": [ - { - "$ref": "#/components/schemas/After" - }, - { - "$ref": "#/components/schemas/Before" - }, - { - "$ref": "#/components/schemas/IsInTheLast" - }, - { - "$ref": "#/components/schemas/IsNotInTheLast" - }, - { - "$ref": "#/components/schemas/IsNotNull" - }, - { - "$ref": "#/components/schemas/IsNull" - } - ] - } - } - }, - { - "$ref": "#/components/schemas/Book" - } - ], - "required": [ - "releaseDate" - ] - }, "ReleaseDto": { "type": "object", "properties": { @@ -12516,7 +11192,955 @@ "path" ] }, - "Series": {}, + "SearchConditionAgeRating": { + "properties": { + "ageRating": { + "$ref": "#/components/schemas/SearchOperatorNumericNullableInteger" + } + }, + "required": [ + "ageRating" + ] + }, + "SearchConditionAllOfBook": { + "properties": { + "allOf": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SearchConditionBook" + } + } + }, + "required": [ + "allOf" + ] + }, + "SearchConditionAllOfSeries": { + "properties": { + "allOf": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SearchConditionSeries" + } + } + }, + "required": [ + "allOf" + ] + }, + "SearchConditionAnyOfBook": { + "properties": { + "anyOf": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SearchConditionBook" + } + } + }, + "required": [ + "anyOf" + ] + }, + "SearchConditionAnyOfSeries": { + "properties": { + "anyOf": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SearchConditionSeries" + } + } + }, + "required": [ + "anyOf" + ] + }, + "SearchConditionAuthor": { + "properties": { + "author": { + "$ref": "#/components/schemas/SearchOperatorEqualityAuthorMatch" + } + }, + "required": [ + "author" + ] + }, + "SearchConditionBook": { + "oneOf": [ + { + "$ref": "#/components/schemas/SearchConditionAnyOfBook" + }, + { + "$ref": "#/components/schemas/SearchConditionAllOfBook" + }, + { + "$ref": "#/components/schemas/SearchConditionLibraryId" + }, + { + "$ref": "#/components/schemas/SearchConditionReadListId" + }, + { + "$ref": "#/components/schemas/SearchConditionSeriesId" + }, + { + "$ref": "#/components/schemas/SearchConditionDeleted" + }, + { + "$ref": "#/components/schemas/SearchConditionOneShot" + }, + { + "$ref": "#/components/schemas/SearchConditionTitle" + }, + { + "$ref": "#/components/schemas/SearchConditionReleaseDate" + }, + { + "$ref": "#/components/schemas/SearchConditionTag" + }, + { + "$ref": "#/components/schemas/SearchConditionNumberSort" + }, + { + "$ref": "#/components/schemas/SearchConditionReadStatus" + }, + { + "$ref": "#/components/schemas/SearchConditionMediaStatus" + }, + { + "$ref": "#/components/schemas/SearchConditionMediaProfile" + }, + { + "$ref": "#/components/schemas/SearchConditionAuthor" + }, + { + "$ref": "#/components/schemas/SearchConditionPoster" + } + ] + }, + "SearchConditionCollectionId": { + "properties": { + "collectionId": { + "$ref": "#/components/schemas/SearchOperatorEqualityString" + } + }, + "required": [ + "collectionId" + ] + }, + "SearchConditionComplete": { + "properties": { + "complete": { + "$ref": "#/components/schemas/SearchOperatorBoolean" + } + }, + "required": [ + "complete" + ] + }, + "SearchConditionDeleted": { + "properties": { + "deleted": { + "$ref": "#/components/schemas/SearchOperatorBoolean" + } + }, + "required": [ + "deleted" + ] + }, + "SearchConditionGenre": { + "properties": { + "genre": { + "$ref": "#/components/schemas/SearchOperatorEqualityNullableString" + } + }, + "required": [ + "genre" + ] + }, + "SearchConditionLanguage": { + "properties": { + "language": { + "$ref": "#/components/schemas/SearchOperatorEqualityString" + } + }, + "required": [ + "language" + ] + }, + "SearchConditionLibraryId": { + "properties": { + "libraryId": { + "$ref": "#/components/schemas/SearchOperatorEqualityString" + } + }, + "required": [ + "libraryId" + ] + }, + "SearchConditionMediaProfile": { + "properties": { + "mediaProfile": { + "$ref": "#/components/schemas/SearchOperatorEqualityMediaProfile" + } + }, + "required": [ + "mediaProfile" + ] + }, + "SearchConditionMediaStatus": { + "properties": { + "mediaStatus": { + "$ref": "#/components/schemas/SearchOperatorEqualityStatus" + } + }, + "required": [ + "mediaStatus" + ] + }, + "SearchConditionNumberSort": { + "properties": { + "numberSort": { + "$ref": "#/components/schemas/SearchOperatorNumericTFloat" + } + }, + "required": [ + "numberSort" + ] + }, + "SearchConditionOneShot": { + "properties": { + "oneShot": { + "$ref": "#/components/schemas/SearchOperatorBoolean" + } + }, + "required": [ + "oneShot" + ] + }, + "SearchConditionPoster": { + "properties": { + "poster": { + "$ref": "#/components/schemas/SearchOperatorEqualityPosterMatch" + } + }, + "required": [ + "poster" + ] + }, + "SearchConditionPublisher": { + "properties": { + "publisher": { + "$ref": "#/components/schemas/SearchOperatorEqualityString" + } + }, + "required": [ + "publisher" + ] + }, + "SearchConditionReadListId": { + "properties": { + "readListId": { + "$ref": "#/components/schemas/SearchOperatorEqualityString" + } + }, + "required": [ + "readListId" + ] + }, + "SearchConditionReadStatus": { + "properties": { + "readStatus": { + "$ref": "#/components/schemas/SearchOperatorEqualityReadStatus" + } + }, + "required": [ + "readStatus" + ] + }, + "SearchConditionReleaseDate": { + "properties": { + "releaseDate": { + "$ref": "#/components/schemas/SearchOperatorDate" + } + }, + "required": [ + "releaseDate" + ] + }, + "SearchConditionSeries": { + "oneOf": [ + { + "$ref": "#/components/schemas/SearchConditionAnyOfSeries" + }, + { + "$ref": "#/components/schemas/SearchConditionAllOfSeries" + }, + { + "$ref": "#/components/schemas/SearchConditionLibraryId" + }, + { + "$ref": "#/components/schemas/SearchConditionCollectionId" + }, + { + "$ref": "#/components/schemas/SearchConditionDeleted" + }, + { + "$ref": "#/components/schemas/SearchConditionComplete" + }, + { + "$ref": "#/components/schemas/SearchConditionOneShot" + }, + { + "$ref": "#/components/schemas/SearchConditionTitle" + }, + { + "$ref": "#/components/schemas/SearchConditionTitleSort" + }, + { + "$ref": "#/components/schemas/SearchConditionReleaseDate" + }, + { + "$ref": "#/components/schemas/SearchConditionTag" + }, + { + "$ref": "#/components/schemas/SearchConditionSharingLabel" + }, + { + "$ref": "#/components/schemas/SearchConditionPublisher" + }, + { + "$ref": "#/components/schemas/SearchConditionLanguage" + }, + { + "$ref": "#/components/schemas/SearchConditionGenre" + }, + { + "$ref": "#/components/schemas/SearchConditionAgeRating" + }, + { + "$ref": "#/components/schemas/SearchConditionReadStatus" + }, + { + "$ref": "#/components/schemas/SearchConditionSeriesStatus" + }, + { + "$ref": "#/components/schemas/SearchConditionAuthor" + } + ] + }, + "SearchConditionSeriesId": { + "properties": { + "seriesId": { + "$ref": "#/components/schemas/SearchOperatorEqualityString" + } + }, + "required": [ + "seriesId" + ] + }, + "SearchConditionSeriesStatus": { + "properties": { + "seriesStatus": { + "$ref": "#/components/schemas/SearchOperatorEqualityStatus" + } + }, + "required": [ + "seriesStatus" + ] + }, + "SearchConditionSharingLabel": { + "properties": { + "sharingLabel": { + "$ref": "#/components/schemas/SearchOperatorEqualityNullableString" + } + }, + "required": [ + "sharingLabel" + ] + }, + "SearchConditionTag": { + "properties": { + "tag": { + "$ref": "#/components/schemas/SearchOperatorEqualityNullableString" + } + }, + "required": [ + "tag" + ] + }, + "SearchConditionTitle": { + "properties": { + "title": { + "$ref": "#/components/schemas/SearchOperatorString" + } + }, + "required": [ + "title" + ] + }, + "SearchConditionTitleSort": { + "properties": { + "titleSort": { + "$ref": "#/components/schemas/SearchOperatorString" + } + }, + "required": [ + "titleSort" + ] + }, + "SearchOperatorAfter": { + "properties": { + "dateTime": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "dateTime" + ] + }, + "SearchOperatorBefore": { + "properties": { + "dateTime": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "dateTime" + ] + }, + "SearchOperatorBeginsWith": { + "properties": { + "value": { + "type": "string" + } + }, + "required": [ + "value" + ] + }, + "SearchOperatorBoolean": { + "discriminator": { + "mapping": { + "isFalse": "#/components/schemas/SearchOperatorIsFalse", + "isTrue": "#/components/schemas/SearchOperatorIsTrue" + }, + "propertyName": "operator" + }, + "oneOf": [ + { + "$ref": "#/components/schemas/SearchOperatorIsTrue" + }, + { + "$ref": "#/components/schemas/SearchOperatorIsFalse" + } + ], + "properties": { + "operator": { + "type": "string" + } + }, + "required": [ + "operator" + ] + }, + "SearchOperatorContains": { + "properties": { + "value": { + "type": "string" + } + }, + "required": [ + "value" + ] + }, + "SearchOperatorDate": { + "discriminator": { + "mapping": { + "after": "#/components/schemas/SearchOperatorAfter", + "before": "#/components/schemas/SearchOperatorBefore", + "isInTheLast": "#/components/schemas/SearchOperatorIsInTheLast", + "isNotInTheLast": "#/components/schemas/SearchOperatorIsNotInTheLast", + "isNotNull": "#/components/schemas/SearchOperatorIsNotNull", + "isNull": "#/components/schemas/SearchOperatorIsNull" + }, + "propertyName": "operator" + }, + "oneOf": [ + { + "$ref": "#/components/schemas/SearchOperatorBefore" + }, + { + "$ref": "#/components/schemas/SearchOperatorAfter" + }, + { + "$ref": "#/components/schemas/SearchOperatorIsInTheLast" + }, + { + "$ref": "#/components/schemas/SearchOperatorIsNotInTheLast" + }, + { + "$ref": "#/components/schemas/SearchOperatorIsNull" + }, + { + "$ref": "#/components/schemas/SearchOperatorIsNotNull" + } + ], + "properties": { + "operator": { + "type": "string" + } + }, + "required": [ + "operator" + ] + }, + "SearchOperatorDoesNotBeginWith": { + "properties": { + "value": { + "type": "string" + } + }, + "required": [ + "value" + ] + }, + "SearchOperatorDoesNotContain": { + "properties": { + "value": { + "type": "string" + } + }, + "required": [ + "value" + ] + }, + "SearchOperatorDoesNotEndWith": { + "properties": { + "value": { + "type": "string" + } + }, + "required": [ + "value" + ] + }, + "SearchOperatorEndsWith": { + "properties": { + "value": { + "type": "string" + } + }, + "required": [ + "value" + ] + }, + "SearchOperatorEqualityAuthorMatch": { + "discriminator": { + "mapping": { + "is": "#/components/schemas/SearchOperatorIs", + "isNot": "#/components/schemas/SearchOperatorIsNot" + }, + "propertyName": "operator" + }, + "oneOf": [ + { + "$ref": "#/components/schemas/SearchOperatorIs" + }, + { + "$ref": "#/components/schemas/SearchOperatorIsNot" + } + ], + "properties": { + "operator": { + "type": "string" + } + }, + "required": [ + "operator" + ] + }, + "SearchOperatorEqualityMediaProfile": { + "discriminator": { + "mapping": { + "is": "#/components/schemas/SearchOperatorIs", + "isNot": "#/components/schemas/SearchOperatorIsNot" + }, + "propertyName": "operator" + }, + "oneOf": [ + { + "$ref": "#/components/schemas/SearchOperatorIs" + }, + { + "$ref": "#/components/schemas/SearchOperatorIsNot" + } + ], + "properties": { + "operator": { + "type": "string" + } + }, + "required": [ + "operator" + ] + }, + "SearchOperatorEqualityNullableString": { + "discriminator": { + "mapping": { + "is": "#/components/schemas/SearchOperatorIs", + "isNot": "#/components/schemas/SearchOperatorIsNot", + "isNotNull": "#/components/schemas/SearchOperatorIsNotNullT", + "isNull": "#/components/schemas/SearchOperatorIsNullT" + }, + "propertyName": "operator" + }, + "oneOf": [ + { + "$ref": "#/components/schemas/SearchOperatorIs" + }, + { + "$ref": "#/components/schemas/SearchOperatorIsNot" + }, + { + "$ref": "#/components/schemas/SearchOperatorIsNullT" + }, + { + "$ref": "#/components/schemas/SearchOperatorIsNotNullT" + } + ], + "properties": { + "operator": { + "type": "string" + } + }, + "required": [ + "operator" + ] + }, + "SearchOperatorEqualityPosterMatch": { + "discriminator": { + "mapping": { + "is": "#/components/schemas/SearchOperatorIs", + "isNot": "#/components/schemas/SearchOperatorIsNot" + }, + "propertyName": "operator" + }, + "oneOf": [ + { + "$ref": "#/components/schemas/SearchOperatorIs" + }, + { + "$ref": "#/components/schemas/SearchOperatorIsNot" + } + ], + "properties": { + "operator": { + "type": "string" + } + }, + "required": [ + "operator" + ] + }, + "SearchOperatorEqualityReadStatus": { + "discriminator": { + "mapping": { + "is": "#/components/schemas/SearchOperatorIs", + "isNot": "#/components/schemas/SearchOperatorIsNot" + }, + "propertyName": "operator" + }, + "oneOf": [ + { + "$ref": "#/components/schemas/SearchOperatorIs" + }, + { + "$ref": "#/components/schemas/SearchOperatorIsNot" + } + ], + "properties": { + "operator": { + "type": "string" + } + }, + "required": [ + "operator" + ] + }, + "SearchOperatorEqualityStatus": { + "discriminator": { + "mapping": { + "is": "#/components/schemas/SearchOperatorIs", + "isNot": "#/components/schemas/SearchOperatorIsNot" + }, + "propertyName": "operator" + }, + "oneOf": [ + { + "$ref": "#/components/schemas/SearchOperatorIs" + }, + { + "$ref": "#/components/schemas/SearchOperatorIsNot" + } + ], + "properties": { + "operator": { + "type": "string" + } + }, + "required": [ + "operator" + ] + }, + "SearchOperatorEqualityString": { + "discriminator": { + "mapping": { + "is": "#/components/schemas/SearchOperatorIs", + "isNot": "#/components/schemas/SearchOperatorIsNot" + }, + "propertyName": "operator" + }, + "oneOf": [ + { + "$ref": "#/components/schemas/SearchOperatorIs" + }, + { + "$ref": "#/components/schemas/SearchOperatorIsNot" + } + ], + "properties": { + "operator": { + "type": "string" + } + }, + "required": [ + "operator" + ] + }, + "SearchOperatorGreaterThan": { + "properties": { + "value": {} + }, + "required": [ + "value" + ] + }, + "SearchOperatorIs": { + "properties": { + "value": {} + }, + "required": [ + "value" + ] + }, + "SearchOperatorIsFalse": { + "allOf": [ + { + "$ref": "#/components/schemas/SearchOperatorBoolean" + } + ] + }, + "SearchOperatorIsInTheLast": { + "properties": { + "duration": { + "type": "string" + } + }, + "required": [ + "duration" + ] + }, + "SearchOperatorIsNot": { + "properties": { + "value": {} + }, + "required": [ + "value" + ] + }, + "SearchOperatorIsNotInTheLast": { + "properties": { + "duration": { + "type": "string" + } + }, + "required": [ + "duration" + ] + }, + "SearchOperatorIsNotNull": { + "allOf": [ + { + "$ref": "#/components/schemas/SearchOperatorDate" + } + ] + }, + "SearchOperatorIsNotNullT": { + "allOf": [ + { + "$ref": "#/components/schemas/SearchOperatorNumericNullableInteger" + }, + { + "$ref": "#/components/schemas/SearchOperatorEqualityNullableString" + } + ] + }, + "SearchOperatorIsNull": { + "allOf": [ + { + "$ref": "#/components/schemas/SearchOperatorDate" + } + ] + }, + "SearchOperatorIsNullT": { + "allOf": [ + { + "$ref": "#/components/schemas/SearchOperatorNumericNullableInteger" + }, + { + "$ref": "#/components/schemas/SearchOperatorEqualityNullableString" + } + ] + }, + "SearchOperatorIsTrue": { + "allOf": [ + { + "$ref": "#/components/schemas/SearchOperatorBoolean" + } + ] + }, + "SearchOperatorLessThan": { + "properties": { + "value": {} + }, + "required": [ + "value" + ] + }, + "SearchOperatorNumericNullableInteger": { + "discriminator": { + "mapping": { + "greaterThan": "#/components/schemas/SearchOperatorGreaterThan", + "is": "#/components/schemas/SearchOperatorIs", + "isNot": "#/components/schemas/SearchOperatorIsNot", + "isNotNull": "#/components/schemas/SearchOperatorIsNotNullT", + "isNull": "#/components/schemas/SearchOperatorIsNullT", + "lessThan": "#/components/schemas/SearchOperatorLessThan" + }, + "propertyName": "operator" + }, + "oneOf": [ + { + "$ref": "#/components/schemas/SearchOperatorGreaterThan" + }, + { + "$ref": "#/components/schemas/SearchOperatorLessThan" + }, + { + "$ref": "#/components/schemas/SearchOperatorIsNullT" + }, + { + "$ref": "#/components/schemas/SearchOperatorIsNotNullT" + }, + { + "$ref": "#/components/schemas/SearchOperatorIs" + }, + { + "$ref": "#/components/schemas/SearchOperatorIsNot" + } + ], + "properties": { + "operator": { + "type": "string" + } + }, + "required": [ + "operator" + ] + }, + "SearchOperatorNumericTFloat": { + "discriminator": { + "mapping": { + "greaterThan": "#/components/schemas/SearchOperatorGreaterThan", + "is": "#/components/schemas/SearchOperatorIs", + "isNot": "#/components/schemas/SearchOperatorIsNot", + "lessThan": "#/components/schemas/SearchOperatorLessThan" + }, + "propertyName": "operator" + }, + "oneOf": [ + { + "$ref": "#/components/schemas/SearchOperatorGreaterThan" + }, + { + "$ref": "#/components/schemas/SearchOperatorLessThan" + }, + { + "$ref": "#/components/schemas/SearchOperatorIs" + }, + { + "$ref": "#/components/schemas/SearchOperatorIsNot" + } + ], + "properties": { + "operator": { + "type": "string" + } + }, + "required": [ + "operator" + ] + }, + "SearchOperatorString": { + "discriminator": { + "mapping": { + "beginsWith": "#/components/schemas/SearchOperatorBeginsWith", + "contains": "#/components/schemas/SearchOperatorContains", + "doesNotBeginWith": "#/components/schemas/SearchOperatorDoesNotBeginWith", + "doesNotContain": "#/components/schemas/SearchOperatorDoesNotContain", + "doesNotEndWith": "#/components/schemas/SearchOperatorDoesNotEndWith", + "endsWith": "#/components/schemas/SearchOperatorEndsWith", + "is": "#/components/schemas/SearchOperatorIs", + "isNot": "#/components/schemas/SearchOperatorIsNot" + }, + "propertyName": "operator" + }, + "oneOf": [ + { + "$ref": "#/components/schemas/SearchOperatorBeginsWith" + }, + { + "$ref": "#/components/schemas/SearchOperatorDoesNotBeginWith" + }, + { + "$ref": "#/components/schemas/SearchOperatorContains" + }, + { + "$ref": "#/components/schemas/SearchOperatorDoesNotContain" + }, + { + "$ref": "#/components/schemas/SearchOperatorEndsWith" + }, + { + "$ref": "#/components/schemas/SearchOperatorDoesNotEndWith" + }, + { + "$ref": "#/components/schemas/SearchOperatorIs" + }, + { + "$ref": "#/components/schemas/SearchOperatorIsNot" + } + ], + "properties": { + "operator": { + "type": "string" + } + }, + "required": [ + "operator" + ] + }, "SeriesDto": { "type": "object", "properties": { @@ -12591,31 +12215,6 @@ "url" ] }, - "SeriesId": { - "allOf": [ - { - "$ref": "#/components/schemas/Book" - }, - { - "type": "object", - "properties": { - "seriesId": { - "oneOf": [ - { - "$ref": "#/components/schemas/Is" - }, - { - "$ref": "#/components/schemas/IsNot" - } - ] - } - } - } - ], - "required": [ - "seriesId" - ] - }, "SeriesMetadataDto": { "type": "object", "properties": { @@ -12889,96 +12488,13 @@ "type": "object", "properties": { "condition": { - "oneOf": [ - { - "$ref": "#/components/schemas/AgeRating" - }, - { - "$ref": "#/components/schemas/AllOfSeries" - }, - { - "$ref": "#/components/schemas/AnyOfSeries" - }, - { - "$ref": "#/components/schemas/Author" - }, - { - "$ref": "#/components/schemas/CollectionId" - }, - { - "$ref": "#/components/schemas/Complete" - }, - { - "$ref": "#/components/schemas/Deleted" - }, - { - "$ref": "#/components/schemas/Genre" - }, - { - "$ref": "#/components/schemas/Language" - }, - { - "$ref": "#/components/schemas/LibraryId" - }, - { - "$ref": "#/components/schemas/OneShot" - }, - { - "$ref": "#/components/schemas/Publisher" - }, - { - "$ref": "#/components/schemas/ReadStatus" - }, - { - "$ref": "#/components/schemas/ReleaseDate" - }, - { - "$ref": "#/components/schemas/SeriesStatus" - }, - { - "$ref": "#/components/schemas/SharingLabel" - }, - { - "$ref": "#/components/schemas/Tag" - }, - { - "$ref": "#/components/schemas/Title" - }, - { - "$ref": "#/components/schemas/TitleSort" - } - ] + "$ref": "#/components/schemas/SearchConditionSeries" }, "fullTextSearch": { "type": "string" } } }, - "SeriesStatus": { - "allOf": [ - { - "$ref": "#/components/schemas/Series" - }, - { - "type": "object", - "properties": { - "seriesStatus": { - "oneOf": [ - { - "$ref": "#/components/schemas/Is" - }, - { - "$ref": "#/components/schemas/IsNot" - } - ] - } - } - } - ], - "required": [ - "seriesStatus" - ] - }, "SettingMultiSourceInteger": { "type": "object", "properties": { @@ -13148,37 +12664,6 @@ "libraryIds" ] }, - "SharingLabel": { - "allOf": [ - { - "$ref": "#/components/schemas/Series" - }, - { - "type": "object", - "properties": { - "sharingLabel": { - "oneOf": [ - { - "$ref": "#/components/schemas/Is" - }, - { - "$ref": "#/components/schemas/IsNot" - }, - { - "$ref": "#/components/schemas/IsNotNullT" - }, - { - "$ref": "#/components/schemas/IsNullT" - } - ] - } - } - } - ], - "required": [ - "sharingLabel" - ] - }, "SortObject": { "type": "object", "properties": { @@ -13194,19 +12679,6 @@ } }, "StreamingResponseBody": {}, - "StringOp": { - "discriminator": { - "propertyName": "operator" - }, - "properties": { - "operator": { - "type": "string" - } - }, - "required": [ - "operator" - ] - }, "TachiyomiReadProgressDto": { "type": "object", "properties": { @@ -13300,40 +12772,6 @@ "maxNumberSort" ] }, - "Tag": { - "allOf": [ - { - "$ref": "#/components/schemas/Series" - }, - { - "type": "object", - "properties": { - "tag": { - "oneOf": [ - { - "$ref": "#/components/schemas/Is" - }, - { - "$ref": "#/components/schemas/IsNot" - }, - { - "$ref": "#/components/schemas/IsNotNullT" - }, - { - "$ref": "#/components/schemas/IsNullT" - } - ] - } - } - }, - { - "$ref": "#/components/schemas/Book" - } - ], - "required": [ - "tag" - ] - }, "Text": { "type": "object", "properties": { @@ -13516,95 +12954,6 @@ "width" ] }, - "Title": { - "allOf": [ - { - "$ref": "#/components/schemas/Series" - }, - { - "type": "object", - "properties": { - "title": { - "oneOf": [ - { - "$ref": "#/components/schemas/BeginsWith" - }, - { - "$ref": "#/components/schemas/Contains" - }, - { - "$ref": "#/components/schemas/DoesNotBeginWith" - }, - { - "$ref": "#/components/schemas/DoesNotContain" - }, - { - "$ref": "#/components/schemas/DoesNotEndWith" - }, - { - "$ref": "#/components/schemas/EndsWith" - }, - { - "$ref": "#/components/schemas/Is" - }, - { - "$ref": "#/components/schemas/IsNot" - } - ] - } - } - }, - { - "$ref": "#/components/schemas/Book" - } - ], - "required": [ - "title" - ] - }, - "TitleSort": { - "allOf": [ - { - "$ref": "#/components/schemas/Series" - }, - { - "type": "object", - "properties": { - "titleSort": { - "oneOf": [ - { - "$ref": "#/components/schemas/BeginsWith" - }, - { - "$ref": "#/components/schemas/Contains" - }, - { - "$ref": "#/components/schemas/DoesNotBeginWith" - }, - { - "$ref": "#/components/schemas/DoesNotContain" - }, - { - "$ref": "#/components/schemas/DoesNotEndWith" - }, - { - "$ref": "#/components/schemas/EndsWith" - }, - { - "$ref": "#/components/schemas/Is" - }, - { - "$ref": "#/components/schemas/IsNot" - } - ] - } - } - } - ], - "required": [ - "titleSort" - ] - }, "TransientBookDto": { "type": "object", "properties": { diff --git a/komga/src/main/kotlin/org/gotson/komga/domain/model/SearchCondition.kt b/komga/src/main/kotlin/org/gotson/komga/domain/model/SearchCondition.kt index fcccf3ad..972d0d73 100644 --- a/komga/src/main/kotlin/org/gotson/komga/domain/model/SearchCondition.kt +++ b/komga/src/main/kotlin/org/gotson/komga/domain/model/SearchCondition.kt @@ -3,14 +3,24 @@ package org.gotson.komga.domain.model import com.fasterxml.jackson.annotation.JsonInclude import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.annotation.JsonTypeInfo +import io.swagger.v3.oas.annotations.media.Schema class SearchCondition { + @Schema( + name = "SearchConditionBook", + oneOf = [AnyOfBook::class, AllOfBook::class, LibraryId::class, ReadListId::class, SeriesId::class, Deleted::class, OneShot::class, Title::class, ReleaseDate::class, Tag::class, NumberSort::class, ReadStatus::class, MediaStatus::class, MediaProfile::class, Author::class, Poster::class], + ) @JsonTypeInfo(use = JsonTypeInfo.Id.DEDUCTION) sealed interface Book + @Schema( + name = "SearchConditionSeries", + oneOf = [AnyOfSeries::class, AllOfSeries::class, LibraryId::class, CollectionId::class, Deleted::class, Complete::class, OneShot::class, Title::class, TitleSort::class, ReleaseDate::class, Tag::class, SharingLabel::class, Publisher::class, Language::class, Genre::class, AgeRating::class, ReadStatus::class, SeriesStatus::class, Author::class], + ) @JsonTypeInfo(use = JsonTypeInfo.Id.DEDUCTION) sealed interface Series + @Schema(name = "SearchConditionAnyOfBook") data class AnyOfBook( @JsonProperty("anyOf") val conditions: List, @@ -18,6 +28,7 @@ class SearchCondition { constructor(vararg args: Book) : this(args.toList()) } + @Schema(name = "SearchConditionAllOfBook") data class AllOfBook( @JsonProperty("allOf") val conditions: List, @@ -25,6 +36,7 @@ class SearchCondition { constructor(vararg args: Book) : this(args.toList()) } + @Schema(name = "SearchConditionAnyOfSeries") data class AnyOfSeries( @JsonProperty("anyOf") val conditions: List, @@ -32,6 +44,7 @@ class SearchCondition { constructor(vararg args: Series) : this(args.toList()) } + @Schema(name = "SearchConditionAllOfSeries") data class AllOfSeries( @JsonProperty("allOf") val conditions: List, @@ -39,118 +52,140 @@ class SearchCondition { constructor(vararg args: Series) : this(args.toList()) } + @Schema(name = "SearchConditionLibraryId") data class LibraryId( @JsonProperty("libraryId") val operator: SearchOperator.Equality, ) : Book, Series + @Schema(name = "SearchConditionCollectionId") data class CollectionId( @JsonProperty("collectionId") val operator: SearchOperator.Equality, ) : Series + @Schema(name = "SearchConditionReadListId") data class ReadListId( @JsonProperty("readListId") val operator: SearchOperator.Equality, ) : Book + @Schema(name = "SearchConditionSeriesId") data class SeriesId( @JsonProperty("seriesId") val operator: SearchOperator.Equality, ) : Book + @Schema(name = "SearchConditionDeleted") data class Deleted( @JsonProperty("deleted") val operator: SearchOperator.Boolean, ) : Book, Series + @Schema(name = "SearchConditionComplete") data class Complete( @JsonProperty("complete") val operator: SearchOperator.Boolean, ) : Series + @Schema(name = "SearchConditionOneShot") data class OneShot( @JsonProperty("oneShot") val operator: SearchOperator.Boolean, ) : Book, Series + @Schema(name = "SearchConditionTitle") data class Title( @JsonProperty("title") val operator: SearchOperator.StringOp, ) : Book, Series + @Schema(name = "SearchConditionTitleSort") data class TitleSort( @JsonProperty("titleSort") val operator: SearchOperator.StringOp, ) : Series + @Schema(name = "SearchConditionReleaseDate") data class ReleaseDate( @JsonProperty("releaseDate") val operator: SearchOperator.Date, ) : Book, Series + @Schema(name = "SearchConditionNumberSort") data class NumberSort( @JsonProperty("numberSort") val operator: SearchOperator.Numeric, ) : Book + @Schema(name = "SearchConditionTag") data class Tag( @JsonProperty("tag") val operator: SearchOperator.EqualityNullable, ) : Book, Series + @Schema(name = "SearchConditionSharingLabel") data class SharingLabel( @JsonProperty("sharingLabel") val operator: SearchOperator.EqualityNullable, ) : Series + @Schema(name = "SearchConditionPublisher") data class Publisher( @JsonProperty("publisher") val operator: SearchOperator.Equality, ) : Series + @Schema(name = "SearchConditionLanguage") data class Language( @JsonProperty("language") val operator: SearchOperator.Equality, ) : Series + @Schema(name = "SearchConditionGenre") data class Genre( @JsonProperty("genre") val operator: SearchOperator.EqualityNullable, ) : Series + @Schema(name = "SearchConditionAgeRating") data class AgeRating( @JsonProperty("ageRating") val operator: SearchOperator.NumericNullable, ) : Series + @Schema(name = "SearchConditionReadStatus") data class ReadStatus( @JsonProperty("readStatus") val operator: SearchOperator.Equality, ) : Book, Series + @Schema(name = "SearchConditionMediaStatus") data class MediaStatus( @JsonProperty("mediaStatus") val operator: SearchOperator.Equality, ) : Book + @Schema(name = "SearchConditionSeriesStatus") data class SeriesStatus( @JsonProperty("seriesStatus") val operator: SearchOperator.Equality, ) : Series + @Schema(name = "SearchConditionMediaProfile") data class MediaProfile( @JsonProperty("mediaProfile") val operator: SearchOperator.Equality, ) : Book + @Schema(name = "SearchConditionAuthor") data class Author( @JsonProperty("author") val operator: SearchOperator.Equality, @@ -163,6 +198,7 @@ class SearchCondition { val role: String? = null, ) + @Schema(name = "SearchConditionPoster") data class Poster( @JsonProperty("poster") val operator: SearchOperator.Equality, diff --git a/komga/src/main/kotlin/org/gotson/komga/domain/model/SearchOperator.kt b/komga/src/main/kotlin/org/gotson/komga/domain/model/SearchOperator.kt index 8de54226..1bf000a0 100644 --- a/komga/src/main/kotlin/org/gotson/komga/domain/model/SearchOperator.kt +++ b/komga/src/main/kotlin/org/gotson/komga/domain/model/SearchOperator.kt @@ -2,10 +2,21 @@ package org.gotson.komga.domain.model import com.fasterxml.jackson.annotation.JsonTypeInfo import com.fasterxml.jackson.annotation.JsonTypeName +import io.swagger.v3.oas.annotations.media.DiscriminatorMapping +import io.swagger.v3.oas.annotations.media.Schema import java.time.Duration import java.time.ZonedDateTime class SearchOperator { + @Schema( + name = "SearchOperatorEquality", + discriminatorProperty = "operator", + oneOf = [ Is::class, IsNot::class], + discriminatorMapping = [ + DiscriminatorMapping("is", Is::class), + DiscriminatorMapping("isNot", IsNot::class), + ], + ) @JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, @@ -13,6 +24,17 @@ class SearchOperator { ) sealed interface Equality + @Schema( + name = "SearchOperatorEqualityNullable", + discriminatorProperty = "operator", + oneOf = [ Is::class, IsNot::class, IsNullT::class, IsNotNullT::class], + discriminatorMapping = [ + DiscriminatorMapping("is", Is::class), + DiscriminatorMapping("isNot", IsNot::class), + DiscriminatorMapping("isNull", IsNullT::class), + DiscriminatorMapping("isNotNull", IsNotNullT::class), + ], + ) @JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, @@ -20,6 +42,21 @@ class SearchOperator { ) sealed interface EqualityNullable + @Schema( + name = "SearchOperatorString", + discriminatorProperty = "operator", + oneOf = [BeginsWith::class, DoesNotBeginWith::class, Contains::class, DoesNotContain::class, EndsWith::class, DoesNotEndWith::class, Is::class, IsNot::class], + discriminatorMapping = [ + DiscriminatorMapping("beginsWith", BeginsWith::class), + DiscriminatorMapping("doesNotBeginWith", DoesNotBeginWith::class), + DiscriminatorMapping("contains", Contains::class), + DiscriminatorMapping("doesNotContain", DoesNotContain::class), + DiscriminatorMapping("endsWith", EndsWith::class), + DiscriminatorMapping("doesNotEndWith", DoesNotEndWith::class), + DiscriminatorMapping("is", Is::class), + DiscriminatorMapping("isNot", IsNot::class), + ], + ) @JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, @@ -27,6 +64,17 @@ class SearchOperator { ) sealed interface StringOp + @Schema( + name = "SearchOperatorNumericT", + discriminatorProperty = "operator", + oneOf = [GreaterThan::class, LessThan::class, Is::class, IsNot::class], + discriminatorMapping = [ + DiscriminatorMapping("greaterThan", GreaterThan::class), + DiscriminatorMapping("lessThan", LessThan::class), + DiscriminatorMapping("is", Is::class), + DiscriminatorMapping("isNot", IsNot::class), + ], + ) @JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, @@ -34,6 +82,19 @@ class SearchOperator { ) sealed interface Numeric + @Schema( + name = "SearchOperatorNumericNullable", + discriminatorProperty = "operator", + oneOf = [GreaterThan::class, LessThan::class, IsNullT::class, IsNotNullT::class, Is::class, IsNot::class], + discriminatorMapping = [ + DiscriminatorMapping("greaterThan", GreaterThan::class), + DiscriminatorMapping("lessThan", LessThan::class), + DiscriminatorMapping("isNull", IsNullT::class), + DiscriminatorMapping("isNotNull", IsNotNullT::class), + DiscriminatorMapping("is", Is::class), + DiscriminatorMapping("isNot", IsNot::class), + ], + ) @JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, @@ -41,6 +102,19 @@ class SearchOperator { ) sealed interface NumericNullable + @Schema( + name = "SearchOperatorDate", + discriminatorProperty = "operator", + oneOf = [Before::class, After::class, IsInTheLast::class, IsNotInTheLast::class, IsNull::class, IsNotNull::class], + discriminatorMapping = [ + DiscriminatorMapping("before", Before::class), + DiscriminatorMapping("after", After::class), + DiscriminatorMapping("isInTheLast", IsInTheLast::class), + DiscriminatorMapping("isNotInTheLast", IsNotInTheLast::class), + DiscriminatorMapping("isNull", IsNull::class), + DiscriminatorMapping("isNotNull", IsNotNull::class), + ], + ) @JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, @@ -48,6 +122,15 @@ class SearchOperator { ) sealed interface Date + @Schema( + name = "SearchOperatorBoolean", + discriminatorProperty = "operator", + oneOf = [IsTrue::class, IsFalse::class], + discriminatorMapping = [ + DiscriminatorMapping("isTrue", IsTrue::class), + DiscriminatorMapping("isFalse", IsFalse::class), + ], + ) @JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, @@ -55,6 +138,7 @@ class SearchOperator { ) sealed interface Boolean + @Schema(name = "SearchOperatorIs") @JsonTypeName("is") data class Is( val value: T, @@ -64,6 +148,7 @@ class SearchOperator { Numeric, NumericNullable + @Schema(name = "SearchOperatorIsNot") @JsonTypeName("isNot") data class IsNot( val value: T, @@ -73,80 +158,97 @@ class SearchOperator { Numeric, NumericNullable + @Schema(name = "SearchOperatorContains") @JsonTypeName("contains") data class Contains( val value: String, ) : StringOp + @Schema(name = "SearchOperatorDoesNotContain") @JsonTypeName("doesNotContain") data class DoesNotContain( val value: String, ) : StringOp + @Schema(name = "SearchOperatorBeginsWith") @JsonTypeName("beginsWith") data class BeginsWith( val value: String, ) : StringOp + @Schema(name = "SearchOperatorDoesNotBeginWith") @JsonTypeName("doesNotBeginWith") data class DoesNotBeginWith( val value: String, ) : StringOp + @Schema(name = "SearchOperatorEndsWith") @JsonTypeName("endsWith") data class EndsWith( val value: String, ) : StringOp + @Schema(name = "SearchOperatorDoesNotEndWith") @JsonTypeName("doesNotEndWith") data class DoesNotEndWith( val value: String, ) : StringOp + @Schema(name = "SearchOperatorGreaterThan") @JsonTypeName("greaterThan") data class GreaterThan( val value: T, ) : Numeric, NumericNullable + @Schema(name = "SearchOperatorLessThan") @JsonTypeName("lessThan") data class LessThan( val value: T, ) : Numeric, NumericNullable + @Schema(name = "SearchOperatorBefore") @JsonTypeName("before") data class Before( val dateTime: ZonedDateTime, ) : Date + @Schema(name = "SearchOperatorAfter") @JsonTypeName("after") data class After( val dateTime: ZonedDateTime, ) : Date + @Schema(name = "SearchOperatorIsInTheLast") @JsonTypeName("isInTheLast") data class IsInTheLast( val duration: Duration, ) : Date + @Schema(name = "SearchOperatorIsNotInTheLast") @JsonTypeName("isNotInTheLast") data class IsNotInTheLast( val duration: Duration, ) : Date + @Schema(name = "SearchOperatorIsTrue") @JsonTypeName("isTrue") data object IsTrue : Boolean + @Schema(name = "SearchOperatorIsFalse") @JsonTypeName("isFalse") data object IsFalse : Boolean + @Schema(name = "SearchOperatorIsNull") @JsonTypeName("isNull") data object IsNull : Date + @Schema(name = "SearchOperatorIsNotNull") @JsonTypeName("isNotNull") data object IsNotNull : Date + @Schema(name = "SearchOperatorIsNullT") @JsonTypeName("isNull") class IsNullT : NumericNullable, @@ -160,6 +262,7 @@ class SearchOperator { override fun hashCode(): Int = javaClass.hashCode() } + @Schema(name = "SearchOperatorIsNotNullT") @JsonTypeName("isNotNull") class IsNotNullT : NumericNullable, diff --git a/komga/src/main/kotlin/org/gotson/komga/domain/persistence/ThumbnailBookRepository.kt b/komga/src/main/kotlin/org/gotson/komga/domain/persistence/ThumbnailBookRepository.kt index 71cb0275..5e3129fd 100644 --- a/komga/src/main/kotlin/org/gotson/komga/domain/persistence/ThumbnailBookRepository.kt +++ b/komga/src/main/kotlin/org/gotson/komga/domain/persistence/ThumbnailBookRepository.kt @@ -21,6 +21,10 @@ interface ThumbnailBookRepository { fun existsById(thumbnailId: String): Boolean + fun getLibraryIdOrNull(thumbnailId: String): String? + + fun getSeriesIdOrNull(thumbnailId: String): String? + fun insert(thumbnail: ThumbnailBook) fun update(thumbnail: ThumbnailBook) diff --git a/komga/src/main/kotlin/org/gotson/komga/infrastructure/jooq/main/ThumbnailBookDao.kt b/komga/src/main/kotlin/org/gotson/komga/infrastructure/jooq/main/ThumbnailBookDao.kt index f3c0a90b..e5fba456 100644 --- a/komga/src/main/kotlin/org/gotson/komga/infrastructure/jooq/main/ThumbnailBookDao.kt +++ b/komga/src/main/kotlin/org/gotson/komga/infrastructure/jooq/main/ThumbnailBookDao.kt @@ -22,6 +22,7 @@ class ThumbnailBookDao( ) : SplitDslDaoBase(dslRW, dslRO), ThumbnailBookRepository { private val tb = Tables.THUMBNAIL_BOOK + private val b = Tables.BOOK override fun findAllByBookId(bookId: String): Collection = dslRO @@ -72,6 +73,24 @@ class ThumbnailBookDao( override fun existsById(thumbnailId: String): Boolean = dslRO.fetchExists(tb, tb.ID.eq(thumbnailId)) + override fun getLibraryIdOrNull(thumbnailId: String): String? = + dslRO + .select(b.LIBRARY_ID) + .from(tb) + .leftJoin(b) + .on(tb.BOOK_ID.eq(b.ID)) + .where(tb.ID.eq(thumbnailId)) + .fetchOne(b.LIBRARY_ID) + + override fun getSeriesIdOrNull(thumbnailId: String): String? = + dslRO + .select(b.SERIES_ID) + .from(tb) + .leftJoin(b) + .on(tb.BOOK_ID.eq(b.ID)) + .where(tb.ID.eq(thumbnailId)) + .fetchOne(b.SERIES_ID) + override fun insert(thumbnail: ThumbnailBook) { dslRW .insertInto(tb) diff --git a/komga/src/main/kotlin/org/gotson/komga/infrastructure/kobo/KoboProxy.kt b/komga/src/main/kotlin/org/gotson/komga/infrastructure/kobo/KoboProxy.kt index 2df061ec..dd93877e 100644 --- a/komga/src/main/kotlin/org/gotson/komga/infrastructure/kobo/KoboProxy.kt +++ b/komga/src/main/kotlin/org/gotson/komga/infrastructure/kobo/KoboProxy.kt @@ -74,7 +74,7 @@ class KoboProxy( * raw Kobo sync token returned, and added to the response headers. */ fun proxyCurrentRequest( - body: Any? = null, + body: ByteArray? = null, includeSyncToken: Boolean = false, ): ResponseEntity { if (!komgaSettingsProvider.koboProxy) throw IllegalStateException("kobo proxying is disabled") diff --git a/komga/src/main/kotlin/org/gotson/komga/infrastructure/mediacontainer/divina/RarExtractor.kt b/komga/src/main/kotlin/org/gotson/komga/infrastructure/mediacontainer/divina/RarExtractor.kt index cf5f1249..a9aa32e0 100644 --- a/komga/src/main/kotlin/org/gotson/komga/infrastructure/mediacontainer/divina/RarExtractor.kt +++ b/komga/src/main/kotlin/org/gotson/komga/infrastructure/mediacontainer/divina/RarExtractor.kt @@ -28,7 +28,6 @@ class RarExtractor( ): List = Archive(path.toFile()).use { rar -> if (rar.isPasswordProtected) throw MediaUnsupportedException("Encrypted RAR archives are not supported", "ERR_1002") - if (rar.mainHeader.isSolid) throw MediaUnsupportedException("Solid RAR archives are not supported", "ERR_1003") if (rar.mainHeader.isMultiVolume) throw MediaUnsupportedException("Multi-Volume RAR archives are not supported", "ERR_1004") rar.fileHeaders .filter { !it.isDirectory } diff --git a/komga/src/main/kotlin/org/gotson/komga/infrastructure/mediacontainer/epub/Nav.kt b/komga/src/main/kotlin/org/gotson/komga/infrastructure/mediacontainer/epub/Nav.kt index e4e0e6f9..55942639 100644 --- a/komga/src/main/kotlin/org/gotson/komga/infrastructure/mediacontainer/epub/Nav.kt +++ b/komga/src/main/kotlin/org/gotson/komga/infrastructure/mediacontainer/epub/Nav.kt @@ -4,6 +4,7 @@ import org.gotson.komga.domain.model.EpubTocEntry import org.gotson.komga.infrastructure.util.getEntryBytes import org.jsoup.Jsoup import org.jsoup.nodes.Element +import org.jsoup.parser.Parser import java.net.URLDecoder import java.nio.file.Path import kotlin.io.path.Path @@ -20,7 +21,7 @@ fun processNav( document: ResourceContent, navElement: Epub3Nav, ): List { - val doc = Jsoup.parse(document.content) + val doc = Jsoup.parse(document.content, "", Parser.xmlParser()) val nav = doc .select("nav") diff --git a/komga/src/main/kotlin/org/gotson/komga/infrastructure/openapi/InheritanceFlattenerConfiguration.kt b/komga/src/main/kotlin/org/gotson/komga/infrastructure/openapi/InheritanceFlattenerConfiguration.kt new file mode 100644 index 00000000..7afc4d77 --- /dev/null +++ b/komga/src/main/kotlin/org/gotson/komga/infrastructure/openapi/InheritanceFlattenerConfiguration.kt @@ -0,0 +1,44 @@ +package org.gotson.komga.infrastructure.openapi + +import org.springdoc.core.customizers.OpenApiCustomizer +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.core.Ordered +import org.springframework.core.annotation.Order + +/** + * The generated schema for sealed classes is somehow wrong. + * This customizer will correct the issues. + */ +@Configuration +@Order(Ordered.LOWEST_PRECEDENCE) +class InheritanceFlattenerConfiguration { + private val schemaPrefix = listOf("SearchOperator", "SearchCondition") + + @Bean + fun flattenInheritedSchemasCustomizer(): OpenApiCustomizer = + OpenApiCustomizer { openApi -> + openApi.components + ?.schemas + ?.values + ?.filter { schema -> schemaPrefix.any { prefix -> schema.name.startsWith(prefix, false) } } + ?.forEach { schema -> + // Swagger models inheritance as an allOf list with exactly two items: + // 1. The $ref to the parent interface + // 2. An inline schema containing the child's actual properties + if (schema.allOf != null) { + val refSchema = schema.allOf.filter { it.`$ref` != null } + val inlineSchema = schema.allOf.find { it.properties != null } + + // If both are found, we know this is an inherited schema wrapper + if (refSchema.isNotEmpty() && inlineSchema != null) { + // Move the properties up to the root schema + schema.properties = inlineSchema.properties + + // Delete the allOf array entirely + schema.allOf = null + } + } + } + } +} diff --git a/komga/src/main/kotlin/org/gotson/komga/interfaces/api/ContentRestrictionChecker.kt b/komga/src/main/kotlin/org/gotson/komga/interfaces/api/ContentRestrictionChecker.kt index 4b54c5e7..fc7d4350 100644 --- a/komga/src/main/kotlin/org/gotson/komga/interfaces/api/ContentRestrictionChecker.kt +++ b/komga/src/main/kotlin/org/gotson/komga/interfaces/api/ContentRestrictionChecker.kt @@ -4,6 +4,7 @@ import org.gotson.komga.domain.model.Book import org.gotson.komga.domain.model.KomgaUser import org.gotson.komga.domain.persistence.BookRepository import org.gotson.komga.domain.persistence.SeriesMetadataRepository +import org.gotson.komga.domain.persistence.ThumbnailBookRepository import org.gotson.komga.interfaces.api.rest.dto.BookDto import org.gotson.komga.interfaces.api.rest.dto.SeriesDto import org.springframework.http.HttpStatus @@ -14,6 +15,7 @@ import org.springframework.web.server.ResponseStatusException class ContentRestrictionChecker( private val seriesMetadataRepository: SeriesMetadataRepository, private val bookRepository: BookRepository, + private val thumbnailBookRepository: ThumbnailBookRepository, ) { /** * Convenience function to check for content restriction. @@ -84,4 +86,26 @@ class ContentRestrictionChecker( if (!komgaUser.canAccessLibrary(series.libraryId)) throw ResponseStatusException(HttpStatus.FORBIDDEN) if (!komgaUser.isContentAllowed(series.metadata.ageRating, series.metadata.sharingLabels)) throw ResponseStatusException(HttpStatus.FORBIDDEN) } + + /** + * Convenience function to check for content restriction. + * + * @throws[ResponseStatusException] if the user cannot access the content + */ + fun checkContentRestrictionBookThumbnail( + komgaUser: KomgaUser, + thumbnailId: String, + ) { + if (!komgaUser.canAccessAllLibraries()) { + thumbnailBookRepository.getLibraryIdOrNull(thumbnailId)?.let { + if (!komgaUser.canAccessLibrary(it)) throw ResponseStatusException(HttpStatus.FORBIDDEN) + } ?: throw ResponseStatusException(HttpStatus.NOT_FOUND) + } + if (komgaUser.restrictions.isRestricted) + thumbnailBookRepository.getSeriesIdOrNull(thumbnailId)?.let { seriesId -> + seriesMetadataRepository.findById(seriesId).let { + if (!komgaUser.isContentAllowed(it.ageRating, it.sharingLabels)) throw ResponseStatusException(HttpStatus.FORBIDDEN) + } + } ?: throw ResponseStatusException(HttpStatus.NOT_FOUND) + } } diff --git a/komga/src/main/kotlin/org/gotson/komga/interfaces/api/OpdsGenerator.kt b/komga/src/main/kotlin/org/gotson/komga/interfaces/api/OpdsGenerator.kt index fae1f9dc..c5a8523c 100644 --- a/komga/src/main/kotlin/org/gotson/komga/interfaces/api/OpdsGenerator.kt +++ b/komga/src/main/kotlin/org/gotson/komga/interfaces/api/OpdsGenerator.kt @@ -92,7 +92,7 @@ class OpdsGenerator( links = listOf( WPLinkDto(rel = "help", href = "https://komga.org"), - WPLinkDto(rel = "logo", href = ServletUriComponentsBuilder.fromCurrentContextPath().path("android-chrome-512x512.png").toUriString()), + WPLinkDto(rel = "logo", href = ServletUriComponentsBuilder.fromCurrentContextPath().pathSegment("android-chrome-512x512.png").toUriString()), ), authentication = listOf( diff --git a/komga/src/main/kotlin/org/gotson/komga/interfaces/api/kobo/KoboController.kt b/komga/src/main/kotlin/org/gotson/komga/interfaces/api/kobo/KoboController.kt index 53eb11a6..b54abfe3 100644 --- a/komga/src/main/kotlin/org/gotson/komga/interfaces/api/kobo/KoboController.kt +++ b/komga/src/main/kotlin/org/gotson/komga/interfaces/api/kobo/KoboController.kt @@ -3,6 +3,7 @@ package org.gotson.komga.interfaces.api.kobo import com.fasterxml.jackson.databind.JsonNode import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.databind.node.ObjectNode +import com.fasterxml.jackson.module.kotlin.readValue import com.fasterxml.jackson.module.kotlin.treeToValue import com.github.benmanes.caffeine.cache.Caffeine import io.github.oshai.kotlinlogging.KotlinLogging @@ -174,6 +175,7 @@ class KoboController( private val imageConverter: ImageConverter, private val mediaRepository: MediaRepository, private val contentRestrictionChecker: ContentRestrictionChecker, + private val objectMapper: ObjectMapper, ) { private val cachedKepub = Caffeine @@ -230,14 +232,16 @@ class KoboController( */ @PostMapping("v1/auth/device") fun authDevice( - @RequestBody body: JsonNode, + @RequestBody rawBody: ByteArray, ): Any { try { - return koboProxy.proxyCurrentRequest(body) + return koboProxy.proxyCurrentRequest(rawBody) } catch (_: Exception) { logger.warn { "Failed to get response from Kobo /v1/auth/device, fallback to noproxy" } } + val body = objectMapper.readTree(rawBody) + /** * Komga does not use the /v1/auth/device API call for authentication/authorization. * Return dummy data to keep the device happy. @@ -512,13 +516,17 @@ class KoboController( */ @GetMapping("/v1/library/{bookId}/metadata") fun getBookMetadata( + @AuthenticationPrincipal principal: KomgaPrincipal, @PathVariable authToken: String, @PathVariable bookId: String, ): ResponseEntity<*> = - if (!bookRepository.existsById(bookId) && koboProxy.isEnabled()) + if (!bookRepository.existsById(bookId) && koboProxy.isEnabled()) { koboProxy.proxyCurrentRequest() - else + } else { + contentRestrictionChecker.checkContentRestriction(principal.user, bookId) + ResponseEntity.ok(koboDtoRepository.findBookMetadataByIds(listOf(bookId)).map { it.withDownloadUrls(getDownloadUrlBuilder(authToken)) }) + } /** * @return an array of [ReadingStateDto] @@ -535,6 +543,8 @@ class KoboController( else throw ResponseStatusException(HttpStatus.NOT_FOUND) + contentRestrictionChecker.checkContentRestriction(principal.user, book) + val response = readProgressRepository.findByBookIdAndUserIdOrNull(bookId, principal.user.id)?.toDto() ?: getEmptyReadProgressForBook(book) return ResponseEntity.ok(listOf(response)) } @@ -546,16 +556,20 @@ class KoboController( fun updateState( @AuthenticationPrincipal principal: KomgaPrincipal, @PathVariable bookId: String, - @RequestBody body: ReadingStateStateUpdateDto, + @RequestBody rawBody: ByteArray, @RequestHeader(name = X_KOBO_DEVICEID, required = false) koboDeviceId: String = "unknown", ): ResponseEntity<*> { + val body = objectMapper.readValue(rawBody) + val book = bookRepository.findByIdOrNull(bookId) ?: if (koboProxy.isEnabled()) - return koboProxy.proxyCurrentRequest(body) + return koboProxy.proxyCurrentRequest(rawBody) else throw ResponseStatusException(HttpStatus.NOT_FOUND) + contentRestrictionChecker.checkContentRestriction(principal.user, book) + val koboUpdate = body.readingStates.firstOrNull() ?: throw ResponseStatusException(HttpStatus.BAD_REQUEST) if (koboUpdate.currentBookmark.location == null || koboUpdate.currentBookmark.contentSourceProgressPercent == null) throw ResponseStatusException(HttpStatus.BAD_REQUEST) @@ -719,6 +733,8 @@ class KoboController( .location(UriComponentsBuilder.fromUriString(koboProxy.imageHostUrl).buildAndExpand(thumbnailId, width, height).toUri()) .build() } else { + contentRestrictionChecker.checkContentRestrictionBookThumbnail(principal.user, thumbnailId) + val poster = bookLifecycle.getThumbnailBytesByThumbnailId(thumbnailId) ?: throw ResponseStatusException(HttpStatus.NOT_FOUND) val posterBytes = if (poster.mediaType != ImageType.JPEG.mediaType) @@ -733,7 +749,7 @@ class KoboController( method = [RequestMethod.GET, RequestMethod.PUT, RequestMethod.POST, RequestMethod.DELETE, RequestMethod.PATCH], ) fun catchAll( - @RequestBody body: Any?, + @RequestBody body: ByteArray?, ): ResponseEntity = if (koboProxy.isEnabled()) koboProxy.proxyCurrentRequest(body) diff --git a/komga/src/main/kotlin/org/gotson/komga/interfaces/api/kosync/KoreaderSyncController.kt b/komga/src/main/kotlin/org/gotson/komga/interfaces/api/kosync/KoreaderSyncController.kt index 8057cd0e..fcec13fd 100644 --- a/komga/src/main/kotlin/org/gotson/komga/interfaces/api/kosync/KoreaderSyncController.kt +++ b/komga/src/main/kotlin/org/gotson/komga/interfaces/api/kosync/KoreaderSyncController.kt @@ -14,6 +14,7 @@ import org.gotson.komga.infrastructure.security.KomgaPrincipal import org.gotson.komga.interfaces.api.kosync.dto.DocumentProgressDto import org.gotson.komga.interfaces.api.kosync.dto.UserAuthenticationDto import org.springframework.http.HttpStatus +import org.springframework.http.MediaType import org.springframework.http.ResponseEntity import org.springframework.security.core.annotation.AuthenticationPrincipal import org.springframework.web.bind.annotation.GetMapping @@ -29,7 +30,7 @@ import java.time.ZonedDateTime private val logger = KotlinLogging.logger {} @RestController -@RequestMapping("/koreader", produces = ["application/vnd.koreader.v1+json"]) +@RequestMapping("/koreader", produces = [MediaType.APPLICATION_JSON_VALUE, "application/vnd.koreader.v1+json"]) class KoreaderSyncController( private val bookRepository: BookRepository, private val mediaRepository: MediaRepository, diff --git a/komga/src/main/kotlin/org/gotson/komga/interfaces/api/opds/v2/Opds2Controller.kt b/komga/src/main/kotlin/org/gotson/komga/interfaces/api/opds/v2/Opds2Controller.kt index f2c6140a..79af9899 100644 --- a/komga/src/main/kotlin/org/gotson/komga/interfaces/api/opds/v2/Opds2Controller.kt +++ b/komga/src/main/kotlin/org/gotson/komga/interfaces/api/opds/v2/Opds2Controller.kt @@ -435,7 +435,7 @@ class Opds2Controller( PageRequest.of(page.pageNumber, page.pageSize, Sort.by(Sort.Order.desc("lastModified"))), ).map { it.toWPLinkDto() } - val uriBuilder = uriBuilder("libraries${if (library != null) "/${library.id}" else ""}/books/latest") + val uriBuilder = uriBuilder("libraries${if (library != null) "/${library.id}" else ""}/series/latest") return FeedDto( metadata = diff --git a/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/UserController.kt b/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/UserController.kt index 06336243..1b5be42d 100644 --- a/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/UserController.kt +++ b/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/UserController.kt @@ -112,10 +112,12 @@ class UserController( restrictions = ContentRestrictions( ageRestriction = - if (ageRestriction == null || ageRestriction.restriction == AllowExcludeDto.NONE) - null - else - AgeRestriction(ageRestriction.age, ageRestriction.restriction.toDomain()), + ageRestriction.let { + if (it == null || it.restriction == AllowExcludeDto.NONE) + null + else + AgeRestriction(it.age, it.restriction.toDomain()) + }, labelsAllow = labelsAllow ?: emptySet(), labelsExclude = labelsExclude ?: emptySet(), ), diff --git a/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/dto/UserDto.kt b/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/dto/UserDto.kt index ee425a30..026f9776 100644 --- a/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/dto/UserDto.kt +++ b/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/dto/UserDto.kt @@ -1,10 +1,12 @@ package org.gotson.komga.interfaces.api.rest.dto +import com.fasterxml.jackson.annotation.JsonInclude import org.gotson.komga.domain.model.AgeRestriction import org.gotson.komga.domain.model.AllowExclude import org.gotson.komga.domain.model.KomgaUser import org.gotson.komga.infrastructure.security.KomgaPrincipal +@JsonInclude(JsonInclude.Include.NON_NULL) data class UserDto( val id: String, val email: String, diff --git a/komga/src/test/kotlin/org/gotson/komga/domain/service/BookAnalyzerTest.kt b/komga/src/test/kotlin/org/gotson/komga/domain/service/BookAnalyzerTest.kt index 24981f94..73dcf128 100644 --- a/komga/src/test/kotlin/org/gotson/komga/domain/service/BookAnalyzerTest.kt +++ b/komga/src/test/kotlin/org/gotson/komga/domain/service/BookAnalyzerTest.kt @@ -59,14 +59,21 @@ class BookAnalyzerTest( assertThat(media.pages).hasSize(3) } - @ParameterizedTest - @ValueSource( - strings = [ - "rar4-solid.rar", "rar4-encrypted.rar", - ], - ) - fun `given rar4 solid or encrypted archive when analyzing then media status is UNSUPPORTED`(fileName: String) { - val file = ClassPathResource("archives/$fileName") + @Test + fun `given rar4 solid archive when analyzing then media status is READY`() { + val file = ClassPathResource("archives/rar4-solid.rar") + val book = Book("book", file.url, LocalDateTime.now()) + + val media = bookAnalyzer.analyze(book, false) + + assertThat(media.mediaType).isEqualTo("application/x-rar-compressed; version=4") + assertThat(media.status).isEqualTo(Media.Status.READY) + assertThat(media.pages).hasSize(3) + } + + @Test + fun `given rar4 encrypted archive when analyzing then media status is UNSUPPORTED`() { + val file = ClassPathResource("archives/rar4-encrypted.rar") val book = Book("book", file.url, LocalDateTime.now()) val media = bookAnalyzer.analyze(book, false) diff --git a/komga/src/test/kotlin/org/gotson/komga/infrastructure/mediacontainer/epub/OpfTest.kt b/komga/src/test/kotlin/org/gotson/komga/infrastructure/mediacontainer/epub/OpfTest.kt index 11c0a775..91afc1cd 100644 --- a/komga/src/test/kotlin/org/gotson/komga/infrastructure/mediacontainer/epub/OpfTest.kt +++ b/komga/src/test/kotlin/org/gotson/komga/infrastructure/mediacontainer/epub/OpfTest.kt @@ -3,6 +3,7 @@ package org.gotson.komga.infrastructure.mediacontainer.epub import org.assertj.core.api.Assertions.assertThat import org.gotson.komga.domain.model.EpubTocEntry import org.jsoup.Jsoup +import org.jsoup.parser.Parser import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.ValueSource import org.springframework.core.io.ClassPathResource @@ -15,7 +16,7 @@ class OpfTest { // given val opfResource = ClassPathResource("epub/clash.opf") val opfString = opfResource.inputStream.readAllBytes().decodeToString() - val opfDoc = Jsoup.parse(opfString) + val opfDoc = Jsoup.parse(opfString, "", Parser.xmlParser()) // when val opfLandmarks = processOpfGuide(opfDoc, if (prefix.isBlank()) null else Path.of(prefix)) diff --git a/komga/src/test/kotlin/org/gotson/komga/interfaces/api/kosync/KoreaderSyncControllerTest.kt b/komga/src/test/kotlin/org/gotson/komga/interfaces/api/kosync/KoreaderSyncControllerTest.kt index a1e8521f..16011c5b 100644 --- a/komga/src/test/kotlin/org/gotson/komga/interfaces/api/kosync/KoreaderSyncControllerTest.kt +++ b/komga/src/test/kotlin/org/gotson/komga/interfaces/api/kosync/KoreaderSyncControllerTest.kt @@ -7,9 +7,13 @@ import org.gotson.komga.domain.service.KomgaUserLifecycle import org.junit.jupiter.api.AfterAll import org.junit.jupiter.api.BeforeAll import org.junit.jupiter.api.Test +import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.ValueSource import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc import org.springframework.boot.test.context.SpringBootTest +import org.springframework.http.HttpHeaders +import org.springframework.http.MediaType import org.springframework.test.web.servlet.MockMvc import org.springframework.test.web.servlet.get import org.springframework.test.web.servlet.post @@ -68,4 +72,17 @@ class KoreaderSyncControllerTest( jsonPath("authorized") { value("OK") } } } + + @ParameterizedTest + @ValueSource(strings = [MediaType.APPLICATION_JSON_VALUE, "application/vnd.koreader.v1+json"]) + fun `given accept header when calling API user then returns OK`(acceptHeader: String) { + mockMvc + .get("/koreader/users/auth") { + header("x-auth-user", apiKey) + header(HttpHeaders.ACCEPT, acceptHeader) + }.andExpect { + status { isOk() } + jsonPath("authorized") { value("OK") } + } + } } diff --git a/komga/src/test/kotlin/org/gotson/komga/interfaces/api/rest/UserControllerTest.kt b/komga/src/test/kotlin/org/gotson/komga/interfaces/api/rest/UserControllerTest.kt index 3e39faf0..55d74e1b 100644 --- a/komga/src/test/kotlin/org/gotson/komga/interfaces/api/rest/UserControllerTest.kt +++ b/komga/src/test/kotlin/org/gotson/komga/interfaces/api/rest/UserControllerTest.kt @@ -113,7 +113,7 @@ class UserControllerTest( jsonPath("$.sharedLibrariesId") { doesNotExist() } jsonPath("$.labelsAllow") { isEmpty() } jsonPath("$.labelsExclude") { isEmpty() } - jsonPath("$.ageRestriction") { isEmpty() } + jsonPath("$.ageRestriction") { doesNotExist() } } } }