
Security News
Frontier AI Is Now Critical Infrastructure
The Fable shutdown shows how quickly model access can become a business continuity risk for AI-dependent engineering teams.
@ksefnik/shared
Advanced tools
Shared Zod schemas and types for the Ksefnik SDK (Polish KSeF e-Invoice reconciliation)
Wspólny kontrakt typów TypeScript i schematów Zod dla ekosystemu Ksefnik — otwartego KSeF SDK dla Node.js / TypeScript, implementującego Krajowy System e-Faktur (KSeF 2.0). Pakiet dostarcza modele domenowe (Invoice, BankTransaction, Match) i kontrakty adapterów używane przez @ksefnik/core, @ksefnik/http, @ksefnik/mcp i pluginy trzecie — wszystko, czego potrzebujesz, żeby zbudować własną integrację z polską e-fakturą albo własny adapter do KSeF 2.0 HTTP API.
Ten pakiet to fundament całego monorepo. Nie zawiera logiki biznesowej, nie wykonuje żadnych wywołań sieciowych. Definiuje wyłącznie modele domenowe, interfejsy adapterów i błędy — tak, żeby wszystkie pozostałe pakiety (@ksefnik/core, @ksefnik/http, @ksefnik/mcp, @ksefnik/cli, @ksefnik/simulator) i pluginy zewnętrzne mówiły tym samym językiem.
Jeżeli piszesz własną integrację z KSeF, własny parser banku albo własny plugin reconcyliacyjny — zacznij właśnie tutaj. Importujesz typy, dziedziczysz kontrakt i dostajesz gotowe miejsce w pipeline. Referencja API →
pnpm add @ksefnik/shared zod
# lub
npm install @ksefnik/shared zod
zod jest peer-wymaganiem — pakiet nie narzuca wersji, bo @ksefnik/shared re-eksportuje schematy, które mają być używane również w kodzie konsumenta.
schemas/)Wszystkie modele domenowe są zdefiniowane jako schematy Zod, z których wyprowadzane są też typy TypeScript. Dzięki temu te same definicje walidują dane w runtime i typują kod.
| Schemat | Opis |
|---|---|
InvoiceSchema | Faktura KSeF — numer, data wystawienia, sprzedawca (NIP), nabywca (NIP), pozycje, kwoty netto/VAT/brutto, referencja KSeF, waluta |
BankTransactionSchema | Pojedyncza operacja z wyciągu bankowego — data, kwota, nadawca, tytuł, NIP wyciągnięty z opisu |
MatchSchema | Dopasowanie faktury do transakcji — invoiceId, transactionId, score, strategy (który pass to wykrył), confidence |
ReconciliationReportSchema | Wynik pełnego runa reconcyliacji — zmatchowane, niezmatchowane faktury, niezmatchowane przelewy, statystyki |
Kwoty są zawsze w groszach (integer). Nigdy number jako float. 1 PLN = 100. Unika problemów z arytmetyką zmiennoprzecinkową, które w księgowości potrafią się skończyć kontrolą z US.
import { InvoiceSchema, type Invoice } from '@ksefnik/shared'
const raw = await readFileAsJson('./invoice.json')
const invoice: Invoice = InvoiceSchema.parse(raw) // rzuci ZodError jeśli dane są niepoprawne
console.log(invoice.totalAmount) // liczba w groszach, np. 123456 = 1234,56 PLN
types/)Interfejsy, które pozwalają podmieniać komponenty bez ruszania logiki biznesowej.
KsefAdapterWymagany kontrakt każdej integracji z KSeF. Implementują go:
@ksefnik/http — produkcyjny klient HTTP do api.ksef.mf.gov.pl@ksefnik/simulator — offline mock do testów CIimport type {
KsefAdapter,
FetchInvoicesOpts,
SendInvoiceInput,
SendInvoiceResult,
UpoResult,
Invoice,
} from '@ksefnik/shared'
export class MyCustomKsefAdapter implements KsefAdapter {
async fetchInvoices(opts: FetchInvoicesOpts): Promise<Invoice[]> { /* ... */ }
async sendInvoice(input: SendInvoiceInput): Promise<SendInvoiceResult> { /* ... */ }
async getUpo(ksefReference: string): Promise<UpoResult> { /* ... */ }
async initSession?(): Promise<void> { /* opcjonalne */ }
async closeSession?(): Promise<void> { /* opcjonalne */ }
}
FetchInvoicesOpts ma m.in. subjectType: 'Subject1' (sprzedaż — faktury gdzie firma jest wystawcą) lub 'Subject2' (zakupy — faktury kosztowe, gdzie firma jest nabywcą). Domyślnie Subject2.
BankStatementParserKontrakt parsera wyciągu bankowego. Każdy parser deklaruje, czy potrafi obsłużyć dany plik (canParse) i jak go zmieni w listę BankTransaction.
export interface BankStatementParser {
name: string
canParse(content: string): boolean
parse(content: string): BankTransaction[]
}
Gotowe implementacje w @ksefnik/core: MT940 (standard), mBank CSV, ING CSV, PKO BP CSV, Santander CSV. Jeżeli Twój bank eksportuje w innym formacie — zaimplementuj interfejs i zarejestruj parser w pipeline.
ReconciliationPassKontrakt pojedynczego przebiegu reconcyliacji. Każdy pass ma order (kolejność wywołania) i metodę run, która dostaje kontekst z jeszcze niezmatchowanymi fakturami i transakcjami i zwraca listę nowych dopasowań.
export interface ReconciliationPass {
name: string
order: number // core: 50–500, pluginy: 600+
run(ctx: ReconciliationContext): Promise<Match[]>
}
Domyślne passy (@ksefnik/core): ksef-ref → exact-nip-amount → invoice-ref → fuzzy-name → partial-payment → proximity. Każdy kolejny działa tylko na tym, czego poprzedni nie dopasował.
KsefPluginKontrakt pluginu rozszerzającego Ksefnik — dodaje własne passy reconcyliacyjne, hooki (onReconciliationComplete, onInvoicesSynced), narzędzia MCP, komendy CLI. Ładowany dynamicznie przez try { await import(pkg) } catch {} — jeśli pluginu nie ma, Ksefnik działa w wersji free bez rzucania wyjątku.
StorageInterfejs warstwy persystencji (faktury, transakcje, matche). Domyślnie @ksefnik/core udostępnia InMemoryStorage i SqliteStorage — możesz podmienić na własną (Postgres, Prisma, cokolwiek).
errors/)import { KsefError, KsefValidationError, KsefAuthError, KsefRateLimitError } from '@ksefnik/shared'
KsefError — bazowa klasa, z której dziedziczą pozostałeKsefValidationError — walidacja schematów, reguł biznesowychKsefAuthError — 401/403 z KSeF, wygasły token, zła sygnatura challengeKsefRateLimitError — 429, zawiera retryAfter w sekundach do użycia przez retry policy@ksefnik/core zależy od shared. @ksefnik/http zależy od shared (i core tylko dla retry). @ksefnik/simulator zależy od shared. Bez wspólnego minimum jądro musiałoby wiedzieć o wszystkich implementacjach z góry.@ksefnik/shared = breaking change w kontraktach. Wszystko inne to detale implementacyjne.Projekt jest na etapie 0.x. Do 1.0 kontrakty mogą się zmieniać między minorami. Po 1.0 obowiązuje semver — breaking change w eksportowanych typach = bump majora.
| Pakiet | Opis |
|---|---|
@ksefnik/core | Silnik reconcyliacji, parsery bankowe, walidacja faktur |
@ksefnik/http | Produkcyjny klient HTTP do KSeF 2.0 |
@ksefnik/simulator | Offline mock KSeF do testów |
@ksefnik/mcp | Model Context Protocol server (integracja z Claude) |
@ksefnik/cli | CLI oparte o Commander + @clack/prompts |
MIT. Część monorepo ksefnik rozwijanego przez CodeFormers.it — software house specjalizujący się w TypeScript, automatyzacji procesów biznesowych i integracjach z polskimi systemami państwowymi (KSeF, e-Doręczenia, ePUAP, KRS, CEIDG). Jeżeli potrzebujesz wdrożenia KSeF skrojonego pod konkretny system ERP — napisz do nas.
FAQs
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
The Fable shutdown shows how quickly model access can become a business continuity risk for AI-dependent engineering teams.

Security News
AI agents are pulling packages into environments no scanner is watching, creating exposure before security teams can see it.

Security News
GitHub Actions checkout now blocks risky pull_request_target checkouts by default to help prevent pwn request supply chain attacks.