Add new code new version
[sdc.git] / openecomp-ui / tools / gulp / deployment / tools / gulp / tasks / i18nUpdate.js
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 var gulp, replace, rename, fs, prompt, Promise;
22
23 function mergePromptOptions(options) {
24
25         return new Promise(function(resolve, reject) {
26                 var lang = options.lang;
27                 var warDir = options.warDir;
28                 prompt.start();
29                 prompt.get([
30                         {
31                                 description: 'Enter war directory',
32                                 default: warDir,
33                                 name: 'warDir'
34                         },
35                         {
36                                 description: 'Enter locale.json parent directory name',
37                                 default: lang,
38                                 name: 'lang'
39                         }
40                 ], function (err, result) {
41
42                         if(err) {
43                                 reject(new Error('mergePromptOptions::>\n    ' + err));
44                                 return;
45                         }
46
47                         var warDir = result.warDir;
48                         var lang = result.lang;
49
50                         console.log('\nlocale.json parent directory name> "' + lang + '"');
51                         console.log('war director>"' + warDir + '"');
52
53                         resolve({
54                                 warDir: warDir,
55                                 lang: lang
56                         });
57                 });
58         });
59 }
60
61 function isBundleExists(path) {
62         return new Promise(function(resolve) {
63                 fs.stat(path, function(err) {
64                         resolve(null == err);
65                         /*if null == err then file exists.*/
66                 });
67         });
68 }
69
70 function copyEnglishBundle(enBundlePath, lang) {
71         return new Promise(function(resolve, reject) {
72                 gulp.src(enBundlePath, {base: './'})
73                         .pipe(rename({basename: 'bundle_' + lang}))
74                         .pipe(gulp.dest('./'))
75                         .on('end', function() {
76                                 resolve();
77                         })
78                         .on('error', function(err) {
79                                 reject(new Error('copyEnglishBundle::>\n    ' + err));
80                         });
81         });
82 }
83
84 function getLocaleContent(localePath) {
85
86         return new Promise(function(resolve, reject) {
87                 fs.readFile(localePath, {encoding: 'utf-8'}, function(err,data){
88                         if(err) {
89                                 reject('getLocaleContent()::>\n    ' + err);
90                                 return;
91                         }
92                         resolve(data);
93                 });
94         });
95
96 }
97
98 function extractLocaleJsonContent(localeDataStr) {
99
100         var localeJsonStrI18nStartIdx = localeDataStr.indexOf('I18N_IDENTIFIER_START');
101         var localeJsonStrI18nEndIdx = localeDataStr.indexOf('I18N_IDENTIFIER_END');
102
103         if(-1 === localeJsonStrI18nStartIdx || -1 === localeJsonStrI18nEndIdx) {
104                 return Promise.reject(new Error('extractLocaleJsonContent::> localeDataStr must contain %I18N_IDENTIFIER_START% and %I18N_IDENTIFIER_END%'));
105         }
106
107         var localeJsonStr = localeDataStr.substring(
108                 localeDataStr.indexOf('{', localeJsonStrI18nStartIdx),
109                 localeDataStr.lastIndexOf('}', localeJsonStrI18nEndIdx) + 1
110         );
111
112         try {
113                 JSON.parse(localeJsonStr);
114         } catch(e) {
115                 return Promise.reject(new Error('extractLocaleJsonContent::> localeDataStr must contain a valid json between %I18N_IDENTIFIER_START% and %I18N_IDENTIFIER_END%=>' + e));
116         }
117
118         return Promise.resolve(localeJsonStr);
119 }
120
121 function setBundleLocaleContent(bundlePath, localeJsonStr) {
122         return new Promise(function(resolve, reject) {
123                 gulp.src(bundlePath, {base: './'})
124                         .pipe(replace(/I18N_IDENTIFIER_START(.|[\r\n])*?I18N_IDENTIFIER_END/i, function(expr) {
125                                 return expr.substring(0, expr.indexOf('{')) + localeJsonStr + expr.substring(expr.lastIndexOf('}') + 1);
126                         }))
127                         .pipe(gulp.dest('./'))
128                         .on('end', function() {
129                                 resolve();
130                         })
131                         .on('error', function(err) {
132                                 reject(new Error('setBundleLocaleContent::>\n    ' + err));
133                         });
134         });
135 }
136
137
138 function update(options) {
139
140         gulp = require('gulp');
141         replace = require('gulp-replace');
142         rename = require('gulp-rename');
143         fs = require('fs');
144         prompt = require('prompt');
145         Promise = require('bluebird');
146
147         return mergePromptOptions(options).then(function(mergedOptions) {
148                 var lang = mergedOptions.lang;
149                 var warDir = mergedOptions.warDir;
150
151                 var bundlePath = warDir + '/js/bundle_' + lang + '.js';
152                 var localePath = warDir + '/i18n/' + lang + '/locale.json';
153
154                 return isBundleExists(bundlePath)
155                         .then(function(isBundleExist) {
156                                 var englishBundlePath;
157                                 if(!isBundleExist) {
158                                         englishBundlePath = warDir + '/js/bundle_en.js';
159                                         return copyEnglishBundle(englishBundlePath, lang);
160                                 }
161                         })
162                         .then(getLocaleContent.bind(null, localePath))
163                         .then(extractLocaleJsonContent)
164                         .then(setBundleLocaleContent.bind(null, bundlePath));
165         });
166
167 }
168
169
170
171 module.exports = update;