Runtime TypeScript and ESM support for Node.js with seamless interoperability between ESM and CommonJS.
—
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Pending
The risk profile of this skill
Command-line interface for directly executing TypeScript files with full jiti transformation support.
Execute TypeScript and other supported files directly from the command line without compilation.
# CLI Usage
jiti <path> [...arguments]Usage Examples:
# Execute a TypeScript file
jiti ./script.ts
# Execute with arguments
jiti ./cli-tool.ts --config ./config.json --verbose
# Execute from npm script
npm exec jiti ./build-script.ts
# Global installation
npm install -g jiti
jiti ./any-script.tsAutomatic File Type Detection: The CLI automatically handles various file extensions and applies appropriate transformations:
# All of these work seamlessly
jiti ./config.ts # TypeScript
jiti ./script.mts # TypeScript ESM
jiti ./legacy.cts # TypeScript CommonJS
jiti ./component.tsx # TypeScript + JSX
jiti ./regular.js # JavaScript
jiti ./module.mjs # JavaScript ESM
jiti ./common.cjs # JavaScript CommonJSNode.js Integration:
process.argv handlingPerformance Optimization:
Configure jiti CLI behavior using environment variables:
# Enable debug mode
JITI_DEBUG=1 jiti ./script.ts
# Enable JSX support
JITI_JSX=1 jiti ./component.tsx
# Disable filesystem caching
JITI_FS_CACHE=false jiti ./dev-script.ts
# Custom aliases
JITI_ALIAS='{"@/*": "./src/*"}' jiti ./script.ts
# Multiple options
JITI_DEBUG=1 JITI_JSX=1 JITI_SOURCE_MAPS=1 jiti ./complex-script.tsxPackage.json Scripts:
{
"scripts": {
"dev": "jiti ./src/dev-server.ts",
"build": "jiti ./scripts/build.ts",
"test": "jiti ./scripts/test-runner.ts",
"setup": "jiti ./scripts/setup.ts --init",
"deploy": "NODE_ENV=production jiti ./scripts/deploy.ts"
}
}Development Server:
// dev-server.ts
import express from "express";
import { config } from "./config.ts";
const app = express();
app.get("/", (req, res) => {
res.json({ message: "Development server running" });
});
app.listen(config.port, () => {
console.log(`Server running on port ${config.port}`);
});# Run development server directly
jiti ./dev-server.tsBuild Scripts:
// scripts/build.ts
import { execSync } from "child_process";
import { readFileSync, writeFileSync } from "fs";
import { BuildConfig } from "./types.ts";
const config: BuildConfig = {
entry: "./src/index.ts",
output: "./dist/bundle.js",
minify: process.env.NODE_ENV === "production"
};
console.log("Building application...");
execSync(`esbuild ${config.entry} --bundle --outfile=${config.output}`);
console.log("Build complete!");# Execute build script
jiti ./scripts/build.tsWith Node.js Flags:
# Debug mode
node --inspect --loader jiti/loader ./script.ts
# Memory profiling
node --max-old-space-size=4096 $(which jiti) ./memory-intensive.ts
# ES modules with experimental features
node --experimental-modules $(which jiti) ./esm-script.tsComplex Project Setup:
// scripts/setup.ts
import { existsSync, mkdirSync, writeFileSync } from "fs";
import { join } from "path";
import { Config } from "../src/types.ts";
interface SetupOptions {
init?: boolean;
config?: string;
force?: boolean;
}
const args = process.argv.slice(2);
const options: SetupOptions = {
init: args.includes("--init"),
config: args.find(arg => arg.startsWith("--config="))?.split("=")[1],
force: args.includes("--force")
};
async function setup() {
console.log("Setting up project...");
if (options.init) {
const configPath = options.config || "./config.json";
const defaultConfig: Config = {
apiUrl: "http://localhost:3000",
timeout: 5000
};
if (!existsSync(configPath) || options.force) {
writeFileSync(configPath, JSON.stringify(defaultConfig, null, 2));
console.log(`Created config: ${configPath}`);
}
}
// Additional setup logic...
console.log("Setup complete!");
}
setup().catch(console.error);# Run setup with options
jiti ./scripts/setup.ts --init --config=./custom-config.json --forceRuntime Error Handling:
// error-prone-script.ts
try {
const data = await import("./non-existent-config.ts");
} catch (error) {
console.error("Failed to load config:", error.message);
process.exit(1);
}# CLI handles errors gracefully
jiti ./error-prone-script.ts
# Output: Failed to load config: Cannot resolve module './non-existent-config.ts'
# Exit code: 1Debug Output:
# Enable debug output to see transformation details
JITI_DEBUG=1 jiti ./script.tsDebug output includes:
Test Runner Integration:
// scripts/test-runner.ts
import { execSync } from "child_process";
import { globSync } from "glob";
const testFiles = globSync("./tests/**/*.test.ts");
for (const testFile of testFiles) {
console.log(`Running: ${testFile}`);
try {
execSync(`jiti ${testFile}`, { stdio: "inherit" });
} catch (error) {
console.error(`Test failed: ${testFile}`);
process.exit(1);
}
}
console.log("All tests passed!");CI/CD Integration:
# .github/workflows/test.yml
name: Test
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '20'
- run: npm install
- run: npx jiti ./scripts/test-runner.ts
- run: npx jiti ./scripts/lint-check.ts
- run: npx jiti ./scripts/build-check.tsDocker Integration:
# Dockerfile
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
# Use jiti to run TypeScript directly
CMD ["npx", "jiti", "./src/server.ts"]Caching for CLI:
# First run: slower (transformation + caching)
time jiti ./large-script.ts
# real 0m2.345s
# Subsequent runs: faster (cached)
time jiti ./large-script.ts
# real 0m0.456sProduction Usage:
For production deployments, consider pre-compiling TypeScript:
{
"scripts": {
"build": "tsc",
"start": "node ./dist/server.js",
"dev": "jiti ./src/server.ts"
}
}Memory Usage:
# Monitor memory usage for large scripts
NODE_OPTIONS="--max-old-space-size=2048" jiti ./memory-intensive.tsvs ts-node:
# ts-node
npx ts-node ./script.ts
# jiti - simpler, faster startup
npx jiti ./script.tsvs tsx:
# tsx
npx tsx ./script.ts
# jiti - more configuration options
JITI_DEBUG=1 npx jiti ./script.tsAdvantages of jiti CLI: