Files
accounted/packages/connect-contract/README.md
T
fcfa1ba974 feat(connect): extract the connector wire contract into packages/connect-contract (#2179)
* feat(connect): extract the connector wire contract into packages/connect-contract

The definitions in lib/connect/contract.ts (key prefix, headers, entitlements
path, entitlement and sync-report shapes) move into a standalone MIT package,
packages/connect-contract (published as @accounted/connect-contract), joined
by the error envelope, the stable error codes, and Zod schemas for every
Peppol connector operation (lookup, submit, status, evidence, register,
unregister, inbound list and xml) with an operation table. Shape only: no
behaviour, no provider code. In-repo callers import through the tsconfig and
vitest alias; lib/connect/contract.ts re-exports so nothing else changes.
The point of the package is that either side of the connection can be built
outside this repository: a self-hosted ledger talking to Accounted Connect,
or another connector service talking to the open ledger.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Signed-off-by: Jakob Wennberg <311770904+jakobwennberg-oss@users.noreply.github.com>

* docs(decisions): record the Connect direction, the Peppol proxy shape, and the contract package

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Signed-off-by: Jakob Wennberg <311770904+jakobwennberg-oss@users.noreply.github.com>

---------

Signed-off-by: Jakob Wennberg <311770904+jakobwennberg-oss@users.noreply.github.com>
Co-authored-by: Jakob Wennberg <311770904+jakobwennberg-oss@users.noreply.github.com>
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-02 20:57:47 +02:00

1.7 KiB

@accounted/connect-contract

The wire contract between an Accounted ledger installation (the hosted service or a self-hosted instance) and Accounted Connect, the service that operates the provider integrations only Accounted can run: bank feeds through its PSD2 credentials, the Skatteverket API client, the Peppol access point, company lookup, the migration sources.

This package is shape only: constants, Zod schemas and the TypeScript types inferred from them. There is no behaviour and no provider code in it. Both sides of the connection validate with the same schemas so they cannot drift apart, and the package is MIT so that anyone may implement either side.

What is in it:

  • key prefix, header names and the entitlements path an installation uses;
  • the entitlements and sync-report payloads of the hourly key sync;
  • the error envelope and the stable error codes the service answers with;
  • the Peppol operations (/api/connect/peppol/*): request and response schemas plus the operation table (method, path, company header required).

Versioning: CONTRACT_VERSION is a date. Fields are only ever added; a breaking change is a new operation or family, never a changed one.

Use

import { peppolSubmissionSchema, PEPPOL_OPERATIONS, CONTRACT_VERSION } from '@accounted/connect-contract'

const parsed = peppolSubmissionSchema.safeParse(body)
if (!parsed.success) return badRequest(parsed.error)

Inside the Accounted repository the package is consumed from source through a path alias. To publish, build from the repository root with the root dependencies installed:

npx tsc -p packages/connect-contract/tsconfig.json
cd packages/connect-contract && npm publish --access public