Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/itsdouges/ts-transform-define

Create global constants which can be configured at compile time using the TypeScript compiler.
https://github.com/itsdouges/ts-transform-define

Last synced: about 2 months ago
JSON representation

Create global constants which can be configured at compile time using the TypeScript compiler.

Awesome Lists containing this project

README

        

# ts-transform-define [![npm](https://img.shields.io/npm/v/ts-transform-define?style=flat-square)](https://www.npmjs.com/package/ts-transform-define)

Allows you to create global constants which can be configured at compile time.
This is the TypeScript equivalent of https://webpack.js.org/plugins/define-plugin/.

## Usage

```bash
npm i ts-transform-define ttypescript
```

Update your tsconfig.json:

```json
{
"compilerOptions": {
"plugins": [
{
"transform": "ts-transform-define",
"replace": {
"PRODUCTION": "true",
"VERSION": "'5fa3b9'",
"BROWSER_SUPPORTS_HTML5": true,
"TWO": "1+1",
"typeof window": "'object'",
"process.env.NODE_ENV": "process.env.NODE_ENV",
"isNodeEnvironment()": "true"
}
}
]
}
}
```

Run TTypeScript instead of TypeScript:

```diff
-tsc
+ttsc
```

> Note that because the plugin does a direct text replacement,
> the value given to it must include actual quotes inside of the string itself.
> Typically,
> this is done either with alternate quotes,
> such as '"production"'.

**index.ts**

```js
if (!PRODUCTION) {
console.log('Debug info');
}

if (PRODUCTION) {
console.log('Production log');
}
```

After passing through the transformer:

```js
if (!true) {
console.log('Debug info');
}
if (true) {
console.log('Production log');
}
```

and then after a minification pass results in:

```js
console.log('Production log');
```

### Environment variables

When replacing with environment variables it will pass them through,
so if we have this code:

```ts
if (process.env.NODE_ENV === 'development') {
doLotsOfWorkInDev();
}
```

And then we have this config

```json
{
"compilerOptions": {
"plugins": [
{
"transform": "ts-transform-define",
"replace": {
"process.env.NODE_ENV": "process.env.NODE_ENV"
}
}
]
}
}
```

And then we run

```bash
NODE_ENV="production" ttsc
```

The code gets transformed to

```tsx
if ('production' === 'development') {
doLotsOfWorkInDev();
}
```

Which minifiers will see `false` in the if statement and delete the block.

## Gotchas

When replacing with environment variables, e.g. `process.env.NODE_ENV` - if it is not set at build time it will ignore replacing the expression.

E.g:

```json
{
"compilerOptions": {
"plugins": [
{
"transform": "ts-transform-define",
"replace": {
"process.env.NODE_ENV": "process.env.DONT_EXIST"
}
}
]
}
}
```

Will result in:

```ts
if (process.env.NODE_ENV === 'development') {
doLotsOfWorkInDev();
}
```

Instead of:

```ts
if (process.env.DONT_EXIST === 'development') {
doLotsOfWorkInDev();
}
```