diff --git a/website/app/app.vue b/website/app/app.vue
index 02d99b3..f8411e1 100644
--- a/website/app/app.vue
+++ b/website/app/app.vue
@@ -6,7 +6,7 @@
Website
- Swagger
+ Swagger
@@ -37,4 +37,5 @@
-
+
diff --git a/website/app/components/AddLibraryModal.vue b/website/app/components/AddLibraryModal.vue
index 0f40b8c..13cf3e2 100644
--- a/website/app/components/AddLibraryModal.vue
+++ b/website/app/components/AddLibraryModal.vue
@@ -15,23 +15,20 @@
diff --git a/website/app/components/ChaptersList.vue b/website/app/components/ChaptersList.vue
index 36f3140..d689e63 100644
--- a/website/app/components/ChaptersList.vue
+++ b/website/app/components/ChaptersList.vue
@@ -31,12 +31,11 @@
diff --git a/website/app/components/FileLibraries.vue b/website/app/components/FileLibraries.vue
index 0722ec3..3225532 100644
--- a/website/app/components/FileLibraries.vue
+++ b/website/app/components/FileLibraries.vue
@@ -1,8 +1,8 @@
-
+
diff --git a/website/app/components/MangaCard.vue b/website/app/components/MangaCard.vue
index eb9b28b..c74c958 100644
--- a/website/app/components/MangaCard.vue
+++ b/website/app/components/MangaCard.vue
@@ -33,10 +33,10 @@
diff --git a/website/app/components/MangaDetailPage.vue b/website/app/components/MangaDetailPage.vue
index b33ef3f..605fc66 100644
--- a/website/app/components/MangaDetailPage.vue
+++ b/website/app/components/MangaDetailPage.vue
@@ -40,8 +40,8 @@
diff --git a/website/app/composables/FetchKeys.ts b/website/app/composables/FetchKeys.ts
new file mode 100644
index 0000000..631e27a
--- /dev/null
+++ b/website/app/composables/FetchKeys.ts
@@ -0,0 +1,14 @@
+export const FetchKeys = {
+ FileLibraries: "FileLibraries",
+ Chapters: {
+ All: "Chapters",
+ },
+ Manga: {
+ All: "Manga",
+ Id: (id: string) => `Manga/${id}`,
+ },
+ MangaConnector: {
+ Id: (id: string) => `MangaConnector/${id}`,
+ All: "MangaConnector",
+ }
+}
\ No newline at end of file
diff --git a/website/app/pages/download/[mangaId].vue b/website/app/pages/download/[mangaId].vue
index 450680d..5b6e9e8 100644
--- a/website/app/pages/download/[mangaId].vue
+++ b/website/app/pages/download/[mangaId].vue
@@ -6,6 +6,7 @@
import MangaDetailPage from '~/components/MangaDetailPage.vue';
const route = useRoute();
+const mangaId = route.params.MangaId as string;
-const { data: manga } = useApi('/v2/Manga/{MangaId}', { path: { MangaId: route.params.mangaId as string } });
+const { data: manga } = await useApiData('/v2/Manga/{MangaId}', { path: { MangaId: mangaId }, key: FetchKeys.Manga.Id(mangaId) });
diff --git a/website/app/pages/index.vue b/website/app/pages/index.vue
index 624f2d0..e51e9db 100644
--- a/website/app/pages/index.vue
+++ b/website/app/pages/index.vue
@@ -13,7 +13,7 @@
diff --git a/website/app/pages/manga/[mangaId]/index.vue b/website/app/pages/manga/[mangaId]/index.vue
index 53c7735..cab8ac9 100644
--- a/website/app/pages/manga/[mangaId]/index.vue
+++ b/website/app/pages/manga/[mangaId]/index.vue
@@ -11,6 +11,7 @@
import MangaDetailPage from '~/components/MangaDetailPage.vue';
const route = useRoute();
+const mangaId = route.params.MangaId as string;
-const { data: manga } = useApi('/v2/Manga/{MangaId}', { path: { MangaId: route.params.mangaId as string } });
+const { data: manga } = await useApiData('/v2/Manga/{MangaId}', { path: { MangaId: mangaId }, key: FetchKeys.Manga.Id(mangaId) });
diff --git a/website/app/pages/manga/[mangaId]/merge/[targetId].vue b/website/app/pages/manga/[mangaId]/merge/[targetId].vue
index e8397f7..1c966b6 100644
--- a/website/app/pages/manga/[mangaId]/merge/[targetId].vue
+++ b/website/app/pages/manga/[mangaId]/merge/[targetId].vue
@@ -24,6 +24,6 @@ const route = useRoute();
const targetId = route.params.targetId as string;
const mangaId = route.params.mangaId as string;
-const { data: target } = useApi('/v2/Manga/{MangaId}', { path: { MangaId: targetId } });
-const { data: manga } = useApi('/v2/Manga/{MangaId}', { path: { MangaId: mangaId } });
+const { data: target } = await useApiData('/v2/Manga/{MangaId}', { path: { MangaId: targetId }, key: FetchKeys.Manga.Id(targetId) });
+const { data: manga } = await useApiData('/v2/Manga/{MangaId}', { path: { MangaId: mangaId }, key: FetchKeys.Manga.Id(mangaId) });
diff --git a/website/app/pages/manga/[mangaId]/merge/index.vue b/website/app/pages/manga/[mangaId]/merge/index.vue
index 1c23a75..45a8f6b 100644
--- a/website/app/pages/manga/[mangaId]/merge/index.vue
+++ b/website/app/pages/manga/[mangaId]/merge/index.vue
@@ -10,6 +10,6 @@
diff --git a/website/app/pages/search.vue b/website/app/pages/search.vue
index 6e67ca2..43be56c 100644
--- a/website/app/pages/search.vue
+++ b/website/app/pages/search.vue
@@ -46,12 +46,12 @@
diff --git a/website/nuxt.config.ts b/website/nuxt.config.ts
index 0a75ab5..af6e894 100644
--- a/website/nuxt.config.ts
+++ b/website/nuxt.config.ts
@@ -5,13 +5,15 @@ export default defineNuxtConfig({
devtools: { enabled: true },
vite: { plugins: [tailwindcss()] },
css: ['~/assets/css/main.css'],
- modules: ['@nuxt/content', '@nuxt/eslint', '@nuxt/image', '@nuxt/ui', 'nuxt-open-fetch'],
- devServer: { host: '127.0.0.1' },
- openFetch: {
- openAPITS: { exportType: false, enum: true, alphabetize: true },
- clients: {
- api: { schema: 'http://127.0.0.1:6531/swagger/v2/swagger.json', baseURL: 'http://127.0.0.1:6531/' },
- },
- },
- ssr: true,
-});
+ modules: ['@nuxt/content', '@nuxt/eslint', '@nuxt/image', '@nuxt/ui', 'nuxt-api-party'],
+ devServer: { host: '127.0.0.1' },runtimeConfig: {
+ apiParty: {
+ endpoints: {
+ api: {
+ url: 'http://127.0.0.1:6531',
+ schema: 'https://raw.githubusercontent.com/C9Glax/tranga/refs/heads/testing/API/openapi/API_v2.json',
+ }
+ }
+ }
+ }
+});
\ No newline at end of file
diff --git a/website/package-lock.json b/website/package-lock.json
index c508cb9..3955262 100644
--- a/website/package-lock.json
+++ b/website/package-lock.json
@@ -14,13 +14,15 @@
"@tailwindcss/vite": "^4.1.13",
"better-sqlite3": "^12.4.1",
"nuxt": "^4.1.2",
+ "nuxt-api-party": "^3.3.0",
"tailwindcss": "^4.1.13",
"vue": "^3.5.21",
"vue-router": "^4.5.1"
},
"devDependencies": {
+ "@iconify-json/lucide": "^1.2.68",
"eslint": "^9.36.0",
- "nuxt-open-fetch": "^0.13.5",
+ "openapi-typescript": "^7.9.1",
"prettier": "3.6.2",
"typescript": "^5.9.2"
}
@@ -175,6 +177,7 @@
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz",
"integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@babel/code-frame": "^7.27.1",
"@babel/generator": "^7.28.3",
@@ -440,6 +443,7 @@
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz",
"integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@babel/types": "^7.28.4"
},
@@ -1515,6 +1519,16 @@
"url": "https://github.com/sponsors/nzakas"
}
},
+ "node_modules/@iconify-json/lucide": {
+ "version": "1.2.68",
+ "resolved": "https://registry.npmjs.org/@iconify-json/lucide/-/lucide-1.2.68.tgz",
+ "integrity": "sha512-lR5xNJdn2CT0iR7lM25G4SewBO4G2hbr3fTWOc3AE9BspflEcneh02E3l9TBaCU/JOHozTJevWLrxBGypD7Tng==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@iconify/types": "*"
+ }
+ },
"node_modules/@iconify/collections": {
"version": "1.0.597",
"resolved": "https://registry.npmjs.org/@iconify/collections/-/collections-1.0.597.tgz",
@@ -3832,7 +3846,7 @@
"version": "8.11.3",
"resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.3.tgz",
"integrity": "sha512-4P3iZse91TkBiY+Dx5DUgxQ9GXkVJf++cmI0MOyLDxV9b5MUBI4II6ES8zA5JCbO72nKAJxWrw4PUPW+YP3ZDQ==",
- "dev": true,
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"fast-deep-equal": "^3.1.1",
@@ -3849,21 +3863,21 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true,
+ "devOptional": true,
"license": "MIT"
},
"node_modules/@redocly/config": {
"version": "0.22.2",
"resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.22.2.tgz",
"integrity": "sha512-roRDai8/zr2S9YfmzUfNhKjOF0NdcOIqF7bhf4MVC5UxpjIysDjyudvlAiVbpPHp3eDRWbdzUgtkK1a7YiDNyQ==",
- "dev": true,
+ "devOptional": true,
"license": "MIT"
},
"node_modules/@redocly/openapi-core": {
"version": "1.34.5",
"resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.34.5.tgz",
"integrity": "sha512-0EbE8LRbkogtcCXU7liAyC00n9uNG9hJ+eMyHFdUsy9lB/WGqnEBgwjA9q2cyzAVcdTkQqTBBU1XePNnN3OijA==",
- "dev": true,
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@redocly/ajv": "^8.11.2",
@@ -3885,7 +3899,7 @@
"version": "5.1.6",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
"integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
- "dev": true,
+ "devOptional": true,
"license": "ISC",
"dependencies": {
"brace-expansion": "^2.0.1"
@@ -4511,6 +4525,7 @@
"resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.4.0.tgz",
"integrity": "sha512-UG8hdElzuBDzIbjG1QDwnYH0MQ73YLXDFHgZzB4Zh/YJfnw8XNsloVtytqzx0I2Qky9THSdpTmi8Vjn/pf/Lew==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.9.0",
"@typescript-eslint/types": "^8.44.0",
@@ -4925,7 +4940,8 @@
"version": "7.0.15",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
"integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/@types/lodash": {
"version": "4.17.20",
@@ -5006,6 +5022,7 @@
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.44.1.tgz",
"integrity": "sha512-EHrrEsyhOhxYt8MTg4zTF+DJMuNBzWwgvvOYNj/zm1vnaD/IC5zCXFehZv94Piqa2cRFfXrTFxIvO95L7Qc/cw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@typescript-eslint/scope-manager": "8.44.1",
"@typescript-eslint/types": "8.44.1",
@@ -5679,6 +5696,7 @@
"resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.22.tgz",
"integrity": "sha512-tbTR1zKGce4Lj+JLzFXDq36K4vcSZbJ1RBu8FxcDv1IGRz//Dh2EBqksyGVypz3kXpshIfWKGOCcqpSbyGWRJQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@babel/parser": "^7.28.4",
"@vue/compiler-core": "3.5.22",
@@ -5849,6 +5867,7 @@
"resolved": "https://registry.npmjs.org/@vueuse/core/-/core-13.9.0.tgz",
"integrity": "sha512-ts3regBQyURfCE2BcytLqzm8+MmLlo5Ln/KLoxDVcsZ2gzIwVNnQpQOL/UKV8alUqjSZOlpFZcRNsLRqj+OzyA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@types/web-bluetooth": "^0.0.21",
"@vueuse/metadata": "13.9.0",
@@ -5980,6 +5999,7 @@
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
"license": "MIT",
+ "peer": true,
"bin": {
"acorn": "bin/acorn"
},
@@ -6058,7 +6078,7 @@
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
"integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
- "dev": true,
+ "devOptional": true,
"license": "MIT",
"engines": {
"node": ">=6"
@@ -6312,7 +6332,8 @@
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.7.0.tgz",
"integrity": "sha512-b3N5eTW1g7vXkw+0CXh/HazGTcO5KYuu/RCNaJbDMPI6LHDi+7qe8EmxKUVe1sUbY2KZOVZFyj62x0OEz9qyAA==",
- "license": "Apache-2.0"
+ "license": "Apache-2.0",
+ "peer": true
},
"node_modules/bare-fs": {
"version": "4.4.4",
@@ -6426,6 +6447,7 @@
"integrity": "sha512-3yVdyZhklTiNrtg+4WqHpJpFDd+WHTg2oM7UcR80GqL05AOV0xEJzc6qNvFYoEtE+hRp1n9MpN6/+4yhlGkDXQ==",
"hasInstallScript": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"bindings": "^1.5.0",
"prebuild-install": "^7.1.1"
@@ -6588,6 +6610,7 @@
}
],
"license": "MIT",
+ "peer": true,
"dependencies": {
"baseline-browser-mapping": "^2.8.3",
"caniuse-lite": "^1.0.30001741",
@@ -7125,7 +7148,7 @@
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz",
"integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==",
- "dev": true,
+ "devOptional": true,
"license": "MIT"
},
"node_modules/colortranslator": {
@@ -7903,7 +7926,8 @@
"version": "8.6.0",
"resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.6.0.tgz",
"integrity": "sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/embla-carousel-auto-height": {
"version": "8.6.0",
@@ -8139,6 +8163,7 @@
"integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==",
"hasInstallScript": true,
"license": "MIT",
+ "peer": true,
"bin": {
"esbuild": "bin/esbuild"
},
@@ -8206,6 +8231,7 @@
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.36.0.tgz",
"integrity": "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.8.0",
"@eslint-community/regexpp": "^4.12.1",
@@ -9187,6 +9213,7 @@
"resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.1.0.tgz",
"integrity": "sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==",
"license": "Apache-2.0",
+ "peer": true,
"engines": {
"node": ">=10"
}
@@ -9977,7 +10004,7 @@
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.2.0.tgz",
"integrity": "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==",
- "dev": true,
+ "devOptional": true,
"license": "MIT",
"engines": {
"node": ">=18"
@@ -10464,7 +10491,7 @@
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz",
"integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==",
- "dev": true,
+ "devOptional": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
@@ -12603,6 +12630,33 @@
}
}
},
+ "node_modules/nuxt-api-party": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/nuxt-api-party/-/nuxt-api-party-3.3.0.tgz",
+ "integrity": "sha512-amN5tKiL4ZeV2V99PTp220+YjyIeaqw8yYh9YI/I9L7WbCcDrk7NVFCPp+QhNBXAZoneMp5Tqv6wr8J+FpAfBQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@nuxt/kit": "^4.1.2",
+ "chokidar": "^4.0.3",
+ "defu": "^6.1.4",
+ "h3": "^1.15.4",
+ "jiti": "^2.5.1",
+ "ofetch": "^1.4.1",
+ "ohash": "^2.0.11",
+ "openapi-typescript-helpers": "0.0.13",
+ "pathe": "^2.0.3",
+ "scule": "^1.3.0",
+ "ufo": "^1.6.1"
+ },
+ "peerDependencies": {
+ "openapi-typescript": "^5 || ^6 || ^7"
+ },
+ "peerDependenciesMeta": {
+ "openapi-typescript": {
+ "optional": true
+ }
+ }
+ },
"node_modules/nuxt-component-meta": {
"version": "0.14.0",
"resolved": "https://registry.npmjs.org/nuxt-component-meta/-/nuxt-component-meta-0.14.0.tgz",
@@ -12623,21 +12677,6 @@
"nuxt-component-meta": "bin/nuxt-component-meta.mjs"
}
},
- "node_modules/nuxt-open-fetch": {
- "version": "0.13.5",
- "resolved": "https://registry.npmjs.org/nuxt-open-fetch/-/nuxt-open-fetch-0.13.5.tgz",
- "integrity": "sha512-84fw/zZr97J0JgN7uWMMSW/VnHxYV4XUI4bDTQrT4ivvCDT+lPCsuyYJeu2s52YlmpbVDXWpXGBhf9FQZmQzTA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@nuxt/kit": "^4.0.0",
- "defu": "^6.1.4",
- "ohash": "^2.0.11",
- "openapi-typescript": "^7.8.0",
- "openapi-typescript-helpers": "^0.0.15",
- "scule": "^1.3.0"
- }
- },
"node_modules/nypm": {
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.2.tgz",
@@ -12787,8 +12826,9 @@
"version": "7.9.1",
"resolved": "https://registry.npmjs.org/openapi-typescript/-/openapi-typescript-7.9.1.tgz",
"integrity": "sha512-9gJtoY04mk6iPMbToPjPxEAtfXZ0dTsMZtsgUI8YZta0btPPig9DJFP4jlerQD/7QOwYgb0tl+zLUpDf7vb7VA==",
- "dev": true,
+ "devOptional": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"@redocly/openapi-core": "^1.34.5",
"ansi-colors": "^4.1.3",
@@ -12805,10 +12845,9 @@
}
},
"node_modules/openapi-typescript-helpers": {
- "version": "0.0.15",
- "resolved": "https://registry.npmjs.org/openapi-typescript-helpers/-/openapi-typescript-helpers-0.0.15.tgz",
- "integrity": "sha512-opyTPaunsklCBpTK8JGef6mfPhLSnyy5a0IN9vKtx3+4aExf+KxEqYwIy3hqkedXIB97u357uLMJsOnm3GVjsw==",
- "dev": true,
+ "version": "0.0.13",
+ "resolved": "https://registry.npmjs.org/openapi-typescript-helpers/-/openapi-typescript-helpers-0.0.13.tgz",
+ "integrity": "sha512-z44WK2e7ygW3aUtAtiurfEACohf/Qt9g6BsejmIYgEoY4REHeRzgFJmO3ium0libsuzPc145I+8lE9aiiZrQvQ==",
"license": "MIT"
},
"node_modules/optionator": {
@@ -12816,6 +12855,7 @@
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
"integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"deep-is": "^0.1.3",
"fast-levenshtein": "^2.0.6",
@@ -12862,6 +12902,7 @@
"resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.87.0.tgz",
"integrity": "sha512-uc47XrtHwkBoES4HFgwgfH9sqwAtJXgAIBq4fFBMZ4hWmgVZoExyn+L4g4VuaecVKXkz1bvlaHcfwHAJPQb5Gw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@oxc-project/types": "^0.87.0"
},
@@ -13028,7 +13069,7 @@
"version": "8.3.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz",
"integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==",
- "dev": true,
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.26.2",
@@ -13236,6 +13277,7 @@
}
],
"license": "MIT",
+ "peer": true,
"dependencies": {
"nanoid": "^3.3.11",
"picocolors": "^1.1.1",
@@ -14416,7 +14458,7 @@
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
"integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
- "dev": true,
+ "devOptional": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
@@ -15401,6 +15443,7 @@
"resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.3.1.tgz",
"integrity": "sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==",
"license": "MIT",
+ "peer": true,
"funding": {
"type": "github",
"url": "https://github.com/sponsors/dcastil"
@@ -15429,7 +15472,8 @@
"version": "4.1.13",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.13.tgz",
"integrity": "sha512-i+zidfmTqtwquj4hMEwdjshYYgMbOrPzb9a0M3ZgNa0JMoZeFC6bxZvO8yr8ozS6ix2SDz0+mvryPeBs2TFE+w==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/tapable": {
"version": "2.2.3",
@@ -15500,6 +15544,7 @@
"resolved": "https://registry.npmjs.org/terser/-/terser-5.44.0.tgz",
"integrity": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==",
"license": "BSD-2-Clause",
+ "peer": true,
"dependencies": {
"@jridgewell/source-map": "^0.3.3",
"acorn": "^8.15.0",
@@ -15693,6 +15738,7 @@
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz",
"integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==",
"license": "Apache-2.0",
+ "peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -16179,6 +16225,7 @@
"integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==",
"hasInstallScript": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"napi-postinstall": "^0.3.0"
},
@@ -16408,7 +16455,7 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/uri-js-replace/-/uri-js-replace-1.0.1.tgz",
"integrity": "sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==",
- "dev": true,
+ "devOptional": true,
"license": "MIT"
},
"node_modules/util-deprecate": {
@@ -16572,6 +16619,7 @@
"resolved": "https://registry.npmjs.org/vite/-/vite-7.1.7.tgz",
"integrity": "sha512-VbA8ScMvAISJNJVbRDTJdCwqQoAareR/wutevKanhR2/1EkoXVZVkkORaYm/tNVCjP/UDTKtcw3bAkwOUdedmA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"esbuild": "^0.25.0",
"fdir": "^6.5.0",
@@ -16888,6 +16936,7 @@
"resolved": "https://registry.npmjs.org/vue/-/vue-3.5.22.tgz",
"integrity": "sha512-toaZjQ3a/G/mYaLSbV+QsQhIdMo9x5rrqIpYRObsJ6T/J+RyCSFwN2LHNVH9v8uIcljDNa3QzPVdv3Y6b9hAJQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@vue/compiler-dom": "3.5.22",
"@vue/compiler-sfc": "3.5.22",
@@ -16945,6 +16994,7 @@
"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-10.2.0.tgz",
"integrity": "sha512-CydUvFOQKD928UzZhTp4pr2vWz1L+H99t7Pkln2QSPdvmURT0MoC4wUccfCnuEaihNsu9aYYyk+bep8rlfkUXw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"debug": "^4.4.0",
"eslint-scope": "^8.2.0",
@@ -16968,6 +17018,7 @@
"resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.5.1.tgz",
"integrity": "sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@vue/devtools-api": "^6.6.4"
},
@@ -17248,7 +17299,7 @@
"version": "0.0.43",
"resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz",
"integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==",
- "dev": true,
+ "devOptional": true,
"license": "Apache-2.0"
},
"node_modules/yargs": {
@@ -17373,6 +17424,7 @@
"resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
"integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
"license": "MIT",
+ "peer": true,
"funding": {
"url": "https://github.com/sponsors/colinhacks"
}
diff --git a/website/package.json b/website/package.json
index 93db236..339b78e 100644
--- a/website/package.json
+++ b/website/package.json
@@ -20,13 +20,15 @@
"@tailwindcss/vite": "^4.1.13",
"better-sqlite3": "^12.4.1",
"nuxt": "^4.1.2",
+ "nuxt-api-party": "^3.3.0",
"tailwindcss": "^4.1.13",
"vue": "^3.5.21",
"vue-router": "^4.5.1"
},
"devDependencies": {
+ "@iconify-json/lucide": "^1.2.68",
"eslint": "^9.36.0",
- "nuxt-open-fetch": "^0.13.5",
+ "openapi-typescript": "^7.9.1",
"prettier": "3.6.2",
"typescript": "^5.9.2"
}
diff --git a/website/tsconfig.json b/website/tsconfig.json
index 561965c..c558547 100644
--- a/website/tsconfig.json
+++ b/website/tsconfig.json
@@ -8,5 +8,5 @@
{ "path": "./.nuxt/tsconfig.node.json" }
],
"compileOnSave": true,
- "compilerOptions": { "noUncheckedIndexedAccess": true, "module": "NodeNext", "moduleResolution": "NodeNext" }
+ "compilerOptions": { "noUncheckedIndexedAccess": true, "module": "ESNext", "moduleResolution": "Bundler" }
}