
Product
Introducing Socket Scanning for OpenVSX Extensions
Socket now scans OpenVSX extensions, giving teams early detection of risky behaviors, hidden capabilities, and supply chain threats in developer tools.
@ngrok/gen-x
Advanced tools
Generate package.json#exports from src
Automatically generate package.json exports from your source files with support for TypeScript, JavaScript, JSX/TSX, and CSS. Features include index file flattening, custom transform modes, and monorepo live types support.
Install @ngrok/gen-x to your devDependencies with your preferred package manager:
| package manager | command |
|---|---|
| npm | npm install -DE @ngrok/gen-x |
| yarn | yarn add -DE @ngrok/gen-x |
| pnpm | pnpm add -DE @ngrok/gen-x |
| bun | bun add -DE @ngrok/gen-x |
# Generate exports from src/ to dist/
npx gen-x
# Preview changes without writing
npx gen-x --dry-run
This will scan your src/ directory and generate package.json exports like:
{
"exports": {
"./package.json": "./package.json",
".": {
"import": "./dist/index.js",
"types": "./dist/index.d.ts"
},
"./utils": {
"import": "./dist/utils.js",
"types": "./dist/utils.d.ts"
}
}
}
index.ts → ".", lib/index.ts → "./lib"defineConfigCreate a gen-x.config.ts file for type-safe configuration:
import { defineConfig } from "@ngrok/gen-x";
export default defineConfig({
input: "src",
output: "dist",
mode: "camelCase",
customCondition: "@my-package/source",
include: ["**/*.{ts,tsx,js,jsx,css}"],
exclude: ["**/*.test.*", "**/*.d.ts"],
});
Or use gen-x.config.json:
{
"mode": "camelCase",
"customCondition": "@my-package/source"
}
Or add to package.json:
{
"genx": {
"mode": "camelCase"
}
}
Priority: CLI flags > config file > defaults
Options:
-V, --version output the version number
--dry-run, --dryRun Preview changes to stdout
--exclude <exclude...> Globs to exclude (default: ["**/*.d.ts","**/*.test.*","**/*.spec.*","**/__tests__/**"])
--include <include...> Globs to include (default: ["**/*.{ts,tsx,cts,mts,js,jsx,mjs,cjs,css}"])
-i, --input <input> Input directory (default: "src")
-m, --mode <mode> Transform mode: passthrough|camelCase|kebab-case|PascalCase|snake_case (default: "passthrough")
--customCondition <condition> Custom condition for monorepo live types
-o, --output <output> Output directory (default: "dist")
-p, --package <package> Path to package.json (default: "package.json")
-r, --replace <pattern:=>replacement...> Replace export keys
-h, --help display help for command
npx gen-x
# Transform to camelCase
npx gen-x --mode camelCase
# hello-world.ts → ./helloWorld
# Transform to kebab-case
npx gen-x --mode kebab-case
# HelloWorld.ts → ./hello-world
# Remove _pb suffix from protobuf files
npx gen-x --replace "/_pb/:=>"
# user_pb.ts → ./user (but still imports from user_pb.js)
# Multiple replacements
npx gen-x --replace "/_pb/:=>" --replace "/^api-/:=>api/"
For consuming packages in the same monorepo to use source TypeScript files:
// gen-x.config.ts
export default {
customCondition: "@my-org/my-package/source",
};
Generates:
{
"exports": {
".": {
"@my-org/my-package/source": "./src/index.ts",
"import": "./dist/index.js",
"types": "./dist/index.d.ts"
}
}
}
See Live Types in TypeScript Monorepo for more info.
CSS files automatically preserve their extensions:
# src/styles/theme.css → ./styles/theme.css
npx gen-x
Output:
{
"./styles/theme.css": {
"import": "./dist/styles/theme.css"
}
}
# Include only TypeScript files
npx gen-x --include "**/*.ts" --include "**/*.tsx"
# Exclude internal files
npx gen-x --exclude "**/internal/**" --exclude "**/*.test.*"
import { generateExports } from "@ngrok/gen-x";
const exports = await generateExports({
input: "src",
output: "dist",
mode: "camelCase",
});
console.log(exports);
Prerequisites required:
We use direnv to assist you with setting up all of the required tooling.
node 20 is installed. With nvm, run nvm install.pnpm with corepack: corepack enable pnpmpnpm with corepack: corepack installpnpm: pnpm installFirst, install direnv:
| OS | command |
|---|---|
| macOS | brew install direnv |
| ubuntu | sudo apt install direnv |
For all other OSes, see the direnv installation guide.
Don't forget to set up direnv integration with your shell.
Next, clone the repo and move into the directory:
git clone https://github.com/ngrok-oss/gen-x.git
cd gen-x
Next, run:
direnv allow
This will install nvm (if not already installed) as well as set the correct node and pnpm versions for you.
It will also run pnpm install at the end to install all node_modules.
FAQs
Generate package.json#exports from src
We found that @ngrok/gen-x demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 3 open source maintainers collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Product
Socket now scans OpenVSX extensions, giving teams early detection of risky behaviors, hidden capabilities, and supply chain threats in developer tools.

Product
Bringing supply chain security to the next generation of JavaScript package managers

Product
A safer, faster way to eliminate vulnerabilities without updating dependencies