← All showcases
ideasets as public APIMonorepo architecture
modularityimportsideasets

A module's published surface

billing exports an ideaset. checkout imports only that. Reaching past the boundary is an error.

An ideaset is the module's published surface — not its internals.

billing/interface.rq

charge {
    capture payment for a checkout total
    implemented in ["./src/billing/charge.ts".charge]
    @status done
}

refund_policy {
    refunds within 30 days require original charge id
    @status done
}

// internals — not in the published surface
ledger_posting {
    double-entry write after capture
    @status done
}

billing_api (
    charge,
    refund_policy
)

checkout/checkout.rq

import "../billing/interface.rq" as billing

checkout {
    must call [billing.charge] after session is valid
    refunds follow [billing.refund_policy]
    @status done
}

reaching past the boundary

errorCould not resolve reference to IdeaDeclaration named 'ledger_posting'.

  • Import from a file that exports ledger_posting
  • Add ledger_posting to billing_api
  • Create the missing idea