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

@mdscript/bundler-utils

v0.3.0

Published

Shared utilities for MDS bundler plugins

Readme

@mdscript/bundler-utils

Shared transform utilities for MDS bundler plugins (Vite, Rollup, Webpack).

Note: This package is pre-release and not yet published to npm.

Installation

npm install @mdscript/bundler-utils

Peer dependencies

npm install @mdscript/mds

Usage

This package is primarily consumed by the bundler-specific plugin packages (@mdscript/vite-plugin, @mdscript/rollup-plugin, @mdscript/webpack-loader). You only need to use it directly if you are writing a plugin for another bundler.

import { createMdsTransformer, formatMdsError, shouldTransform } from '@mdscript/bundler-utils';

// Lazily initialize (call once per build, after loading @mdscript/mds)
const mds = await import('@mdscript/mds');
const transformer = createMdsTransformer(mds, { vars: { env: 'production' } });

// Transform a .mds file to a JavaScript module
if (await transformer.shouldTransform('/path/to/file.mds')) {
  const result = await transformer.transform('/path/to/file.mds');
  // result.code        - JS module source
  // result.dependencies - absolute paths of transitively imported files
  // result.warnings    - non-fatal compiler warnings
}

TypeScript module declarations

To tell TypeScript about .mds imports, add the following to your tsconfig.json:

{
  "compilerOptions": {
    "types": ["@mdscript/bundler-utils/mds"]
  }
}

Or add a triple-slash reference in any .d.ts file in your project:

/// <reference types="@mdscript/bundler-utils/mds" />

This makes import content from './prompt.mds' type-safe: content is string and the module also exports metadata: { warnings: string[]; dependencies: string[] }.

LazyInit

LazyInit<T> is a single-init lazy value holder with concurrent-call deduplication and retry-on-rejection semantics. It is exported for bundler plugin authors who need the same guarantee.

import { LazyInit } from '@mdscript/bundler-utils';

// Factory is invoked at most once per successful resolution.
const lazy = new LazyInit(async () => {
  const mds = await import('@mdscript/mds');
  return createMdsTransformer(mds, options);
});

// Concurrent calls share the in-flight promise; factory runs once.
const transformer = await lazy.get();

// Reset clears state; the next get() re-invokes the factory.
lazy.reset();

Key properties:

  • Single init: factory is called exactly once until reset().
  • Deduplication: concurrent get() calls share the in-flight promise.
  • Retry on rejection: a failed factory clears pending state so the next call retries.
  • TOCTOU safety: a generation counter prevents stale in-flight results from overwriting state after reset().

Options

interface MdsPluginOptions {
  /** Variables available for interpolation in .mds templates. */
  vars?: Record<string, unknown>;
}

License

MIT