npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@polyprism/ts-interface

v0.3.1

Published

Prisma 6 & 7 generator that emits TypeScript interfaces (`export interface User { ... }`) from your schema. Pure ESM, zero runtime deps, configurable naming + annotations. Part of PolyPrism.

Readme

@polyprism/ts-interface

A Prisma 6 & 7 generator that emits TypeScript interfaces from your schema.prisma. Part of PolyPrism.

export interface User {
  id: string;
  email: string;
  name: string | null;
  role: Role;
}

Pure ESM, Prisma 7-native, zero third-party runtime dependencies. CI tests against both Prisma 6 and Prisma 7. The generated code imports nothing from PolyPrism itself — drop the generator and your output keeps compiling.

Install

pnpm add -D prisma @polyprism/ts-interface

Configure

generator polyprismCodegen {
  provider = "polyprism-ts-interface"
  output   = "../generated"
}

⚠️ The provider string is the bin name (no @scope/ prefix). Bin names can't contain /, so you write polyprism-ts-interface, not @polyprism/ts-interface.

Run

pnpm prisma generate

Output

// generated/User.ts
import type { Role } from "./enums/Role.js";

export interface User {
  id: string;
  email: string;
  name: string | null;
  role: Role;
}

Every enum is also emitted as its own standalone ESM file at <output>/enums/<EnumName>.ts, so you can Object.values(MyEnum) directly without re-exporting through @prisma/client (whose CJS shape doesn't always play nicely with ESM consumers).

What you get out of the box

  • Prisma 6 & 7 compatibility — same generator binary, both Prisma majors. CI tests against both, including the Prisma 7 prisma.config.ts layout.
  • Pure ESM from day one — not retrofitted from a CJS codebase. No require(), no .cjs re-export shims, no surprise.
  • Zero third-party runtime dependencies. This package depends only on @polyprism/core and @polyprism/ts-shared, neither of which has a third-party runtime dep.
  • Eight /// annotations — see Annotations below.
  • Three-axis naming config — independently control file, type, and field naming (snake_case, kebab-case, PascalCase, camelCase, or preserve).
  • Per-identifier @name(NewName) override — escape hatch for the global naming rule.
  • @db.X(p, s) precision captured as JSDoc so the schema-level info survives codegen.
  • Optional barrel (emitIndex = true).
  • Pretty-formatted inline JSON types — multi-property objects from @json({ ... }) get broken onto multiple lines instead of collapsed onto one.
  • prisma-json-types-generator shorthand compatibility/// [TypeName] accepted as an alias for @json(TypeName), so existing schemas migrate cleanly.

Config options

All keys go on the generator polyprismCodegen { ... } block:

| Key | Default | Options | |---|---|---| | output | — | Path to the output directory (relative to the schema). | | fileNaming | PascalCase | PascalCase | camelCase | kebab-case | snake_case | preserve | | typeNaming | PascalCase | PascalCase | camelCase | snake_case | preserve | | fieldNaming | preserve | camelCase | snake_case | preserve | | emitIndex | false | "true" to emit a barrel index.ts. |

Annotations

All annotations live in Prisma triple-slash doc comments (///):

| Annotation | What it does | |---|---| | @hide | Drop a field/enum-value from the generated output entirely. | | @deprecated("reason") | Emit a @deprecated JSDoc tag. Reason optional. | | @json(Type) | Brand a Json field with a TypeScript type. Four forms: bare, with-import, inline-anonymous, inline-named. | | @type(MyType from "./path") | Override the inferred TS type entirely. | | @name(NewIdent) | Rename the emitted identifier (escapes global casing). | | @normalise(...) | Parsed across all patterns; runtime behaviour fires only in @polyprism/ts-domain-class (trim / lowercase / uppercase / nullEmptyToNull on setter assignment). | | @coerce(...) / @noCoerce | Parsed across all patterns; runtime behaviour fires only in @polyprism/ts-domain-class (Int/Float/Decimal/BigInt/DateTime coerce-by-default; opt out per-field). |

Full grammar in the root README.

Sibling patterns

Same schema, different output shape — just swap the provider:

More patterns on the roadmap: Zod, Valibot, ArkType, TypeBox.

License

MIT © Travis Fitzgerald