-
Notifications
You must be signed in to change notification settings - Fork 154
/
index.js
61 lines (53 loc) · 1.69 KB
/
index.js
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
const loaderUtils = require('loader-utils');
const MessageFormat = require('@messageformat/core');
const compileModule = require('@messageformat/core/compile-module');
const convertToMessageFormat = require('@messageformat/convert');
const { parse } = require('dot-properties');
const { relative } = require('path');
const uv = require('uv');
const YAML = require('yaml');
function localeFromResourcePath(resourcePath, locales) {
const parts = resourcePath.split(/[._/\\]+/);
let locale = null;
let lcPos = -1;
for (const lc of locales) {
const idx = parts.indexOf(lc);
if (idx > lcPos) {
locale = lc;
lcPos = idx;
}
}
return locale || locales;
}
module.exports = function loadMessages(content) {
let {
convert,
encoding,
locale,
propKeyPath = true,
...mfOpt
} = loaderUtils.getOptions(this) || {};
if (!encoding || encoding === 'auto') {
encoding = uv(content) ? 'utf8' : 'latin1';
}
const input = content.toString(encoding);
let messages = this.resourcePath.endsWith('.properties')
? parse(input, propKeyPath)
: YAML.parse(input);
if (convert) {
const cm = convertToMessageFormat(messages, convert);
if (!locale) locale = cm.locales;
messages = cm.translations;
}
if (typeof locale === 'string' && locale.indexOf(',') !== -1) {
locale = locale.split(',');
}
if (Array.isArray(locale) && locale.length > 1) {
const relPath = relative(process.cwd(), this.resourcePath);
locale = localeFromResourcePath(relPath, locale);
}
const messageFormat = new MessageFormat(locale, mfOpt);
return compileModule(messageFormat, messages);
};
// get content as Buffer rather than string
module.exports.raw = true;