or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

cli-tool.mdglobal-registration.mdindex.mdinstance-creation.mdmodule-import.mdtransformation.md
tile.json

cli-tool.mddocs/

0

# CLI Tool

1

2

Command-line interface for directly executing TypeScript files with full jiti transformation support.

3

4

## Capabilities

5

6

### jiti Command

7

8

Execute TypeScript and other supported files directly from the command line without compilation.

9

10

```bash

11

# CLI Usage

12

jiti <path> [...arguments]

13

```

14

15

**Usage Examples:**

16

17

```bash

18

# Execute a TypeScript file

19

jiti ./script.ts

20

21

# Execute with arguments

22

jiti ./cli-tool.ts --config ./config.json --verbose

23

24

# Execute from npm script

25

npm exec jiti ./build-script.ts

26

27

# Global installation

28

npm install -g jiti

29

jiti ./any-script.ts

30

```

31

32

### CLI Features

33

34

**Automatic File Type Detection:**

35

The CLI automatically handles various file extensions and applies appropriate transformations:

36

37

```bash

38

# All of these work seamlessly

39

jiti ./config.ts # TypeScript

40

jiti ./script.mts # TypeScript ESM

41

jiti ./legacy.cts # TypeScript CommonJS

42

jiti ./component.tsx # TypeScript + JSX

43

jiti ./regular.js # JavaScript

44

jiti ./module.mjs # JavaScript ESM

45

jiti ./common.cjs # JavaScript CommonJS

46

```

47

48

**Node.js Integration:**

49

- Preserves Node.js command-line arguments and environment

50

- Maintains proper `process.argv` handling

51

- Supports Node.js debugging and profiling flags

52

53

**Performance Optimization:**

54

- Enables Node.js compile cache when available (Node.js 22.8+)

55

- Uses filesystem caching for repeated executions

56

- Smart transformation detection to avoid unnecessary processing

57

58

### Environment Configuration

59

60

Configure jiti CLI behavior using environment variables:

61

62

```bash

63

# Enable debug mode

64

JITI_DEBUG=1 jiti ./script.ts

65

66

# Enable JSX support

67

JITI_JSX=1 jiti ./component.tsx

68

69

# Disable filesystem caching

70

JITI_FS_CACHE=false jiti ./dev-script.ts

71

72

# Custom aliases

73

JITI_ALIAS='{"@/*": "./src/*"}' jiti ./script.ts

74

75

# Multiple options

76

JITI_DEBUG=1 JITI_JSX=1 JITI_SOURCE_MAPS=1 jiti ./complex-script.tsx

77

```

78

79

### Integration with Development Workflows

80

81

**Package.json Scripts:**

82

83

```json

84

{

85

"scripts": {

86

"dev": "jiti ./src/dev-server.ts",

87

"build": "jiti ./scripts/build.ts",

88

"test": "jiti ./scripts/test-runner.ts",

89

"setup": "jiti ./scripts/setup.ts --init",

90

"deploy": "NODE_ENV=production jiti ./scripts/deploy.ts"

91

}

92

}

93

```

94

95

**Development Server:**

96

97

```typescript

98

// dev-server.ts

99

import express from "express";

100

import { config } from "./config.ts";

101

102

const app = express();

103

104

app.get("/", (req, res) => {

105

res.json({ message: "Development server running" });

106

});

107

108

app.listen(config.port, () => {

109

console.log(`Server running on port ${config.port}`);

110

});

111

```

112

113

```bash

114

# Run development server directly

115

jiti ./dev-server.ts

116

```

117

118

**Build Scripts:**

119

120

```typescript

121

// scripts/build.ts

122

import { execSync } from "child_process";

123

import { readFileSync, writeFileSync } from "fs";

124

import { BuildConfig } from "./types.ts";

125

126

const config: BuildConfig = {

127

entry: "./src/index.ts",

128

output: "./dist/bundle.js",

129

minify: process.env.NODE_ENV === "production"

130

};

131

132

console.log("Building application...");

133

execSync(`esbuild ${config.entry} --bundle --outfile=${config.output}`);

134

console.log("Build complete!");

135

```

136

137

```bash

138

# Execute build script

139

jiti ./scripts/build.ts

140

```

141

142

### Advanced CLI Usage

143

144

**With Node.js Flags:**

145

146

```bash

147

# Debug mode

148

node --inspect --loader jiti/loader ./script.ts

149

150

# Memory profiling

151

node --max-old-space-size=4096 $(which jiti) ./memory-intensive.ts

152

153

# ES modules with experimental features

154

node --experimental-modules $(which jiti) ./esm-script.ts

155

```

156

157

**Complex Project Setup:**

158

159

```typescript

160

// scripts/setup.ts

161

import { existsSync, mkdirSync, writeFileSync } from "fs";

162

import { join } from "path";

163

import { Config } from "../src/types.ts";

164

165

interface SetupOptions {

166

init?: boolean;

167

config?: string;

168

force?: boolean;

169

}

170

171

const args = process.argv.slice(2);

172

const options: SetupOptions = {

173

init: args.includes("--init"),

174

config: args.find(arg => arg.startsWith("--config="))?.split("=")[1],

175

force: args.includes("--force")

176

};

177

178

async function setup() {

179

console.log("Setting up project...");

180

181

if (options.init) {

182

const configPath = options.config || "./config.json";

183

const defaultConfig: Config = {

184

apiUrl: "http://localhost:3000",

185

timeout: 5000

186

};

187

188

if (!existsSync(configPath) || options.force) {

189

writeFileSync(configPath, JSON.stringify(defaultConfig, null, 2));

190

console.log(`Created config: ${configPath}`);

191

}

192

}

193

194

// Additional setup logic...

195

console.log("Setup complete!");

196

}

197

198

setup().catch(console.error);

199

```

200

201

```bash

202

# Run setup with options

203

jiti ./scripts/setup.ts --init --config=./custom-config.json --force

204

```

205

206

### Error Handling and Debugging

207

208

**Runtime Error Handling:**

209

210

```typescript

211

// error-prone-script.ts

212

try {

213

const data = await import("./non-existent-config.ts");

214

} catch (error) {

215

console.error("Failed to load config:", error.message);

216

process.exit(1);

217

}

218

```

219

220

```bash

221

# CLI handles errors gracefully

222

jiti ./error-prone-script.ts

223

# Output: Failed to load config: Cannot resolve module './non-existent-config.ts'

224

# Exit code: 1

225

```

226

227

**Debug Output:**

228

229

```bash

230

# Enable debug output to see transformation details

231

JITI_DEBUG=1 jiti ./script.ts

232

```

233

234

Debug output includes:

235

- File resolution paths

236

- Transformation decisions

237

- Cache usage information

238

- Performance timings

239

240

### Testing and Continuous Integration

241

242

**Test Runner Integration:**

243

244

```typescript

245

// scripts/test-runner.ts

246

import { execSync } from "child_process";

247

import { globSync } from "glob";

248

249

const testFiles = globSync("./tests/**/*.test.ts");

250

251

for (const testFile of testFiles) {

252

console.log(`Running: ${testFile}`);

253

try {

254

execSync(`jiti ${testFile}`, { stdio: "inherit" });

255

} catch (error) {

256

console.error(`Test failed: ${testFile}`);

257

process.exit(1);

258

}

259

}

260

261

console.log("All tests passed!");

262

```

263

264

**CI/CD Integration:**

265

266

```yaml

267

# .github/workflows/test.yml

268

name: Test

269

on: [push, pull_request]

270

271

jobs:

272

test:

273

runs-on: ubuntu-latest

274

steps:

275

- uses: actions/checkout@v3

276

- uses: actions/setup-node@v3

277

with:

278

node-version: '20'

279

- run: npm install

280

- run: npx jiti ./scripts/test-runner.ts

281

- run: npx jiti ./scripts/lint-check.ts

282

- run: npx jiti ./scripts/build-check.ts

283

```

284

285

**Docker Integration:**

286

287

```dockerfile

288

# Dockerfile

289

FROM node:20-alpine

290

291

WORKDIR /app

292

COPY package*.json ./

293

RUN npm install

294

295

COPY . .

296

297

# Use jiti to run TypeScript directly

298

CMD ["npx", "jiti", "./src/server.ts"]

299

```

300

301

### Performance Considerations

302

303

**Caching for CLI:**

304

305

```bash

306

# First run: slower (transformation + caching)

307

time jiti ./large-script.ts

308

# real 0m2.345s

309

310

# Subsequent runs: faster (cached)

311

time jiti ./large-script.ts

312

# real 0m0.456s

313

```

314

315

**Production Usage:**

316

317

For production deployments, consider pre-compiling TypeScript:

318

319

```json

320

{

321

"scripts": {

322

"build": "tsc",

323

"start": "node ./dist/server.js",

324

"dev": "jiti ./src/server.ts"

325

}

326

}

327

```

328

329

**Memory Usage:**

330

331

```bash

332

# Monitor memory usage for large scripts

333

NODE_OPTIONS="--max-old-space-size=2048" jiti ./memory-intensive.ts

334

```

335

336

### Comparison with Alternatives

337

338

**vs ts-node:**

339

340

```bash

341

# ts-node

342

npx ts-node ./script.ts

343

344

# jiti - simpler, faster startup

345

npx jiti ./script.ts

346

```

347

348

**vs tsx:**

349

350

```bash

351

# tsx

352

npx tsx ./script.ts

353

354

# jiti - more configuration options

355

JITI_DEBUG=1 npx jiti ./script.ts

356

```

357

358

**Advantages of jiti CLI:**

359

- Zero configuration required

360

- Built-in caching system

361

- Comprehensive environment variable support

362

- ESM/CommonJS interoperability

363

- JSX support with configuration

364

- Smart transformation detection

365

- Cross-platform compatibility