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

babel-plugin-zod-hoist

v1.2.0

Published

Hoists Zod schema definitions to the top of the file.

Readme

Babel Plugin to Hoist Zod Schemas

Hoists Zod schema definitions to the top of the file.

This:

function getSchema() {
  return z.object({ name: z.string() });
}

Becomes this:

const _schema_94b7f = z.object({
  name: z.string(),
});
function getSchema() {
  return _schema_94b7f;
}

Motivation

Initializing Zod schemas is expensive.

By hoisting the schema to the top of the file, we can avoid re-initializing the schema every time we use it.

Why Use This?

  • Performance Boost: Prevents unnecessary re-initialization.
  • Zero Mental Overhead: Write normal Zod code - the hoisting happens automatically.
  • No Code Changes Required: Works with your existing codebase without modifications.

Installation

npm install --save-dev babel-plugin-zod-hoist

Usage

Add the plugin to your Babel configuration:

{
  "plugins": ["babel-plugin-zod-hoist"]
}

Hoisting derived schemas

The plugin also hoists schemas derived from an imported base schema via Zod combinators (.extend(), .pick(), .omit(), .merge(), .partial(), and so on).

This:

import { UserShape } from './shapes';

function getRowSchema() {
  return UserShape.extend({ rowId: z.number() });
}

Becomes this:

const _schema_d117fccf = UserShape.extend({
  rowId: z.number(),
});
import { UserShape } from './shapes';
function getRowSchema() {
  return _schema_d117fccf;
}

Hoisted declarations are placed above the import statements. This is safe because ES module imports are initialized before any other module code runs.

Because Babel has no type information, the plugin needs a signal that the base is actually a Zod schema before hoisting a chain like Base.extend(...) — otherwise it might rewrite unrelated APIs such as dayjs.extend(plugin). A combinator chain on a non-z base is hoisted when either:

  • the chain contains a z.* call somewhere (e.g. UserShape.extend({ rowId: z.number() })), or
  • the base identifier's name matches schemaNamePattern (default /ZodSchema$/).

Schemas that reference local variables, this, or top-level const/let/var bindings are never hoisted, since that could change behavior or cause temporal dead zone errors. Only schemas built solely from imports and literals are hoisted.

Options

Pass options using the array form in your Babel configuration:

// babel.config.js
export default {
  plugins: [['babel-plugin-zod-hoist', { schemaNamePattern: /Shape$/ }]],
};

schemaNamePattern

Type: RegExp | string | null — Default: /ZodSchema$/

A combinator chain whose base (root) identifier name matches this pattern is treated as a Zod schema and hoisted even when the chain contains no inline z.* call. This lets schemas built purely from other schemas hoist:

import { UserZodSchema } from './schemas';

function getPublicSchema() {
  return UserZodSchema.pick({ name: true, email: true });
}

Becomes this:

const _schema_1865b49b = UserZodSchema.pick({
  name: true,
  email: true,
});
import { UserZodSchema } from './schemas';
function getPublicSchema() {
  return _schema_1865b49b;
}

The option accepts:

  • a RegExp{ schemaNamePattern: /Shape$/ };
  • a string, compiled as a RegExp source (anchor with $ for a suffix) — useful for JSON configs that cannot hold a RegExp literal:
    {
      "plugins": [["babel-plugin-zod-hoist", { "schemaNamePattern": "Shape$" }]]
    }
  • null — disables name-based matching, requiring an inline z.* call for every derived chain.