@ageup/core
v0.0.4
Published
Type-safe API router utilities for TanStack Query with ASP.NET-compatible FormData conversion.
Maintainers
Readme
@ageup/core
Type-safe API-Router für TanStack Query mit automatischem Axios-Unwrap und ASP.NET-kompatiblem FormData-Converter.
Installation
npm install @ageup/core @tanstack/react-query axiosQuick Start
Router definieren
import axios from 'axios';
import { createRouter, mutation, query } from '@ageup/core';
type User = { email: string };
const userRouter = createRouter({
getById: query((id: number) => axios.get<User>(`/api/v1/users/${id}`)),
create: mutation((body: { name: string }) =>
axios.post<User>(`/api/v1/users`, body),
),
});query()– für GET-Requests (wird als Funktion aufgerufen)mutation()– für POST/PUT/PATCH/DELETE- Axios-Responses werden automatisch zu
res.dataunwrapped
API erstellen
import { createApi } from '@ageup/core';
const mainRouter = createRouter({ user: userRouter });
export const { api, invalidate, queryClient } = createApi(mainRouter);In React nutzen
import {
QueryClientProvider,
useMutation,
useQuery,
} from '@tanstack/react-query';
import { api, invalidate, queryClient } from './api';
function UserPage() {
const { data } = useQuery(api.user.getById(1));
const { mutate } = useMutation(api.user.create);
mutate(
{ name: 'Max' },
{
onSuccess: async () => {
await invalidate(api.user.getById(1));
await invalidate.user.getById(1);
},
},
);
return <div>{data?.email}</div>;
}
function App() {
return (
<QueryClientProvider client={queryClient}>
<UserPage />
</QueryClientProvider>
);
}FormData (ASP.NET)
Für [FromForm]-Endpoints (z.B. multipart/form-data):
import { mutation, toFormData } from "@ageup/core";
updateHeader: mutation(({ id, body }) =>
axios.putForm(`/api/events/${id}/header`, toFormData(body)),
),toFormData konvertiert ein Plain-Object in ASP.NET-kompatibles FormData:
| Regel | Beispiel |
| ------------------------------------- | ------------------------------- |
| camelCase → PascalCase | headerLogo → HeaderLogo |
| Dictionary (Standard: translations) | Translations[en].HeroHeadline |
| Nested Objects | Address.Street |
| Files/Blobs | direkt anhängen |
| Arrays | Items[0], Items[1] |
Standard-Dictionary-Key ist translations. Andere Keys optional:
toFormData(payload, { dictionaryKeys: ['items', 'metadata'] });
toFormData(payload, { dictionaryKeys: [] }); // nur Dot-NotationAPI
| Export | Beschreibung |
| -------------- | ------------------------------------------------------------ |
| createRouter | Definiert verschachtelte Router-Struktur |
| createApi | Erzeugt typisierte api-Refs + invalidate + QueryClient |
| query | Query-Endpoint definieren |
| mutation | Mutation-Endpoint definieren |
| toFormData | Payload → ASP.NET FormData |
Entwicklung
npm install
npm run build
npm run lint
npm run format:checkLizenz
ISC
