@arbeidstilsynet/meldinger-data
v0.0.3
Published
TypeScript types for the Meldinger Data API from Arbeidstilsynet, generated from its OpenAPI specification.
Keywords
Readme
@arbeidstilsynet/meldinger-data
TypeScript types for the Arbeidstilsynet data API, generated from its OpenAPI specification. This package ships types only — there is no runtime code — so it adds nothing to your bundle.
Use it together with openapi-fetch to get a
fully type-safe HTTP client: request paths, query parameters, request bodies and
responses are all checked against the live API contract.
Installation
npm install @arbeidstilsynet/meldinger-data openapi-fetch
# or
pnpm add @arbeidstilsynet/meldinger-data openapi-fetchThe package version is bumped whenever the API contract (
openApi.json) changes, so a new version means the types may have changed.
What's exported
The generated module exposes the standard openapi-typescript shapes:
paths— every endpoint, keyed by URL, with its methods, params and responses.components— reusable schemas (DTOs), undercomponents["schemas"].operations— operations keyed byoperationId.
Creating a client
import createClient from "openapi-fetch";
import type { paths } from "@arbeidstilsynet/meldinger-data";
export const client = createClient<paths>({
baseUrl: "/api/data",
});Pulling out schema types
Alias the schemas you use so they read nicely in your code:
import type { components } from "@arbeidstilsynet/meldinger-data";
export type Melding = components["schemas"]["Melding"];
export type FilterRequest = components["schemas"]["FilterRequest"];
export type PaginationResponseOfMelding =
components["schemas"]["PaginationResponseOfMelding"];Usage examples
These mirror how the types are consumed inside the Arbeidstilsynet frontends.
A first request
A minimal meldinger search — fetch the first page from a given date:
const { data, error } = await client.POST("/data/meldinger/search", {
params: {
query: {
from: new Date("2024-01-01").toISOString(),
page: 1,
pageSize: 20,
},
},
body: {
domain: "forhandsmelding",
},
});
if (error) throw new Error(JSON.stringify(error));
console.log(data?.data);A typed, reusable search function
The search endpoint is the main entry point. Its FilterRequest body drives all
filtering — by domain, address, time range, free-text search, and more:
import type { components } from "@arbeidstilsynet/meldinger-data";
type FilterRequest = components["schemas"]["FilterRequest"];
type PaginationResponseOfMelding =
components["schemas"]["PaginationResponseOfMelding"];
export async function searchMeldinger(
from: Date,
page: number,
pageSize: number,
body: FilterRequest,
to?: Date,
): Promise<PaginationResponseOfMelding> {
const { data, error } = await client.POST("/data/meldinger/search", {
params: {
query: {
from: from.toISOString(),
...(to && { to: to.toISOString() }),
page,
pageSize,
},
},
body,
});
if (error) {
throw new Error(`Failed to search meldinger: ${JSON.stringify(error)}`);
}
if (!data) {
throw new Error("Failed to search meldinger: empty response");
}
return data;
}Because FilterRequest is a generated type, your editor autocompletes every available
filter and flags invalid combinations at compile time. Changing the API contract (and
updating this package) surfaces breaking changes the same way.
License
Internal Arbeidstilsynet package. See the repository for details.
