📘️ apity - Typed API client for Svelte and SvelteKit
A typed fetch client for openapi-typescript compatible with SvelteKit's custom fetch
Installation
npm install @cocreators-ee/apity
Or
pnpm add @cocreators-ee/apity
Features
On the roadmap:
Usage
Generate typescript definition from schema
Before working with the library, you need to generate an API spec using openapi-typescript:
npx openapi-typescript https://petstore3.swagger.io/ --output petstore.ts
🚀 https://petstore3.swagger.io/api/v3/openapi.json → file:.petstore.ts [870ms]
Using Apity
Configure Apity instance and generate functions for making API calls:
import { Apity } from '@cocreators-ee/apity'
import { paths } from './petstore'
const apity = Apity.for<paths>()
apity.configure({
baseUrl: 'https://petstore.swagger.io/v2',
init: {
},
})
export const findPetsByStatus = apity
.path('/pet/findByStatus')
.method('get')
.create()
export const addPet = apity.path('/pet').method('post').create()
Each API call is represented as a request object that has the following properties:
{
ready,
onData,
resp,
reload,
}
Each response is a Svelte store returning either an undefined
, or the following object:
{
status,
ok,
data,
}
Using Apity with await syntax in templates
<script lang="ts">
import { findPetByStatus } from './api.ts'
const request = findPetByStatus({ status: 'sold' })
const petsReady = request.ready
</script>
<div>
{#await $petsReady}
<p>Loading..</p>
{:then resp}
{#if resp.ok}
{#each resp.data as pet}
<p>{pet.name}</p>
{/each}
{:else}
<p>Error while loading pets</p>
{/if}
{/await}
<button on:click={() => {request.reload()}}>
Reload pets
</button>
</div>
Subscribing to response store
<script lang="ts">
import { findPetByStatus } from './api.ts'
const request = findPetByStatus({ status: 'sold' })
let names = []
request.resp.subscribe(resp => {
if (resp.ok) {
names = resp.data.map(pet => pet.name)
}
})
</script>
<div>
{#each names as name}
<p>{name}</p>
{/each}
</div>
Using in load functions
Fetch operations support SvelteKit's load function from +page.ts
and +page.server.ts
:
export async function load({ fetch }) {
const request = findPetByStatus({ status: 'sold' })
const resp = await request.onData
return { request }
}