npm.io
0.1.1 • Published 15h ago

@baseworks/catalog

Licence
Version
0.1.1
Deps
4
Size
49 kB
Vulns
0
Weekly
0

@baseworks/catalog

Typed client, event catalog, projections, and CLI plugin for catalog-service — a per-org product / SKU directory with an optional list price. Contract-first, versioned with the service.

pnpm add @baseworks/catalog

Client

Products are org-scoped (X-Org-Id + identity token). Money is integer centspriceCents is the optional list price; leave it unset for no price. (Contract/usage pricing lives in the billing core, not here — ADR-010's dual-price rule: catalog holds the display/list price only.)

import { createCatalogClient } from '@baseworks/catalog'

const catalog = createCatalogClient({
  baseUrl: process.env.CATALOG_SERVICE_URL!,
  token:   identityJwt,
  orgId:   activeOrgId,
})

const widget = await catalog.create({
  name: 'Blue Widget',
  sku: 'WIDGET-1',
  priceCents: 1250,        // $12.50 — integer cents, never a float
  currency: 'USD',
  category: 'widgets',
  labels: ['featured'],
})

await catalog.list()              // Product[]
await catalog.get('WIDGET-1')     // by id, shortId, or sku
await catalog.update(widget.id, { priceCents: 999 })
await catalog.delete(widget.id)

A product with no list price has priceCents: null + currency: null. Errors throw CatalogError (.status, .code, e.g. 409 sku_taken).

CLI plugin

import { buildCatalogCommand } from '@baseworks/catalog/cli'

program.addCommand(buildCatalogCommand({ http, cliName: 'dtab' }))
// → dtab catalog | cat | products  (list) · create · get · update · delete · ls
//   `--price 12.50 --currency USD` converts to cents (sub-cent rejected); `-o wide`.

Service integration

import { PROJECTIONS, POLICIES } from '@baseworks/catalog/projections'
import { ProductEvents } from '@baseworks/catalog/events'

Projection products → foldbase table read_products. Tenant = org id.

See also

Service: projects/catalog-service · ADR-010.