Skip to content

Latest commit

 

History

History
197 lines (152 loc) · 5.06 KB

README.md

File metadata and controls

197 lines (152 loc) · 5.06 KB

bob-ts

npm

Transpile your TypeScript projects quickly using esbuild + rollup, made to accelerate and simplify the TypeScript development with file watcher and first-class support for JavaScript testing frameworks.

This library doesn't handle type definitions, but you can add them simply by doing tsc --declaration --emitDeclarationOnly

Install

pnpm add -D bob-ts esbuild
yarn add -D bob-ts esbuild
npm install -D bob-ts esbuild

Usage

By default bob-ts is ESM first, but you can change it to be either CJS with: -f cjs or -f interop to transpile for both CommonJS & ESM.

If you don't have "type": "module" in your package.json, ESM will be outputted with the extension .mjs and CJS as .js

If you do have "type": "module" in your package.json, ESM will be outputted with the extension .js and CJS as .cjs.

Build

Usage: bob-ts [options]

Options:
  -d, --dir <directory>      Custom output dir (default: "dist")
  -i, --input <patterns...>  Input patterns (default: ".")
  -f, --format <format>      Format, it can be 'cjs', 'esm' or 'interop' (default: "esm")
  --cwd <dir>                Custom target directory (default: "X")
  --no-clean                 Don't clean output dir (default: true)
  -t, --target <target>      Javascript runtime target (default: "_YOUR_CURRENT_NODE_VERSION_")
  --no-sourcemap             Disable sourcemap generation
  --paths                    Resolve tsconfig paths (default: false)
  -h, --help                 display help for command

This will transpile all your src folder, and its structure will be kept as is in the dist folder

{
  "scripts": {
    "prepare": "bob-ts -i src"
  }
}

Development / Watch Mode

Usage: bob-ts-watch [options]

Options:
  -d, --dir <directory>        Custom output dir (default: "dist")
  -i, --input <patterns...>    Input patterns (default: ".")
  -f, --format <format>        Output format (choices: "cjs", "esm", "interop", default: "esm")
  --clean                      Clean output dir (default: false)
  --cwd <dir>                  Custom target directory (default: "___")
  -c, --command <commands...>  Execute scripts after successful JS build, You can specify more than a single command
                               to be executed concurrently
  -t, --target <target>        Javascript runtime target (default: "_YOUR_CURRENT_NODE_VERSION_")
  --ignore <files...>          Patterns of files to ignore watching
  --no-sourcemap               Disable sourcemap generation
  --paths                      Resolve tsconfig paths (default: false)
  -h, --help                   display help for command
{
  "scripts": {
    "dev": "bob-ts-watch -i src -c \"node dist/index.mjs\""
  }
}

Usage with Testing

The main reason for the default input being "." is because this library has first-class support for being used for JavaScript test frameworks like Mocha and Node-Tap.

You can have all the tests files inside a specific test directory, for example, test, and use the transpiled version of your code with all the required source maps.

In the end, a better and faster alternative than ts-node/register, and the solution for ESM support with TypeScript, where ts-node struggles a lot.

Example structure

src/
  index.ts
test/
  main.test.ts
package.json

Mocha

pnpm add -D mocha c8
yarn add -D mocha c8
npm install -D mocha c8

ESM

{
  "scripts": {
    "dev": "bob-ts-watch -c \"node/dist/src/index.mjs\"",
    "start": "bob-ts && node/dist/src/index.mjs",
    "test": "bob-ts && c8 mocha dist/test",
    "test:watch": "bob-ts-watch -c \"c8 mocha dist/test\""
  },
  "mocha": {
    "enable-source-maps": true
  }
}

CJS

{
  "scripts": {
    "dev": "bob-ts-watch -f cjs -c \"node dist/src/index.js\"",
    "start": "bob-ts -f cjs && node dist/src/index.js",
    "test": "bob-ts -f cjs && c8 mocha dist/test",
    "test:watch": "bob-ts-watch -f cjs -c \"c8 mocha dist/test\""
  },
  "mocha": {
    "enable-source-maps": true
  }
}

Node Tap

pnpm add -D tap @istanbuljs/esm-loader-hook
yarn add -D tap @istanbuljs/esm-loader-hook
npm install -D tap @istanbuljs/esm-loader-hook

ESM

Assuming that your tests are inside a test directory

{
  "scripts": {
    "dev": "bob-ts-watch -c \"node/dist/src/index.mjs\"",
    "start": "bob-ts && node/dist/src/index.mjs",
    "test": "bob-ts && tap dist/test",
    "test:watch": "bob-ts-watch -c \"tap dist/test\""
  },
  "tap": {
    "node-arg": ["--no-warnings", "--experimental-loader", "@istanbuljs/esm-loader-hook"]
  }
}

CJS

{
  "scripts": {
    "dev": "bob-ts-watch -f cjs -c \"node/dist/src/index.js\"",
    "start": "bob-ts -f cjs && node/dist/src/index.js",
    "test": "bob-ts -f cjs && tap dist/test",
    "test:watch": "bob-ts-watch -f cjs -c \"tap dist/test\""
  }
}

LICENSE

MIT