@thelivemarket/tlm-api-client
v0.1.0
Published
Lightweight client helpers for integrating external websites and partner apps with TLM API (Live Market API).
Readme
@thelivemarket/tlm-api-client
Lightweight client helpers for integrating external websites and partner apps with TLM API (Live Market API).
Goals
- Standardize app identity (
appId) and token handling - Provide a thin tRPC client wrapper
- Ship reusable PKCE helpers for browser apps
- Document a "golden path" website structure for AI-assisted implementation
Install
pnpm add @thelivemarket/tlm-api-client @trpc/client superjsonQuickstart
import { createTlmApiClient } from '@thelivemarket/tlm-api-client';
// import type { AppRouter } from '@tlm/tlm-api'; // internal or generated public types later
const client = createTlmApiClient<any>({
baseUrl: import.meta.env.VITE_TLM_API_URL,
appId: import.meta.env.VITE_TLM_APP_ID,
getAccessToken: () => localStorage.getItem('tlm_access_token'),
});Monorepo Typed Client (from @tlm/tlm-api)
If you are inside the TLM monorepo (or otherwise have @tlm/tlm-api installed), use the typed subpath so the router types are available at build time:
import { createTypedTlmApiClient } from '@thelivemarket/tlm-api-client/tlm-api';
const client = createTypedTlmApiClient({
baseUrl: import.meta.env.VITE_TLM_API_URL,
appId: import.meta.env.VITE_TLM_APP_ID,
});This keeps the root package generic/public-safe while enabling first-class types in internal builds.
PKCE Helpers
import { buildAuthorizeUrl, generatePkcePair } from '@tlm/tlm-api-client';
const pkce = await generatePkcePair();
const url = buildAuthorizeUrl(
{ baseUrl: 'https://api.example.com', appId: 'app_123' },
{
redirectUri: 'https://site.example.com/callback',
codeChallenge: pkce.challenge,
state: crypto.randomUUID(),
scope: ['services:read', 'booking:create'],
},
);Documentation
- Website structure guide:
docs/website-structure.md - Monorepo TLM API contract (repo-local):
docs/tlm-api/README.mdin the TLM monorepo
Publishing From A Private Monorepo
Yes, this package can be published publicly while the monorepo stays private.
- Keep the package self-contained (
files,exports, no private imports) - Avoid leaking internal repo paths/types
- Publish via CI (npm public) with
pnpm --filter @thelivemarket/tlm-api-client publish --access public - Optionally generate a public type package if exposing tRPC router types later
