GithubHelp home page GithubHelp logo

sia-fl / tsx Goto Github PK

View Code? Open in Web Editor NEW

This project forked from privatenumber/tsx

0.0 0.0 0.0 957 KB

⚡️ TypeScript Execute (tsx): Node.js enhanced with esbuild to run TypeScript & ESM

License: MIT License

JavaScript 0.71% TypeScript 99.29%

tsx's Introduction

tsx

TypeScript Execute (tsx): Node.js enhanced with esbuild to run TypeScript & ESM files

Features

  • Blazing fast on-demand TypeScript & ESM compilation
  • Works in both CommonJS and ESM packages
  • Supports next-gen TypeScript extensions (.cts & .mts)
  • Supports node: import prefixes
  • Hides experimental feature warnings
  • TypeScript REPL
  • Resolves tsconfig.json paths
  • Tested on Linux & Windows with Node.js v12~18

💡 Protip: Looking to bundle your TypeScript project?

If you're looking for a dead simple way to bundle your TypeScript projects, take a look at pkgroll. It's an esbuild-enhanced Rollup that's auto configured based on your package.json!


Premium sponsor banner

About

tsx is a CLI command (alternative to node) for seamlessly running TypeScript & ESM, in both commonjs & module package types.

It's powered by esbuild so it's insanely fast.

Want to just run TypeScript code? Try tsx:

npx tsx ./script.ts

How does it compare to ts-node? Checkout the comparison.

Install

Local installation

If you're using it in an npm project, install it as a development dependency:

npm install --save-dev tsx

You can reference it directly in the package.json#scripts object:

{
    "scripts": {
        "dev": "tsx ..."
    }
}

To use the binary, you can call it with npx while in the project directory:

npx tsx ...

Global installation

If you want to use it in any arbitrary project without npx, install it globally:

npm install --global tsx

Then, you can call tsx directly:

tsx ...

Usage

tsx is designed to be a drop-in replacement for node, so you can use it just the way you would use Node.js. All command-line arguments (with the exception of a few) are propagated to Node.js.

Run TypeScript / ESM / CJS module

Pass in a file to run:

tsx ./file.ts

Custom tsconfig.json path

By default, tsconfig.json will be detected from the current working directory.

To set a custom path, use the --tsconfig flag:

tsx --tsconfig ./path/to/tsconfig.custom.json ./file.ts

Alternatively, use the ESBK_TSCONFIG_PATH environment variable:

ESBK_TSCONFIG_PATH=./path/to/tsconfig.custom.json tsx ./file.ts

Watch mode

Run file and automatically rerun on changes:

tsx watch ./file.ts

All imported files are watched except from the following directories: node_modules, bower_components, vendor, dist, and .* (hidden directories).

Ignore files from watch

To exclude files from being watched, pass in a path or glob to the --ignore flag:

tsx watch --ignore ./ignore-me.js --ignore ./ignore-me-too.js ./file.ts

Tips

  • Press Return to manually rerun
  • Pass in --clear-screen=false to disable clearing the screen on rerun

REPL

Start a TypeScript REPL by running with no arguments:

tsx

Cache

Modules transformations are cached in the system cache directory (TMPDIR). Transforms are cached by content hash, so duplicate dependencies are not re-transformed.

Set the --no-cache flag to disable the cache:

tsx --no-cache ./file.ts

Node.js Loader

tsx is a standalone binary designed to be used in place of node, but sometimes you'll want to use node directly. For example, when adding TypeScript & ESM support to npm-installed binaries.

To use tsx as a Node.js loader, simply pass it in to the --loader flag.

Note: The loader is limited to adding support for loading TypeScript/ESM files. CLI features such as watch mode or suppressing "experimental feature" warnings will not be available.

# As a CLI flag
node --loader tsx ./file.ts

# As an environment variable
NODE_OPTIONS='--loader tsx' node ./file.ts

Tip: In rare circumstances, you might be limited to using the -r, --require flag.

You can use @esbuild-kit/cjs-loader, but transformations will only be applied to require() (not import).

Hashbang

If you prefer to write scripts that doesn't need to be passed into tsx, you can declare it in the hashbang.

Simply add #!/usr/bin/env tsx at the top of your file:

file.ts

#!/usr/bin/env tsx

console.log('argv:', process.argv.slice(2))

And make the file executable:

chmod +x ./file.ts

Now, you can run the file without passing it into tsx:

$ ./file.ts hello
argv: [ 'hello' ]

Dependencies

Node.js Loader to transform TypeScript to ESM.

Node.js require() hook to transform TypeScript & ESM to CommonJS.


Premium sponsor banner

Support

If there's a problem you're encountering or something you need help with, don't hesitate to take advantage of my Priority Support service where you can ask me questions in an exclusive forum. I'm well equppied to assist you with this project and would be happy to help you out! 🙂

FAQ

Why is it named tsx?

tsx stands for "TypeScript execute". Mirroring npx, which stands for "Node.js package execute".

The 3-character package name offers an elegant developer experience, allowing usage like: npx tsx ....

Unfortunately, it overlaps with React's TSX/JSX, which stands for "TypeScript XML".

Does it do type-checking?

No, esbuild does not support type checking.

It's recommended to run TypeScript separately as a command (tsc --noEmit) or via IDE IntelliSense.

How is tsx different from ts-node?

They're both tools to run TypeScript files. But tsx does a lot more to improve the experience of using Node.js.

tsx just works. It's zero-config and doesn't require tsconfig.json to get started, making it easy for users that just want to run TypeScript code and not get caught up in the configuration.

It's a single binary with no peer-dependencies (e.g. TypeScript or esbuild), so there is no setup necessary, enabling usage that is elegant and frictionless for first-time users:

npx tsx ./script.ts

tsx is zero-config because it has smart detections built in. As a runtime, it detects what's imported to make many options in tsconfig.json redundant—which was designed for compiling matching files regardless of whether they're imported.

It seamlessly adapts between CommonJS and ESM package types by detecting how modules are loaded (require() or import) to determine how to compile them. It even adds support for require()ing ESM modules from CommonJS so you don't have to worry about your dependencies as the ecosystem migrates to ESM.

Newer and unsupported syntax & features like importing node: prefixes are downgraded by detecting the Node.js version. For large TypeScript codebases, it has tsconfig.json paths aliasing support out of the box.

At the core, tsx is powered by esbuild for blazing fast TypeScript compilation, whereas ts-node (by default) uses the TypeScript compiler. Because esbuild doesn't type check, tsx is similar to ts-node --esm --swc (which uses the SWC compiler).

As a bonus, tsx also comes with a watcher to speed up your development.

Here's an exhaustive technical comparison between tsx, ts-node, and other runtimes.

Can it use esbuild plugins?

No. tsx uses esbuild's Transform API, which doesn't support plugins.

Does it have a configuration file?

No. tsx's integration with Node.js is designed to be seamless so there is no configuration.

Does it have any limitations?

Transformations are handled by esbuild, so it shares the same limitations such as:

For details, refer to esbuild's JavaScript caveats and TypeScript caveats documentation.

Does Yarn PnP work?

In CommonJS mode, yes. But in Module/ESM mode, Node.js version v19.6.0 and up is required.

There's an outdated dependency in tsx—can you update?

Dependencies are typically declared with SemVer ranges to allow updates. You can use the npm update <package name> command to automatically update them to the latest version within the defined range.

If the dependencies are out of the specified range, it indicates a potential breaking change that requires manual review. You're welcome to submit a pull request to initiate the upgrade.

Sponsors

Holocron

Holocron

Premium sponsor banner Premium sponsor banner

tsx's People

Contributors

privatenumber avatar romanlamsal avatar amitdahan avatar antfu avatar dylanpiercey avatar patheticgeek avatar skimhugo avatar ilyasemenov avatar pedablio avatar pdx1204 avatar sgarner avatar tony19 avatar fz6m avatar jakzo avatar vaakian avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.