ts-transformer
Process string messages for translation from modules that use react-intl, specifically:
- Parse and verify that messages are ICU-compliant w/o any syntax issues.
- Remove
description
from message descriptor to save bytes since it isn't used at runtime. - Option to remove
defaultMessage
from message descriptor to save bytes since it isn't used at runtime. - Automatically inject message ID based on specific pattern.
Installation
- npm
- yarn
npm i @formatjs/ts-transformer
yarn add @formatjs/ts-transformer
Usage
The default message descriptors for the app's default language will be processed from: defineMessages()
, defineMessage()
, intl.formatMessage
and <FormattedMessage>
; all of which are named exports of the React Intl package.
Via ts-loader
import {transform} from '@formatjs/ts-transformer'
module.exports = {
...otherConfigs,
module: {
rules: [
{
test: /\.tsx?$/,
use: [
{
loader: 'ts-loader',
options: {
getCustomTransformers() {
return {
before: [
transform({
overrideIdFn: '[sha512:contenthash:base64:6]',
}),
],
}
},
},
},
],
},
],
},
}
Via ts-jest
in jest.config.js
This requires ts-jest@26.4.0
or later
// jest.config.js
module.exports = {
// [...]
globals: {
'ts-jest': {
astTransformers: {
before: [
{
path: '@formatjs/ts-transformer/ts-jest-integration',
options: {
// options
overrideIdFn: '[sha512:contenthash:base64:6]',
ast: true,
},
},
],
},
},
},
}
Via ts-patch
{
"compilerOptions": {
"plugins": [
{
"transform": "@formatjs/ts-transformer",
"import": "transform",
"type": "config",
"overrideIdFn": "[sha512:contenthash:base64:6]",
"ast": true
}
]
}
}
Via rollup-plugin-typescript2
// rollup.config.js
import typescript from 'rollup-plugin-typescript2'
import {transform} from '@formatjs/ts-transformer'
export default {
input: './main.ts',
plugins: [
typescript({
transformers: () => ({
before: [
transform({
overrideIdFn: '[sha512:contenthash:base64:6]',
ast: true,
}),
],
}),
}),
],
}
Options
overrideIdFn
A function with the signature (id: string, defaultMessage: string, description: string|object) => string
which allows you to override the ID both in the extracted javascript and messages.
Alternatively, overrideIdFn
can be a template string, which is used only if the message ID is empty.
removeDefaultMessage
Remove defaultMessage
field in generated js after extraction.
extractSourceLocation
Whether the metadata about the location of the message in the source file should be extracted. If true
, then file
, start
, and end
fields will exist for each extracted message descriptors. Defaults to false
.
additionalComponentNames
Additional component names to extract messages from, e.g: ['FormattedFooBarMessage']
. NOTE: By default we check for the fact that FormattedMessage
are imported from moduleSourceName
to make sure variable alias works. This option does not do that so it's less safe.
additionalFunctionNames
Additional function names to extract messages from, e.g: ['$formatMessage']
. Use this if you prefer to alias formatMessage
to something shorter like $t
.
pragma
parse specific additional custom pragma. This allows you to tag certain file with metadata such as project
. For example with this file:
// @intl-meta project:my-custom-project
import {FormattedMessage} from 'react-intl'
;<FormattedMessage defaultMessage="foo" id="bar" />
and with option {pragma: "@intl-meta"}
, we'll parse out // @intl-meta project:my-custom-project
into {project: 'my-custom-project'}
in the result file.
ast
Pre-parse defaultMessage
into AST for faster runtime perf. This flag doesn't do anything when removeDefaultMessage
is true
.
onMsgExtracted(filePath: string, msgs: MessageDescriptor[])
Callback that gets triggered whenever a message is encountered.
onMetaExtracted(filePath: string, meta: Record<string, string>)
Callback that gets triggered whenever a pragme
meta is encountered.
preserveWhitespace
Whether to preserve whitespace and newlines.
Take a look at compile.ts
for example in integration.