ts-transformer-inline-file
Version:
A TypeScript custom transformer for inlining files
165 lines (128 loc) • 4.12 kB
Markdown
This is a TypeScript AST transformer [1] that allows you to include
content of a file into the transpiled code, i.e. *inline it* in
build-time.
You can think about it as a C preprocessor’s directive `
more powerful… way more powerful. If the referenced file is a JSON file,
it doesn’t include it as a string but converts the JSON to an object
literal. Thus it can be further optimized by a minifier. Moreover, if
you use an object destructing assignment, this transformer will optimize
it itself — include only the assigned properties!
Usage
=====
Add ts-transformer-inline-file package to your project as a
**dev**elopment dependency and [configure the
transformer](
Inline Any Textual File
-----------------------
``` js
import { $INLINE_FILE } from 'ts-transformer-inline-file'
const words = $INLINE_FILE('../data/words.txt').trim().split(' ')
```
This will be transformed into:
``` js
const words = "lorem ipsum dolor\n".trim().split(' ');
```
…where `"lorem ipsum dolor\n"` is full content of the file
`../data/words.txt`.
Inline JSON Data
----------------
``` js
import { $INLINE_JSON } from 'ts-transformer-inline-file'
const pkg = $INLINE_JSON('../package.json')
```
This will be transformed into:
``` js
const pkg = { "name": "my-package", "version": "0.1.0", "license": "MIT", ... }
```
However, if you need only few properties from the referenced JSON file,
use object destructuring assignment:
``` js
const { name, version } = $INLINE_JSON('../package.json')
```
…and the transformer will include only the assigned properties:
``` js
const { name, version } = { "name": "my-package", "version": "0.1.0" }
```
> **Note**
>
> This works only for the top level; filtering of nested properties is
> currently not supported.
How to Configure the Transformer
================================
Unfortunately, TypeScript itself does not currently provide any easy way
to use custom transformers (see
[Microsoft/TypeScript\#14419](https://github.com/Microsoft/TypeScript/issues/14419)).
Fortunately, there are few solutions.
TTypescript
-----------
If you don’t use any bundler such as Rollup or webpack,
[TTypescript](https://github.com/cevek/ttypescript) is the way to go. It
provides wrappers `ttsc` and `ttserver` for the `tsc` and `tsserver`
commands that add support for custom transformers. All you have to do is
to use these wrappers instead of the original commands and define the
transformer in your `tsconfig.json`:
**tsconfig.json:.**
``` jsonc
{
"compilerOptions": {
// ...
"plugins": [
{ "transform": "ts-transformer-inline-file/transformer" }
]
},
// ...
}
```
Rollup (with rollup-plugin-typescript2)
---------------------------------------
**rollup.config.js:.**
``` js
import typescript from 'rollup-plugin-typescript2'
import inlineFileTransformer from 'ts-transformer-inline-file/transformer'
export default {
// ...
plugins: [
typescript({
transformers: [
(service) => ({
before: [ inlineFileTransformer(service.getProgram()) ],
after: [],
}),
],
}),
],
}
```
Webpack (with ts-loader or awesome-typescript-loader)
-----------------------------------------------------
**webpack.config.js:.**
``` js
const inlineFileTransformer = require('ts-transformer-inline-file/transformer').default
module.exports = {
// ...
module: {
rules: [
{
test: /\.ts$/,
loader: 'ts-loader', // or 'awesome-typescript-loader',
options: {
getCustomTransformers: (program) => ({
before: [
inlineFileTransformer(program),
],
}),
},
},
],
},
}
```
License
=======
This project is licensed under [MIT
License](http://opensource.org/licenses/MIT/). For the full text of the
license, see the [LICENSE](LICENSE) file.
[] If you’ve never heard about TypeScript transformers, I can recommend
[](https://blog.logrocket.com/using-typescript-transforms-to-enrich-runtime-code-3fd2863221ed/)
to dive into the topic.