Use nuxtaptparty insstead of openfetch

This commit is contained in:
2025-09-28 19:33:55 +02:00
parent a7d281e300
commit 93c9b0b365
20 changed files with 176 additions and 112 deletions

View File

@@ -6,7 +6,7 @@
<NuxtLink to="https://github.com/C9Glax/tranga-website"
><Icon name="i-lucide-github" />Website</NuxtLink
>
<NuxtLink to=""><Icon name="i-lucide-book-open" />Swagger</NuxtLink>
<NuxtLink :to="`${$config.public.apiParty.endpoints.api?.url}swagger`"><Icon name="i-lucide-book-open" />Swagger</NuxtLink>
</template>
<template #default>
<NuxtLink to="/">
@@ -37,4 +37,5 @@
</UMain>
</UApp>
</template>
<script setup lang="ts"></script>
<script setup lang="ts">
</script>

View File

@@ -15,23 +15,20 @@
</template>
<script setup lang="ts">
import type { components } from '#open-fetch-schemas/api';
import type { ApiModel } from '#nuxt-api-party';
const name = ref('');
const path = ref('');
const model = computed((): components['schemas']['CreateLibraryRecord'] => {
const model = computed((): ApiModel<'CreateLibraryRecord'> => {
return { basePath: path.value, libraryName: name.value };
});
const config = useRuntimeConfig();
const busy = ref(false);
const onAddClick = () => {
const onAddClick = async () => {
busy.value = true;
$fetch(new Request(`${config.public.openFetch.api.baseURL}v2/FileLibrary`), { method: 'PUT', body: model.value })
.then(() => emit('change'))
await $api('/v2/FileLibrary', { method: 'PUT', body: model.value })
.then(() => refreshNuxtData(Keys.FileLibraries))
.finally(() => (busy.value = false));
};
const emit = defineEmits(['change']);
</script>

View File

@@ -31,12 +31,11 @@
</template>
<script setup lang="ts">
import { id } from '#ui/locale';
export interface ChaptersListProps {
mangaId: string;
}
const props = defineProps<ChaptersListProps>();
const { data: chapters } = useApi('/v2/Manga/{MangaId}/Chapters', { path: { MangaId: props.mangaId } });
const { data: chapters } = await useApiData('/v2/Manga/{MangaId}/Chapters', { path: { MangaId: props.mangaId }, key: FetchKeys.Chapters.All });
</script>

View File

@@ -1,8 +1,8 @@
<template>
<UPageList divide>
<UPageList class="gap-2">
<UPageCard
v-for="l in fileLibraries"
variant="ghost"
variant="soft"
icon="i-lucide-library-big"
:title="l.libraryName"
:description="l.basePath"
@@ -13,19 +13,15 @@
</template>
<script setup lang="ts">
import type { components } from '#open-fetch-schemas/api';
type FileLibrary = components['schemas']['FileLibrary'];
const { data: fileLibraries, refresh } = useApi('/v2/FileLibrary');
import type { ApiModel } from '#nuxt-api-party'
type FileLibrary = ApiModel<"FileLibrary">;
const { data: fileLibraries } = await useApiData('/v2/FileLibrary', { key: FetchKeys.FileLibraries });
const config = useRuntimeConfig();
const busy = ref(false);
const deleteLibrary = (l: FileLibrary) => {
const deleteLibrary = async (l: FileLibrary) => {
busy.value = true;
$fetch(new Request(`${config.public.openFetch.api.baseURL}v2/FileLibrary/${l.key}`), { method: 'DELETE' }).finally(
() => {
refresh();
busy.value = false;
}
);
await $api('/v2/FileLibrary/{FileLibraryId}', { path: { FileLibraryId: l.key }, method: 'DELETE' })
.then(() => refreshNuxtData(FetchKeys.FileLibraries))
.finally(() => busy.value = false)
};
</script>

View File

@@ -33,10 +33,10 @@
</template>
<script setup lang="ts">
import type { components } from '#open-fetch-schemas/api';
import type { ApiModel } from '#nuxt-api-party'
import type { PageCardProps } from '#ui/components/PageCard.vue';
type Manga = components['schemas']['Manga'];
type MinimalManga = components['schemas']['MinimalManga'];
type Manga = ApiModel<'Manga'>;
type MinimalManga = ApiModel<'MinimalManga'>;
defineProps<MangaCardProps>();
defineEmits(['click']);

View File

@@ -12,14 +12,14 @@
<p class="p-3 text-xl font-semibold max-h-full overflow-clip">{{ manga?.name }}</p>
</div>
<LazyNuxtImg
:src="`${$config.public.openFetch.api.baseURL}v2/Manga/${manga.key}/Cover/Medium`"
:src="`${$config.public.apiParty.endpoints.Api!.url}v2/Manga/${manga.key}/Cover/Medium`"
class="w-full h-full object-cover" />
</div>
</template>
<script setup lang="ts">
import type { components } from '#open-fetch-schemas/api';
type MinimalManga = components['schemas']['MinimalManga'];
type Manga = components['schemas']['Manga'];
import type { ApiModel } from '#nuxt-api-party'
type MinimalManga = ApiModel<'MinimalManga'>;
type Manga = ApiModel<'Manga'>;
defineProps<{ manga: Manga | MinimalManga; blur?: boolean }>();
</script>

View File

@@ -40,8 +40,8 @@
</template>
<script setup lang="ts">
import type { components } from '#open-fetch-schemas/api';
type Manga = components['schemas']['Manga'];
import type { ApiModel } from '#nuxt-api-party'
type Manga = ApiModel<'Manga'>;
export interface MangaDetailPageProps {
manga?: Manga;

View File

@@ -14,12 +14,12 @@
</template>
<script setup lang="ts">
import type { components } from '#open-fetch-schemas/api';
type MangaConnectorId = components['schemas']['MangaConnectorId'];
import type { ApiModel } from '#nuxt-api-party'
type MangaConnectorId = /* @vue-ignore */ ApiModel<'MangaConnectorId'>;
const props = defineProps<MangaConnectorId>();
const { data: mangaConnector } = useApi('/v2/MangaConnector/{MangaConnectorName}', {
path: { MangaConnectorName: props.mangaConnectorName },
const { data: mangaConnector } = await useApiData('/v2/MangaConnector/{MangaConnectorName}', {
path: { MangaConnectorName: props.mangaConnectorName }, key: FetchKeys.MangaConnector.Id(props.mangaConnectorName),
});
</script>

View File

@@ -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",
}
}

View File

@@ -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) });
</script>

View File

@@ -13,7 +13,7 @@
</template>
<script setup lang="ts">
const { data: manga } = useApi('/v2/Manga');
const { data: manga } = await useApiData('/v2/Manga', { key: FetchKeys.Manga.All });
const expanded = ref(-1);
</script>

View File

@@ -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) });
</script>

View File

@@ -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) });
</script>

View File

@@ -10,6 +10,6 @@
<script setup lang="ts">
const route = useRoute();
const { data: manga } = useApi('/v2/Manga/{MangaId}', { path: { MangaId: route.params.mangaId as string } });
const { data: mangas } = useApi('/v2/Manga');
const { data: manga } = await useApiData('/v2/Manga/{MangaId}', { path: { MangaId: route.params.mangaId as string }, key: FetchKeys.Manga.Id(mangaId) });
const { data: mangas } = await useApiData('/v2/Manga', { key: FetchKeys.Manga.All });
</script>

View File

@@ -46,12 +46,12 @@
</template>
<script setup lang="ts">
import type { components } from '#open-fetch-schemas/api';
import {$api, type ApiModel} from '#nuxt-api-party'
import type { StepperItem } from '@nuxt/ui';
type MangaConnector = components['schemas']['MangaConnector'];
type MinimalManga = components['schemas']['MinimalManga'];
type MangaConnector = ApiModel<"MangaConnector">;
type MinimalManga = ApiModel<'MinimalManga'>;
const { data: connectors } = useApi('/v2/MangaConnector');
const { data: connectors } = await useApiData('/v2/MangaConnector', { FetchKeys: FetchKeys.MangaConnector.All });
const query = ref<string>();
const connector = useState<MangaConnector>();
@@ -95,14 +95,10 @@ const config = useRuntimeConfig();
const search = async (query: string): Promise<MinimalManga[]> => {
if (isUrl(query)) {
return await $fetch<MinimalManga>(new Request(`${config.public.openFetch.api.baseURL}v2/Search/Url`), {
method: 'POST',
body: JSON.stringify(query),
}).then((x) => [x]);
return await $api<'/v2/Search/Url', MinimalManga>('/v2/Search/Url', { body: JSON.stringify(query), method: "POST" })
.then((x) => [x]);
} else if (connector.value) {
return await $fetch<MinimalManga[]>(
new Request(`${config.public.openFetch.api.baseURL}v2/Search/${connector.value.name}/${query}`)
);
return await $api('/v2/Search/{MangaConnectorName}/{Query}', { path: { MangaConnectorName: connector.value.name, query: query }, method: "POST" });
}
return Promise.reject();
};

View File

@@ -1,8 +1,10 @@
<template>
<UPageSection title="Settings" />
<UPageSection title="Libraries" orientation="horizontal">
<FileLibraries />
<template #footer>
<UButton icon="i-lucide-plus" class="w-fit" @click="() => addLibraryModal.open()">Add</UButton>
</template>
<FileLibraries />
</UPageSection>
<UPageSection title="Maintenance" orientation="horizontal">
<div class="flex flex-col gap-1 items-end basis-1">
@@ -17,16 +19,17 @@
import { LazyAddLibraryModal } from '#components';
import FileLibraries from '~/components/FileLibraries.vue';
import {refreshNuxtData} from "#app";
const overlay = useOverlay();
const config = useRuntimeConfig();
const addLibraryModal = overlay.create(LazyAddLibraryModal);
const cleanUpDatabaseBusy = ref(false);
const cleanUpDatabase = () => {
const cleanUpDatabase = async () => {
cleanUpDatabaseBusy.value = true;
$fetch(`${config.public.openFetch.api.baseURL}v2/Maintenance/CleanupNoDownloadManga`).finally(
() => (cleanUpDatabaseBusy.value = false)
);
await $api('/v2/Maintenance/CleanupNoDownloadManga', { method: 'POST' })
.then(() => refreshNuxtData(Keys.Manga.All))
.finally(() => cleanUpDatabaseBusy.value = false);
};
</script>

View File

@@ -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',
}
}
}
}
});

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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" }
}