aboutsummaryrefslogtreecommitdiffstats
path: root/library/moment/tasks/embed_locales.js
blob: 5027af10cd20338578342ed86180d6832b7ad1d6 (plain) (blame)
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
module.exports = function (grunt) {
    grunt.registerTask('embedLocales', function () {
        var config = grunt.config('embedLocales');

        var files = grunt.file.expand(config.targetLocales);
        var embeddedContents = determineEmbeddedContent(files);

        var momentContents = grunt.file.read(config.moment);
        var modifiedContents = momentContents.replace('/* EMBED_LOCALES */', function () {
            // If we don't do this, $ symbols in locale files may get interpreted in
            // the regex replacement
            return embeddedContents;
        });

        grunt.file.write(config.dest, modifiedContents);
    });

    var languageReset = 'moment.locale(\'en\');';

    function determineEmbeddedContent(files) {
        var embeddedContent = '';
        files.forEach(function (file) {
            embeddedContent += transformFile(file);
        });
        embeddedContent += '\n    ' + languageReset + '\n';
        return embeddedContent;
    }

    var reTransform = /function \(factory\) \{[^]*\}(?=\(function \(moment\) \{)/gm;
    var replaceWith =
        'function (factory) {\n' +
        '    factory(moment);\n' +
        '}';

    function transformFile(file) {
        var fileContents = grunt.file.read(file);

        if (!fileContents.match(reTransform)) {
            grunt.warn('Warning: all locale files must use the common UMD wrapper pattern. Failed locale file: ' + file);
            return '';
        }

        return fileContents.replace(reTransform, replaceWith);
    }
};