diff --git a/next-ui/eslint.config.ts b/next-ui/eslint.config.ts index 0dc7ba3ab..bb5b276d1 100644 --- a/next-ui/eslint.config.ts +++ b/next-ui/eslint.config.ts @@ -22,6 +22,7 @@ export default defineConfigWithVueTs( '**/dist/**', '**/dist-ssr/**', '**/coverage/**', + '**/storybook-static/**', 'openapi-generator.mts', '**/generated/openapi/komga.d.ts', 'public-msw/**/*', diff --git a/next-ui/package-lock.json b/next-ui/package-lock.json index fe0bf073e..bd4457d87 100644 --- a/next-ui/package-lock.json +++ b/next-ui/package-lock.json @@ -25,7 +25,6 @@ "@eslint/js": "^9.29.0", "@formatjs/cli": "^6.7.2", "@iconify-json/mdi": "^1.2.3", - "@mswjs/source": "^0.4.1", "@storybook/addon-a11y": "^9.0.13", "@storybook/addon-docs": "^9.0.13", "@storybook/addon-themes": "^9.0.13", @@ -1051,23 +1050,6 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@faker-js/faker": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-8.4.1.tgz", - "integrity": "sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/fakerjs" - } - ], - "license": "MIT", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=6.14.13" - } - }, "node_modules/@formatjs/cli": { "version": "6.7.2", "resolved": "https://registry.npmjs.org/@formatjs/cli/-/cli-6.7.2.tgz", @@ -1612,26 +1594,6 @@ "node": ">=18" } }, - "node_modules/@mswjs/source": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@mswjs/source/-/source-0.4.1.tgz", - "integrity": "sha512-sUaUz5OaMgsFm9KERnIP/bZY/6kLb1DJS9qPPw28oAndaESZCjr7Fmob7wYUluTokQDBTQeY2bXrUQ9FK/6fxQ==", - "dev": true, - "dependencies": { - "@stoplight/json": "^3.21.7", - "@types/har-format": "^1.2.16", - "@yellow-ticket/seed-json-schema": "^0.1.6", - "openapi-types": "^12.1.3", - "outvariant": "^1.4.3", - "yaml": "^2.8.0" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "msw": "^2.10.0" - } - }, "node_modules/@neoconfetti/react": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@neoconfetti/react/-/react-1.0.0.tgz", @@ -2478,58 +2440,6 @@ "win32" ] }, - "node_modules/@stoplight/json": { - "version": "3.21.7", - "resolved": "https://registry.npmjs.org/@stoplight/json/-/json-3.21.7.tgz", - "integrity": "sha512-xcJXgKFqv/uCEgtGlPxy3tPA+4I+ZI4vAuMJ885+ThkTHFVkC+0Fm58lA9NlsyjnkpxFh4YiQWpH+KefHdbA0A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@stoplight/ordered-object-literal": "^1.0.3", - "@stoplight/path": "^1.3.2", - "@stoplight/types": "^13.6.0", - "jsonc-parser": "~2.2.1", - "lodash": "^4.17.21", - "safe-stable-stringify": "^1.1" - }, - "engines": { - "node": ">=8.3.0" - } - }, - "node_modules/@stoplight/ordered-object-literal": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@stoplight/ordered-object-literal/-/ordered-object-literal-1.0.5.tgz", - "integrity": "sha512-COTiuCU5bgMUtbIFBuyyh2/yVVzlr5Om0v5utQDgBCuQUOPgU1DwoffkTfg4UBQOvByi5foF4w4T+H9CoRe5wg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/@stoplight/path": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@stoplight/path/-/path-1.3.2.tgz", - "integrity": "sha512-lyIc6JUlUA8Ve5ELywPC8I2Sdnh1zc1zmbYgVarhXIp9YeAB0ReeqmGEOWNtlHkbP2DAA1AL65Wfn2ncjK/jtQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/@stoplight/types": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-13.20.0.tgz", - "integrity": "sha512-2FNTv05If7ib79VPDA/r9eUet76jewXFH2y2K5vuge6SXbRHtWBhcaRmu+6QpF4/WRNoJj5XYRSwLGXDxysBGA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.4", - "utility-types": "^3.10.0" - }, - "engines": { - "node": "^12.20 || >=14.13" - } - }, "node_modules/@storybook/addon-a11y": { "version": "9.0.13", "resolved": "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-9.0.13.tgz", @@ -2927,13 +2837,6 @@ "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", "license": "MIT" }, - "node_modules/@types/har-format": { - "version": "1.2.16", - "resolved": "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.16.tgz", - "integrity": "sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -4369,19 +4272,6 @@ "vue": "^3.5.0" } }, - "node_modules/@yellow-ticket/seed-json-schema": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@yellow-ticket/seed-json-schema/-/seed-json-schema-0.1.6.tgz", - "integrity": "sha512-RtI85ohEQpARt8qRLeqglOpPFu/00YGmw3Mi7iNphbjoDCwm4QrZWnVBy9uEn2veUC6fuw0GHjHAFzAfJxaEZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@faker-js/faker": "^8.4.1", - "@types/json-schema": "^7.0.15", - "outvariant": "^1.4.2", - "randexp": "^0.5.3" - } - }, "node_modules/abbrev": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", @@ -5435,16 +5325,6 @@ "url": "https://dotenvx.com" } }, - "node_modules/drange": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/drange/-/drange-1.1.1.tgz", - "integrity": "sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -7430,13 +7310,6 @@ "node": ">=6" } }, - "node_modules/jsonc-parser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.2.1.tgz", - "integrity": "sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w==", - "dev": true, - "license": "MIT" - }, "node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -8207,13 +8080,6 @@ "msw": "^2.7.0" } }, - "node_modules/openapi-types": { - "version": "12.1.3", - "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", - "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", - "dev": true, - "license": "MIT" - }, "node_modules/openapi-typescript": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/openapi-typescript/-/openapi-typescript-7.8.0.tgz", @@ -8963,20 +8829,6 @@ ], "license": "MIT" }, - "node_modules/randexp": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.5.3.tgz", - "integrity": "sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w==", - "dev": true, - "license": "MIT", - "dependencies": { - "drange": "^1.0.2", - "ret": "^0.2.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/rc9": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", @@ -9154,16 +9006,6 @@ "node": ">=4" } }, - "node_modules/ret": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", - "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/reusify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", @@ -9282,13 +9124,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-stable-stringify": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz", - "integrity": "sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw==", - "dev": true, - "license": "MIT" - }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -10976,16 +10811,6 @@ "dev": true, "license": "MIT" }, - "node_modules/utility-types": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", - "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/varint": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", diff --git a/next-ui/package.json b/next-ui/package.json index ed6602ff8..756511c33 100644 --- a/next-ui/package.json +++ b/next-ui/package.json @@ -42,7 +42,6 @@ "@eslint/js": "^9.29.0", "@formatjs/cli": "^6.7.2", "@iconify-json/mdi": "^1.2.3", - "@mswjs/source": "^0.4.1", "@storybook/addon-a11y": "^9.0.13", "@storybook/addon-docs": "^9.0.13", "@storybook/addon-themes": "^9.0.13", diff --git a/next-ui/src/mocks/api/handlers.ts b/next-ui/src/mocks/api/handlers.ts index 0b5f388d5..fef75708e 100644 --- a/next-ui/src/mocks/api/handlers.ts +++ b/next-ui/src/mocks/api/handlers.ts @@ -1,17 +1,9 @@ +import { actuatorHandlers } from '@/mocks/api/handlers/actuator' import { announcementHandlers } from '@/mocks/api/handlers/announcements' import { releasesHandlers } from '@/mocks/api/handlers/releases' -import { fromOpenApi } from '@mswjs/source/open-api' -import type { OpenAPIV3 } from 'openapi-types' -import spec from '../../../../komga/docs/openapi.json' import { HttpResponse } from 'msw' -const doc = { - basePath: import.meta.env.VITE_KOMGA_API_URL, - ...spec, -} as unknown as OpenAPIV3.Document - -// manually defined handlers need to be before fromOpenApi -export const handlers = [...announcementHandlers, ...releasesHandlers, ...(await fromOpenApi(doc))] +export const handlers = [...actuatorHandlers, ...announcementHandlers, ...releasesHandlers] export const response401Unauthorized = () => HttpResponse.json({ error: 'Unauthorized' }, { status: 401 }) diff --git a/next-ui/src/mocks/api/handlers/actuator.ts b/next-ui/src/mocks/api/handlers/actuator.ts new file mode 100644 index 000000000..d1b6e262e --- /dev/null +++ b/next-ui/src/mocks/api/handlers/actuator.ts @@ -0,0 +1,42 @@ +import { httpTyped } from '@/mocks/api/httpTyped' + +export const actuatorInfo = { + git: { + branch: 'master', + commit: { + id: '9be980d', + time: '2025-03-12T03:40:38Z', + }, + }, + build: { + artifact: 'komga', + name: 'komga', + version: '1.21.2', + group: 'komga', + }, + java: { + version: '23.0.2', + vendor: { + name: 'Eclipse Adoptium', + version: 'Temurin-23.0.2+7', + }, + runtime: { + name: 'OpenJDK Runtime Environment', + version: '23.0.2+7', + }, + jvm: { + name: 'OpenJDK 64-Bit Server VM', + vendor: 'Eclipse Adoptium', + version: '23.0.2+7', + }, + }, + os: { + name: 'Linux', + version: '6.8.0-57-generic', + arch: 'amd64', + }, +} + +export const actuatorHandlers = [ + httpTyped.get('/actuator/info', ({ response }) => response(200).json(actuatorInfo as never)), +] diff --git a/next-ui/src/mocks/api/handlers/announcements.ts b/next-ui/src/mocks/api/handlers/announcements.ts index deeeb40ed..53a6ca239 100644 --- a/next-ui/src/mocks/api/handlers/announcements.ts +++ b/next-ui/src/mocks/api/handlers/announcements.ts @@ -1,5 +1,46 @@ import { httpTyped } from '@/mocks/api/httpTyped' +export const announcementsMixedRead = { + version: 'https://jsonfeed.org/version/1', + title: 'Announcements', + home_page_url: 'https://komga.org/blog', + description: 'Latest Komga announcements', + items: [ + { + id: 'https://komga.org/blog/ebook-drop2', + url: 'https://komga.org/blog/ebook-drop2', + title: 'eBook drop 2', + summary: 'Version 1.9.0 contains the second feature drop for Ebooks support.', + content_html: '
A longer text…
', + date_modified: new Date('2023-12-15T00:00:00Z'), + author: { + name: 'gotson', + url: 'https://github.com/gotson', + }, + tags: ['upgrade', 'komga'], + _komga: { + read: false, + }, + }, + { + id: 'https://komga.org/blog/ebook-support', + url: 'https://komga.org/blog/ebook-support', + title: 'eBook support', + summary: 'Version 1.8.0 is bringing a long awaited feature: proper eBook support!', + content_html: 'A longer text…
', + date_modified: new Date('2023-11-29T00:00:00Z'), + author: { + name: 'gotson', + url: 'https://github.com/gotson', + }, + tags: ['upgrade', 'komga'], + _komga: { + read: true, + }, + }, + ], +} + export const announcementsAllRead = { version: 'https://jsonfeed.org/version/1', title: 'Announcements', @@ -42,5 +83,8 @@ export const announcementsAllRead = { } export const announcementHandlers = [ + httpTyped.get('/api/v1/announcements', ({ response }) => + response(200).json(announcementsMixedRead), + ), httpTyped.put('/api/v1/announcements', ({ response }) => response(204).empty()), ]