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

oxc-codegen

v0.152.0

Published

Fast JavaScript code generator from an ESTree-compliant AST

Readme

oxc-codegen

Fast, synchronous code generation for JavaScript and TypeScript ASTs.

oxc-codegen turns an ESTree or TS-ESTree AST into formatted source code. It supports JavaScript, JSX, TypeScript, and TSX.

The printer is a port of Oxc's Rust oxc_codegen crate. With the default options, both printers produce byte-identical output: tab indentation, double-quoted strings, and no comments.

Installation

npm install oxc-codegen

oxc-codegen is ESM-only and requires Node.js ^20.19.0 or >=22.12.0.

Quick start

Pair it with oxc-parser to parse and print source code:

import { printSync } from "oxc-codegen";
import { parseSync } from "oxc-parser";

const { program } = parseSync("input.js", "const answer=6*7");
const { code } = printSync(program);

console.log(code);
// const answer = 6 * 7;

You can also print a manually constructed AST:

const program = {
  type: "Program",
  sourceType: "script",
  body: [
    {
      type: "ExpressionStatement",
      expression: {
        type: "CallExpression",
        callee: {
          type: "MemberExpression",
          object: { type: "Identifier", name: "console" },
          property: { type: "Identifier", name: "log" },
          computed: false,
          optional: false,
        },
        arguments: [{ type: "Literal", value: "Hello!" }],
        optional: false,
      },
    },
  ],
};

console.log(printSync(program).code);
// console.log("Hello!");

TypeScript and TSX

Set ts when the AST can contain TypeScript nodes. For TSX, set both ts and jsx:

const { program } = parseSync("component.tsx", "const Box = <T,>(value: T) => <div>{value}</div>");

const { code } = printSync(program, {
  ts: true,
  jsx: true,
});

API

printSync(node, options?)

function printSync(
  node: ESTree.Program | ESTree.Statement,
  options?: Options,
): {
  code: string;
  map: SourceMap | null;
};

Prints a complete Program or a single statement and returns the generated source code, and (when requested) a standard Source Map v3 object.

import { printSync } from "oxc-codegen";
import { parseSync } from "oxc-parser";

const sourceText = "const answer=6*7";
const { program } = parseSync("input.js", sourceText);
const { code, map } = printSync(program, {
  sourcemap: true,
  sourceFilename: "input.js",
  sourceText,
});

Source-map mappings require sourceText and nodes with valid Oxc start / end offsets. A manually constructed AST without offsets can still be printed, but its source map has an empty mappings string.

Options

| Option | Type | Default | Description | | :-------------------- | :-------- | :------ | :--------------------------------------------------------------- | | indent | string | "\t" | Non-empty string of spaces and/or tabs used for one indent level | | startingIndentLevel | number | 0 | Starting indent level, from 0 to 1000 | | jsx | boolean | false | Enable TSX-safe printing for ambiguous TypeScript syntax | | ts | boolean | false | Select the printer that supports TypeScript nodes | | sourcemap | boolean | false | Return a Source Map v3 object in map | | sourceFilename | string | "" | Original source filename recorded in the source map | | sourceText | string | - | Original text required for source-map mappings and content |

Why pure JavaScript?

Most Oxc packages use native bindings. This package deliberately does not: when an AST already lives in JavaScript, passing the entire object graph across a JS/native boundary can cost more than printing it in place. oxc-codegen avoids that serialization and uses specialized printer builds for JavaScript and TypeScript workloads.

See DESIGN.md for the implementation details and performance constraints.

Current limitations

  • Comments are not printed.
  • Minified output is not supported.

Benchmarks

Representative time per printSync call:

| Fixture | Bytes | Time | | :--------------------------- | --------: | ---------: | | tiny.js | 26 | 0.0001 ms | | RadixUIAdoptionSection.jsx | 2,518 | 0.0070 ms | | react.development.js | 72,141 | 0.1518 ms | | binder.ts | 193,077 | 0.3364 ms | | App.tsx | 415,340 | 1.2912 ms | | lodash.js | 544,096 | 0.7977 ms | | kitchen-sink.tsx | 732,222 | 4.2924 ms | | antd.js | 6,683,633 | 16.9652 ms |

These figures come from one machine and are illustrative, not a regression baseline. Results vary between runs, most noticeably for large fixtures such as antd.js.