Packages
TypeScript libraries and tools for Node.js ESM environments, each published to npm. For how they fit together in practice, see the demos.
Schemas and types
- Juniper
Build JSON Schemas in TypeScript with inferred static types — strict, Ajv-ready, JSON Schema 2020-12 and OpenAPI 3.0 output.
- Juniper Validator
Standard Schema compliant validators for Juniper schemas, with type guards and assertions.
- genever
Generate TypeScript types from JSON Schema files and OpenAPI documents, with strict schema checks and the same types Juniper infers.
Dependency injection and scripts
- Haywire
Compile-time checked dependency injection for TypeScript — no decorators, no reflect-metadata, no global state.
- haywire-launcher
Run a Haywire-built entry script in one line, building the container only when the script runs.
- entry-script
Node.js scripts whose main() only runs when they are the entry point, so tests can import them without side effects.
Testing
- mocha-chain
Chain Mocha hooks so each passes typed context to the next, instead of sharing nullable variables between hooks and tests.
- vitest-chain
The same hook chaining for Vitest, with typed context alongside Vitest’s own test context.
- pg-dolly
A fresh Postgres database for every test, cloned from a template built once from your schema’s SQL, safe next to dev data and across parallel runs.
- pg-dolly-schema
Keep a schema.sql of what your Postgres migrations build, for any migration tool, and fail CI when it’s stale.
Generated files and monorepo tooling
- nx-lifecycle
Nx plugin that derives every dependsOn from declared lifecycle stages (build, test, …) and the targets bound to them.
- Barrelify
Generate and CI-verify TypeScript barrel (index.ts) files with the correct ESM/CJS import extensions.
- populate-files
Write generated files from code, and fail CI when they are out of date or were edited by hand, with editable manual sections.
- generated-signature
Sign generated files so hand edits are detected by an ESLint rule or a single function call, while manual sections stay editable.
Data and caching
- lease-cache
Read-through caching on Valkey or Redis with leases, so each miss is loaded once across every instance, and a load that finishes after an invalidation never caches its outdated value.
- normalized-react-query
Type-safe TanStack Query definitions that pair each key with its fetcher, and link related queries so they load together, including for server rendering.
Errors
- unknown-error
Turn any caught unknown into a real Error without throwing, even for hostile values, other realms and deep or circular cause chains.