-
Notifications
You must be signed in to change notification settings - Fork 1.3k
/
index.test.ts
127 lines (119 loc) · 2.86 KB
/
index.test.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import {join, basename} from 'path';
import {transformFileSync} from '@babel/core';
import plugin, {OptionsSchema} from '../';
const TESTS: Record<string, OptionsSchema> = {
additionalComponentNames: {
additionalComponentNames: ['CustomMessage'],
},
additionalFunctionNames: {
additionalFunctionNames: [],
},
ast: {
ast: true,
},
defineMessage: {},
defineMessages: {},
descriptionsAsObjects: {},
empty: {},
enforceDefaultMessage: {},
enforceDescriptions: {},
extractFromFormatMessageCall: {},
extractFromFormatMessageCallStateless: {},
formatMessageCall: {},
FormattedMessage: {},
idInterpolationPattern: {
idInterpolationPattern: '[folder].[name].[sha512:contenthash:hex:6]',
},
inline: {},
templateLiteral: {},
overrideIdFn: {
overrideIdFn: (
id?: string,
defaultMessage?: string,
description?: string,
filePath?: string
) => {
const filename = basename(filePath!);
return `${filename}.${id}.${
defaultMessage!.length
}.${typeof description}`;
},
},
removeDefaultMessage: {
removeDefaultMessage: true,
},
defineMessagesPreserveWhitespace: {
preserveWhitespace: true,
},
};
describe('emit asserts for: ', () => {
for (const [caseName, opts] of Object.entries(TESTS)) {
it(caseName, function () {
const filePath = join(__dirname, 'fixtures', caseName, 'actual.js');
const {
code,
// @ts-ignore
metadata: {formatjs: data},
} = transform(filePath, {
pragma: '@react-intl',
...opts,
});
expect({
data,
code: code?.trim(),
}).toMatchSnapshot();
});
}
});
test('extractSourceLocation', function () {
const filePath = join(
__dirname,
'fixtures',
'extractSourceLocation',
'actual.js'
);
const {
code,
// @ts-ignore
metadata: {formatjs: data},
} = transform(filePath, {
pragma: '@react-intl',
extractSourceLocation: true,
});
expect(code?.trim()).toMatchSnapshot();
expect(data).toMatchSnapshot({
messages: [
{
file: expect.any(String),
start: expect.any(Object),
end: expect.any(Object),
},
],
});
});
describe('errors', () => {
it('Properly throws parse errors', () => {
expect(() =>
transform(join(__dirname, 'fixtures', 'icuSyntax', 'actual.js'))
).toThrow(/Expected .* but "\." found/);
});
});
let cacheBust = 1;
function transform(
filePath: string,
options = {},
{multiplePasses = false} = {}
) {
function getPluginConfig() {
return [plugin, options, Date.now() + '' + ++cacheBust];
}
return transformFileSync(filePath, {
plugins: multiplePasses
? [
'module:@babel/plugin-syntax-jsx',
getPluginConfig(),
getPluginConfig(),
]
: ['module:@babel/plugin-syntax-jsx', getPluginConfig()],
})!;
}