1 | const template = require('babel-template');
|
2 | import traverse from 'babel-traverse';
|
3 | const types = require('babel-types');
|
4 |
|
5 | import {isElementMarker, stripI18nId} from './ast';
|
6 | import {extractElementMessageWithoutSideEffects} from './extract';
|
7 | import freeVariablesInMessage from './free-variables';
|
8 | import {options} from './options';
|
9 |
|
10 |
|
11 | const transformElementMarker = template(`
|
12 | <${options.elementMarker} message={MESSAGE} context={this} args={ARGS} fallback={function() { return FALLBACK; }}/>
|
13 | `, {plugins: ['jsx']});
|
14 |
|
15 |
|
16 | export default {
|
17 | transformMarker(node) {
|
18 | if (isElementMarker(node)) {
|
19 | return this.transformElementMarker(node);
|
20 | } else {
|
21 | return node;
|
22 | }
|
23 | },
|
24 |
|
25 | transformElementMarker(node) {
|
26 | const vars = freeVariablesInMessage(node);
|
27 | const message = extractElementMessageWithoutSideEffects(node);
|
28 | const fallback = this.makeFallback(node);
|
29 | const transformed = transformElementMarker({
|
30 | MESSAGE: types.stringLiteral(message),
|
31 | ARGS: types.arrayExpression(
|
32 | vars.map(v => types.identifier(v))
|
33 | ),
|
34 | FALLBACK: fallback,
|
35 | });
|
36 | return transformed;
|
37 | },
|
38 |
|
39 | makeFallback(node) {
|
40 | node.openingElement.name.name = 'span';
|
41 | node.closingElement.name.name = 'span';
|
42 | traverse(node, {
|
43 | noScope: true,
|
44 | JSXElement({node}) {
|
45 | stripI18nId(node);
|
46 | }
|
47 | });
|
48 | return node;
|
49 | },
|
50 |
|
51 | needsTransformation(node) {
|
52 |
|
53 |
|
54 |
|
55 | return node.children.length;
|
56 | },
|
57 | };
|