Runtime TypeScript and ESM support for Node.js with seamless interoperability between ESM and CommonJS.
npx @tessl/cli install tessl/npm-jiti@2.5.0jiti provides seamless runtime TypeScript and ESM support for Node.js with zero configuration. It enables importing TypeScript files directly in Node.js applications without a build step, offering both asynchronous and synchronous APIs for maximum compatibility between ESM and CommonJS modules.
npm install jitiimport { createJiti } from "jiti";
// or default import (deprecated)
import createJiti from "jiti";For CommonJS:
const { createJiti } = require("jiti");
// or default import (deprecated)
const createJiti = require("jiti");import { createJiti } from "jiti";
// Create a jiti instance
const jiti = createJiti(import.meta.url);
// Import TypeScript files asynchronously (recommended)
const config = await jiti.import("./config.ts");
const utils = await jiti.import("./utils.ts", { default: true }); // Get default export
// Resolve module paths with ESM conditions
const resolved = jiti.esmResolve("./some-module");For CommonJS (deprecated but supported):
const { createJiti } = require("jiti");
const jiti = createJiti(__filename);
// Synchronous import (deprecated)
const config = jiti("./config.ts");jiti is built around several key components:
createJiti() creates configured instances with custom optionsimport() style API for loading modules with TypeScript supportCore jiti instance creation with comprehensive configuration options for caching, transformation, and module handling.
function createJiti(id: string, userOptions?: JitiOptions): Jiti;
interface JitiOptions {
fsCache?: boolean | string;
rebuildFsCache?: boolean;
moduleCache?: boolean;
debug?: boolean;
sourceMaps?: boolean;
interopDefault?: boolean;
extensions?: string[];
alias?: Record<string, string>;
nativeModules?: string[];
transformModules?: string[];
jsx?: boolean | JSXOptions;
tryNative?: boolean;
}Instance Creation and Configuration
Modern asynchronous module importing with TypeScript support and advanced resolution capabilities.
interface Jiti {
import<T>(
id: string,
opts?: JitiResolveOptions & { default?: true }
): Promise<T>;
esmResolve(id: string, opts?: JitiResolveOptions): string;
}
interface JitiResolveOptions {
conditions?: string[];
parentURL?: string | URL;
try?: boolean;
}Babel-based source code transformation for TypeScript, JSX, and ESM syntax with comprehensive options.
interface Jiti {
transform(opts: TransformOptions): string;
evalModule(source: string, options?: EvalModuleOptions): unknown;
}
interface TransformOptions {
source: string;
filename?: string;
ts?: boolean;
retainLines?: boolean;
interopDefault?: boolean;
async?: boolean;
jsx?: boolean | JSXOptions;
babel?: Record<string, any>;
}
interface TransformResult {
code: string;
error?: any;
}Global ESM loader registration and native runtime mode for seamless TypeScript support across Node.js applications.
// Import for global registration
import "jiti/register";
// Native mode with limited API
import { createJiti } from "jiti/native";Global Registration and ESM Loader
Command-line interface for directly executing TypeScript files with full jiti transformation support.
# CLI usage
jiti <path> [...arguments]interface Jiti extends NodeRequire {
// Deprecated synchronous import
(id: string): any;
// Deprecated CommonJS resolution
resolve: {
(id: string, options?: { paths?: string[] }): string;
paths(request: string): string[] | null;
};
// Deprecated CommonJS properties
cache: ModuleCache;
extensions: Record<string, Function>;
main: NodeModule | undefined;
}Note: Synchronous APIs are deprecated. Use await jiti.import() instead of jiti() for better compatibility.
interface JSXOptions {
throwIfNamespace?: boolean;
runtime?: "classic" | "automatic";
importSource?: string;
pragma?: string;
pragmaFrag?: string;
useBuiltIns?: boolean;
useSpread?: boolean;
}
interface EvalModuleOptions {
id?: string;
filename?: string;
ext?: string;
cache?: ModuleCache;
async?: boolean;
forceTranspile?: boolean;
}
interface NodeModule {
isPreloading: boolean;
exports: any;
require: NodeRequire;
id: string;
filename: string;
loaded: boolean;
parent: NodeModule | null | undefined;
children: NodeModule[];
path: string;
paths: string[];
}
type ModuleCache = Record<string, NodeModule>;