@zohodesk/react-cli 0.0.1-exp.175.1 → 0.0.1-exp.176.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +35 -40
- package/docs/SelectorWeight.md +6 -0
- package/docs/VariableConversion.md +33 -1
- package/lib/babel/cmjs-plugins-presets.js +4 -0
- package/lib/babel/es-plugins-presets.js +4 -0
- package/lib/common/getEntries.js +10 -0
- package/lib/common/getPublicPathConfig.js +6 -0
- package/lib/common/index.js +5 -0
- package/lib/common/splitChunks.js +13 -2
- package/lib/common/sslcertUpdater.js +17 -6
- package/lib/common/templateParameters.js +2 -0
- package/lib/common/testPattern.js +21 -10
- package/lib/common/valueReplacer.js +15 -0
- package/lib/configs/jest.config.js +9 -0
- package/lib/configs/libAlias.js +2 -4
- package/lib/configs/webpack.component.umd.config.js +5 -0
- package/lib/configs/webpack.css.umd.config.js +13 -5
- package/lib/configs/webpack.dev.config.js +36 -2
- package/lib/configs/webpack.docs.config.js +21 -1
- package/lib/configs/webpack.impact.config.js +19 -1
- package/lib/configs/webpack.prod.config.js +37 -3
- package/lib/hooks/docsProptypeHook.js +7 -3
- package/lib/jest/commitedFilesResult.js +45 -3
- package/lib/jest/coverageCollector.js +11 -0
- package/lib/jest/jsonMaker.js +6 -0
- package/lib/jest/preProcessors/cssPreprocessor.js +8 -0
- package/lib/jest/preProcessors/jsPreprocessor.js +2 -0
- package/lib/jest/preProcessors/otherFilesPreprocessor.js +3 -0
- package/lib/jest/result.js +22 -0
- package/lib/jest/run.js +17 -6
- package/lib/jest/setup.js +57 -5
- package/lib/loaderUtils/configsAssetsLoaders.js +11 -1
- package/lib/loaderUtils/getCSSLoaders.js +35 -20
- package/lib/loaderUtils/getDevJsLoaders.js +8 -0
- package/lib/loaderUtils/index.js +3 -0
- package/lib/loaderUtils/windowsModification.js +11 -0
- package/lib/loaders/docsLoader.js +7 -0
- package/lib/loaders/docsPropsLoader.js +7 -3
- package/lib/loaders/fileBountryLoader.js +2 -0
- package/lib/loaders/fileLoader.js +22 -11
- package/lib/loaders/scriptInstrumentLoader.js +13 -5
- package/lib/loaders/selectorMappingLoader.js +25 -7
- package/lib/loaders/workerLoader.js +20 -4
- package/lib/middlewares/HMRMiddleware.js +26 -13
- package/lib/middlewares/SSTMiddleware.js +3 -0
- package/lib/pluginUtils/configHtmlWebpackPlugins.js +9 -3
- package/lib/pluginUtils/getDevPlugins.js +63 -17
- package/lib/pluginUtils/getDocsPlugins.js +10 -1
- package/lib/pluginUtils/getLibraryImactPlugins.js +5 -4
- package/lib/pluginUtils/getLibraryPlugins.js +5 -0
- package/lib/pluginUtils/getProdPlugins.js +72 -23
- package/lib/pluginUtils/getServerPlugins.js +5 -0
- package/lib/pluginUtils/getUMDCSSPlugins.js +7 -0
- package/lib/pluginUtils/getUMDComponentPlugins.js +7 -0
- package/lib/pluginUtils/index.js +8 -0
- package/lib/plugins/CdnChangePlugin.js +14 -0
- package/lib/plugins/CleanupStatsPlugin.js +5 -0
- package/lib/plugins/EFCPlugin.js +34 -23
- package/lib/plugins/EFCTemplatePlugin.js +32 -23
- package/lib/plugins/I18NInjectIntoIndexPlugin.js +34 -8
- package/lib/plugins/I18nSplitPlugin/I18nDebugPlugin.js +17 -12
- package/lib/plugins/I18nSplitPlugin/I18nDependency.js +10 -4
- package/lib/plugins/I18nSplitPlugin/I18nDownlodLogic.js +39 -8
- package/lib/plugins/I18nSplitPlugin/I18nFilesEmitter.js +29 -14
- package/lib/plugins/I18nSplitPlugin/I18nKeysIdentifer.js +22 -13
- package/lib/plugins/I18nSplitPlugin/index.js +23 -13
- package/lib/plugins/I18nSplitPlugin/utils/collectI18nKeys.js +12 -2
- package/lib/plugins/I18nSplitPlugin/utils/getI18nFileUrlPathTemplate.js +1 -0
- package/lib/plugins/I18nSplitPlugin/utils/getI18nKeysFormModules.js +5 -0
- package/lib/plugins/I18nSplitPlugin/utils/hashUtils.js +6 -0
- package/lib/plugins/I18nSplitPlugin/utils/index.js +4 -0
- package/lib/plugins/I18nSplitPlugin/utils/propertiesUtils.js +20 -2
- package/lib/plugins/ManifestPlugin.js +17 -0
- package/lib/plugins/ModuleStatsPlugin.js +23 -0
- package/lib/plugins/OptimizeJSPlugin.js +7 -0
- package/lib/plugins/PublicPathCallbackPlugin.js +10 -0
- package/lib/plugins/PublicPathChangePlugin.js +36 -4
- package/lib/plugins/ReportGeneratePlugin.js +30 -4
- package/lib/plugins/RequireVariablePublicPlugin.js +6 -0
- package/lib/plugins/ResourceHintsPlugin.js +10 -3
- package/lib/plugins/RtlSplitPlugin/OverwriteCssPathForRTL.js +17 -12
- package/lib/plugins/RtlSplitPlugin/RtlCssPlugin.js +16 -9
- package/lib/plugins/RtlSplitPlugin/replaceCssDirTemplate.js +5 -2
- package/lib/plugins/ScriptInstrumentPlugin.js +7 -0
- package/lib/plugins/SelectorPlugin.js +97 -0
- package/lib/plugins/ServiceWorkerPlugin.js +20 -4
- package/lib/plugins/ShadowDOMSupportPlugin.js +40 -3
- package/lib/plugins/SourceMapHookPlugin.js +9 -0
- package/lib/plugins/TPHashMappingPlugin.js +15 -1
- package/lib/plugins/UglifyCSSPlugin.js +9 -0
- package/lib/plugins/UnusedFilesFindPlugin.js +35 -2
- package/lib/plugins/VariableConversionCollector.js +252 -0
- package/lib/plugins/composeCommonPlugin.js +30 -0
- package/lib/plugins/index.js +19 -0
- package/lib/plugins/libraryImpactPlugin.js +32 -0
- package/lib/plugins/webpackwatchrunplugin.js +5 -0
- package/lib/postcss-plugins/ExcludePlugin.js +4 -0
- package/lib/postcss-plugins/RTLSplitPlugin.js +27 -14
- package/lib/postcss-plugins/ValueReplacer.js +6 -9
- package/lib/postcss-plugins/__test__/hoverActivePlugin.spec.js +3 -0
- package/lib/postcss-plugins/hoverActivePlugin.js +66 -30
- package/lib/postcss-plugins/variableModificationPlugin/ErrorHandler.js +40 -13
- package/lib/postcss-plugins/variableModificationPlugin/index.js +215 -141
- package/lib/postcss-plugins/variableModifier.js +20 -13
- package/lib/schemas/index.js +23 -4
- package/lib/servers/clusterHubServer.js +10 -0
- package/lib/servers/devBuild.js +24 -13
- package/lib/servers/docsServer.js +2 -0
- package/lib/servers/docsServerCore.js +21 -0
- package/lib/servers/getCliPath.js +9 -0
- package/lib/servers/helpServer.js +5 -0
- package/lib/servers/httpsOptions.js +4 -0
- package/lib/servers/impactServer.js +34 -2
- package/lib/servers/mockserver.js +9 -0
- package/lib/servers/nowatchserver.js +34 -12
- package/lib/servers/scrServer.js +20 -13
- package/lib/servers/server.js +35 -7
- package/lib/servers/ssServer.js +16 -0
- package/lib/templates/CoverageScriptTemplate.js +14 -0
- package/lib/templates/WMSTemplate.js +12 -6
- package/lib/utils/babelPresets.js +2 -0
- package/lib/utils/clean.js +8 -2
- package/lib/utils/copy.js +6 -0
- package/lib/utils/copyTimezones.js +8 -0
- package/lib/utils/createEventStream.js +4 -0
- package/lib/utils/cssClassNameGenerate.js +19 -3
- package/lib/utils/cssURLReplacer.js +50 -38
- package/lib/utils/dependencyPostPublish.js +9 -0
- package/lib/utils/fileUtils.js +26 -0
- package/lib/utils/folderIterator.js +10 -0
- package/lib/utils/getComponents.js +21 -0
- package/lib/utils/getCurrentBranch.js +5 -0
- package/lib/utils/getDependenciesImpactList.js +21 -0
- package/lib/utils/getFileType.js +49 -0
- package/lib/utils/getHash.js +7 -0
- package/lib/utils/getIp.js +2 -0
- package/lib/utils/getOptions.js +39 -14
- package/lib/utils/getServerURL.js +7 -0
- package/lib/utils/index.js +47 -2
- package/lib/utils/init.js +1 -0
- package/lib/utils/initPreCommitHook.js +29 -6
- package/lib/utils/jsonHelper.js +19 -2
- package/lib/utils/libraryImpactConfig.js +2 -0
- package/lib/utils/lint/addScripts.js +5 -2
- package/lib/utils/lint/checkExistingConfig.js +12 -3
- package/lib/utils/lint/copyConfigs.js +3 -0
- package/lib/utils/lint/index.js +9 -0
- package/lib/utils/lint/lintScripts.js +1 -0
- package/lib/utils/lint/lintSetup.js +4 -3
- package/lib/utils/lint/lintStagedPreCommitHook.js +1 -0
- package/lib/utils/lint/question.js +7 -0
- package/lib/utils/lintReporter.js +20 -0
- package/lib/utils/mailSender.js +7 -0
- package/lib/utils/pullOrigin.js +4 -0
- package/lib/utils/reinstallDependencies.js +28 -0
- package/lib/utils/removeAttributes.js +7 -0
- package/lib/utils/repoClone.js +27 -2
- package/lib/utils/request.js +12 -0
- package/lib/utils/rtl.js +16 -4
- package/lib/utils/setEnvVariables.js +2 -0
- package/lib/utils/ssTestHack.js +10 -0
- package/lib/utils/switchBranch.js +4 -0
- package/lib/utils/urlConcat.js +4 -0
- package/lib/utils/useExitCleanup.js +10 -9
- package/package.json +10 -9
|
@@ -4,10 +4,15 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
+
|
|
7
8
|
var _webpack = require("webpack");
|
|
9
|
+
|
|
8
10
|
var _I18nKeysIdentifer = _interopRequireDefault(require("./I18nKeysIdentifer"));
|
|
11
|
+
|
|
9
12
|
var _hashUtils = require("./utils/hashUtils");
|
|
13
|
+
|
|
10
14
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
|
+
|
|
11
16
|
/**
|
|
12
17
|
* this plugin for the download i18n files
|
|
13
18
|
* So, if need to downoad i18n in browser this plugin handle that
|
|
@@ -26,27 +31,32 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
26
31
|
* some thing missing in this definetion
|
|
27
32
|
*
|
|
28
33
|
*/
|
|
29
|
-
|
|
30
34
|
// import { REGEXP_HASH, REGEXP_CHUNKHASH } from './utils/hashUtils';
|
|
35
|
+
const pluginName = 'DownloadLogicOfI18n'; // const pluginName = 'i18n-plugin';
|
|
31
36
|
|
|
32
|
-
const pluginName = 'DownloadLogicOfI18n';
|
|
33
|
-
// const pluginName = 'i18n-plugin';
|
|
34
37
|
const MODULE_TYPE = 'json/i18n';
|
|
38
|
+
|
|
35
39
|
const ltype = locale => `${MODULE_TYPE}/${locale}`;
|
|
40
|
+
|
|
36
41
|
function hashesWithLength(hashes, length) {
|
|
37
42
|
const shortChunkHashMap = {};
|
|
43
|
+
|
|
38
44
|
for (let key of Object.keys(hashes)) {
|
|
39
45
|
if (typeof hashes[key] === 'string') {
|
|
40
46
|
shortChunkHashMap[key] = hashes.slice(0, length);
|
|
41
47
|
}
|
|
42
48
|
}
|
|
49
|
+
|
|
43
50
|
return shortChunkHashMap;
|
|
44
51
|
}
|
|
52
|
+
|
|
45
53
|
function getContentHashMaxLength(filenameTemplate) {
|
|
46
54
|
let length = 0;
|
|
47
55
|
let matches = filenameTemplate.match(_hashUtils.REGEXP_CONTENTHASH);
|
|
56
|
+
|
|
48
57
|
for (let match of matches) {
|
|
49
58
|
let tem = match.match(/\d+/);
|
|
59
|
+
|
|
50
60
|
if (tem) {
|
|
51
61
|
length = Math.max(parseInt(tem[0]), length);
|
|
52
62
|
} else {
|
|
@@ -54,8 +64,10 @@ function getContentHashMaxLength(filenameTemplate) {
|
|
|
54
64
|
break;
|
|
55
65
|
}
|
|
56
66
|
}
|
|
67
|
+
|
|
57
68
|
return length;
|
|
58
69
|
}
|
|
70
|
+
|
|
59
71
|
class I18nDownlodLogic {
|
|
60
72
|
constructor({
|
|
61
73
|
filenameTemplate,
|
|
@@ -70,36 +82,47 @@ class I18nDownlodLogic {
|
|
|
70
82
|
localeVarName
|
|
71
83
|
};
|
|
72
84
|
}
|
|
85
|
+
|
|
73
86
|
getShortContentHashes(chunk, hashLength) {
|
|
74
87
|
let allContenHashes = {};
|
|
75
88
|
const chunkMaps = chunk.getChunkMaps();
|
|
76
89
|
this.locales.forEach(locale => {
|
|
77
90
|
allContenHashes[locale] = chunkMaps.contentHash[ltype(locale)];
|
|
78
91
|
});
|
|
92
|
+
|
|
79
93
|
if (!length) {
|
|
80
94
|
return allContenHashes;
|
|
81
95
|
}
|
|
96
|
+
|
|
82
97
|
let shortContentHashMap = {};
|
|
98
|
+
|
|
83
99
|
for (const locale of this.locales) {
|
|
84
100
|
shortContentHashMap[locale] = hashesWithLength(allContenHashes[locale], hashLength);
|
|
85
101
|
}
|
|
102
|
+
|
|
86
103
|
return shortContentHashMap;
|
|
87
104
|
}
|
|
105
|
+
|
|
88
106
|
getI18nChunkObject(mainChunk) {
|
|
89
107
|
const obj = {};
|
|
108
|
+
|
|
90
109
|
for (const chunk of mainChunk.getAllAsyncChunks()) {
|
|
91
110
|
if (_I18nKeysIdentifer.default.isChunkHasI18n(chunk)) {
|
|
92
111
|
obj[chunk.id] = 1;
|
|
93
112
|
}
|
|
94
113
|
}
|
|
114
|
+
|
|
95
115
|
return obj;
|
|
96
116
|
}
|
|
117
|
+
|
|
97
118
|
addDownloadLogicOfI18nInMainTemplate(mainTemplate) {
|
|
98
119
|
mainTemplate.hooks.localVars.tap(pluginName, (source, mainChunk) => {
|
|
99
120
|
const chunkMap = this.getI18nChunkObject(mainChunk);
|
|
121
|
+
|
|
100
122
|
if (!Object.keys(chunkMap).length) {
|
|
101
123
|
return source;
|
|
102
124
|
}
|
|
125
|
+
|
|
103
126
|
return _webpack.Template.asString([source, '', '// object to store loaded I18N chunks', 'var installedI18nChunks = {', _webpack.Template.indent(mainChunk.ids.map(id => `${JSON.stringify(id)}: 0`).join(',\n')), '};']);
|
|
104
127
|
});
|
|
105
128
|
mainTemplate.hooks.requireEnsure.tap(pluginName, (source, mainChunk, hash) => {
|
|
@@ -109,6 +132,7 @@ class I18nDownlodLogic {
|
|
|
109
132
|
* if any chunk has i18n then we must write our download i18n logic,
|
|
110
133
|
*/
|
|
111
134
|
const chunkMap = this.getI18nChunkObject(mainChunk);
|
|
135
|
+
|
|
112
136
|
if (!Object.keys(chunkMap).length) {
|
|
113
137
|
return source;
|
|
114
138
|
}
|
|
@@ -117,6 +141,8 @@ class I18nDownlodLogic {
|
|
|
117
141
|
* @property {Object} hash [it has key as chunk id and value as chunkHash ]
|
|
118
142
|
* @property {Object} name [it has key as chunk id and value as chunk name ]
|
|
119
143
|
*/
|
|
144
|
+
|
|
145
|
+
|
|
120
146
|
const chunkMaps = mainChunk.getChunkMaps();
|
|
121
147
|
const {
|
|
122
148
|
crossOriginLoading
|
|
@@ -125,18 +151,19 @@ class I18nDownlodLogic {
|
|
|
125
151
|
filenameTemplate,
|
|
126
152
|
localeVarName = 'document.documentElement.lang'
|
|
127
153
|
} = this.options;
|
|
128
|
-
const i18nSrcPath = mainTemplate.getAssetPath(JSON.stringify(filenameTemplate).replace(/\[locale\]/gi, '"+ locale +"'),
|
|
129
|
-
// "i18n-chunk/[locale]/[name].[chunkhash].js"
|
|
154
|
+
const i18nSrcPath = mainTemplate.getAssetPath(JSON.stringify(filenameTemplate).replace(/\[locale\]/gi, '"+ locale +"'), // "i18n-chunk/[locale]/[name].[chunkhash].js"
|
|
130
155
|
{
|
|
131
156
|
hash: `" + ${mainTemplate.renderCurrentHashCode(hash)} + "`,
|
|
132
157
|
hashWithLength: length => `" + ${mainTemplate.renderCurrentHashCode(hash, length)} + "`,
|
|
133
158
|
chunk: {
|
|
134
159
|
id: '" + chunkId + "',
|
|
135
160
|
hash: `" + ${JSON.stringify(chunkMaps.hash)}[chunkId] + "`,
|
|
161
|
+
|
|
136
162
|
hashWithLength(length) {
|
|
137
163
|
const shortChunkHashMap = hashesWithLength(chunkMaps.hash, length);
|
|
138
164
|
return `" + ${JSON.stringify(shortChunkHashMap)}[chunkId] + "`;
|
|
139
165
|
},
|
|
166
|
+
|
|
140
167
|
// contentHash: contentHashMap,
|
|
141
168
|
// contentHashWithLength: contentHashLengthMap,
|
|
142
169
|
contentHash: {
|
|
@@ -149,7 +176,6 @@ class I18nDownlodLogic {
|
|
|
149
176
|
},
|
|
150
177
|
contentHashType: MODULE_TYPE
|
|
151
178
|
});
|
|
152
|
-
|
|
153
179
|
/** IDEA:
|
|
154
180
|
* as my suggestion ignore this `jsop` approch,
|
|
155
181
|
* Because json parse is faster then js parse.
|
|
@@ -167,13 +193,16 @@ class I18nDownlodLogic {
|
|
|
167
193
|
buf.push(`var chunkHashes = ${JSON.stringify(chunkMaps.hash)};`);
|
|
168
194
|
}
|
|
169
195
|
*/
|
|
196
|
+
|
|
170
197
|
if ((0, _hashUtils.hasContentHash)(filenameTemplate)) {
|
|
171
198
|
const hashLength = getContentHashMaxLength(filenameTemplate);
|
|
172
199
|
const contentHashes = this.getShortContentHashes(mainChunk, hashLength);
|
|
173
200
|
buf.push(_webpack.Template.asString(['// all i18n files contentHash ', `var i18nContentHashes = ${JSON.stringify(contentHashes)};`, '', 'if (!i18nContentHashes[locale]) {', ' console.warn("this locale is "+locale + " not has support")', ' return;', '}', 'if (!i18nContentHashes[locale][chunkId]) {', ' console.warn("this chunkId is " + chunkId + " does not have \'"+locale+"\' locale chunk")', ' return;', '}']));
|
|
174
201
|
buf.push('var contentHash = i18nContentHashes[locale][chunkId]');
|
|
175
202
|
}
|
|
203
|
+
|
|
176
204
|
const hashUtils = _webpack.Template.asString(buf);
|
|
205
|
+
|
|
177
206
|
const publicPath = this.publicPath ? JSON.stringify(this.publicPath) : `${mainTemplate.requireFn}.p`;
|
|
178
207
|
return _webpack.Template.asString([source, `
|
|
179
208
|
(function() {
|
|
@@ -187,8 +216,7 @@ class I18nDownlodLogic {
|
|
|
187
216
|
} else if(installedI18nChunks[chunkId] !== 0 && i18nChunks[chunkId]) {
|
|
188
217
|
promises.push(installedI18nChunks[chunkId] = new Promise(function(resolve, reject) {
|
|
189
218
|
var srcPath = (${i18nSrcPath});
|
|
190
|
-
${''
|
|
191
|
-
// TODO: I think this is the area for download chunk of i18n we can
|
|
219
|
+
${'' // TODO: I think this is the area for download chunk of i18n we can
|
|
192
220
|
// change mainTemplate.requireFn as our cdn server urls !!!
|
|
193
221
|
// and we can change the i18n download logic here
|
|
194
222
|
}
|
|
@@ -223,6 +251,7 @@ class I18nDownlodLogic {
|
|
|
223
251
|
})()`]);
|
|
224
252
|
});
|
|
225
253
|
}
|
|
254
|
+
|
|
226
255
|
apply(compiler) {
|
|
227
256
|
compiler.hooks.thisCompilation.tap(pluginName, compilation => {
|
|
228
257
|
const {
|
|
@@ -231,5 +260,7 @@ class I18nDownlodLogic {
|
|
|
231
260
|
this.addDownloadLogicOfI18nInMainTemplate(mainTemplate);
|
|
232
261
|
});
|
|
233
262
|
}
|
|
263
|
+
|
|
234
264
|
}
|
|
265
|
+
|
|
235
266
|
exports.default = I18nDownlodLogic;
|
|
@@ -4,19 +4,24 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
+
|
|
7
8
|
var _webpackSources = require("webpack-sources");
|
|
9
|
+
|
|
8
10
|
var _utils = require("./utils");
|
|
11
|
+
|
|
9
12
|
var _getI18nKeysFormModules = _interopRequireDefault(require("./utils/getI18nKeysFormModules"));
|
|
13
|
+
|
|
10
14
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
|
+
|
|
11
16
|
/**
|
|
12
17
|
* this plugin was creating the chunk specific i18n chunk's.
|
|
13
18
|
*/
|
|
14
|
-
|
|
15
19
|
// this plugin's kick starter is apply method
|
|
16
|
-
|
|
17
20
|
const pluginName = 'I18nFilesEmitter';
|
|
18
21
|
const MODULE_TYPE = 'json/i18n';
|
|
22
|
+
|
|
19
23
|
const i18ntype = locale => `${MODULE_TYPE}/${locale}`;
|
|
24
|
+
|
|
20
25
|
class I18nFilesEmitter {
|
|
21
26
|
constructor({
|
|
22
27
|
allI18nObject,
|
|
@@ -27,12 +32,13 @@ class I18nFilesEmitter {
|
|
|
27
32
|
}) {
|
|
28
33
|
this.locales = locales;
|
|
29
34
|
this.allI18nObject = allI18nObject;
|
|
30
|
-
this.filenameTemplate = filenameTemplate;
|
|
31
|
-
|
|
35
|
+
this.filenameTemplate = filenameTemplate; // this.filenameTemplate = "i18n-chunk/[locale]/[name].js"
|
|
36
|
+
|
|
32
37
|
this.jsonpFunc = jsonpFunc;
|
|
33
38
|
this.prevHashes = {};
|
|
34
39
|
this.i18nManifestFileName = i18nManifestFileName;
|
|
35
40
|
}
|
|
41
|
+
|
|
36
42
|
emitAsset(compilation, filename, source, info) {
|
|
37
43
|
// NOTE: info support available since webpack v4.40.0 https://webpack.js.org/api/stats/#asset-objects
|
|
38
44
|
if (!compilation.emitAsset) {
|
|
@@ -40,9 +46,9 @@ class I18nFilesEmitter {
|
|
|
40
46
|
} else {
|
|
41
47
|
compilation.emitAsset(filename, source, info);
|
|
42
48
|
}
|
|
43
|
-
}
|
|
49
|
+
} // this method for create object and assign value for i18nkeys
|
|
50
|
+
|
|
44
51
|
|
|
45
|
-
// this method for create object and assign value for i18nkeys
|
|
46
52
|
getI18nObjectByLocale(i18nKeys, locale) {
|
|
47
53
|
const data = {};
|
|
48
54
|
i18nKeys.forEach(key => {
|
|
@@ -50,10 +56,10 @@ class I18nFilesEmitter {
|
|
|
50
56
|
});
|
|
51
57
|
return data;
|
|
52
58
|
}
|
|
59
|
+
|
|
53
60
|
getTemplateString(i18nKeys, locale) {
|
|
54
61
|
let i18nObject = this.getI18nObjectByLocale(i18nKeys, locale);
|
|
55
|
-
return `${this.jsonpFunc}(${(0, _utils.jsonToString)(i18nObject)});`;
|
|
56
|
-
// return `${this.jsonpFunc}(JSON.parse(${JSON.stringify(jsonToString(i18nObject))}));`;
|
|
62
|
+
return `${this.jsonpFunc}(${(0, _utils.jsonToString)(i18nObject)});`; // return `${this.jsonpFunc}(JSON.parse(${JSON.stringify(jsonToString(i18nObject))}));`;
|
|
57
63
|
}
|
|
58
64
|
|
|
59
65
|
renderI18nLocaleChunk(chunk, locale, i18nKeys) {
|
|
@@ -71,6 +77,7 @@ class I18nFilesEmitter {
|
|
|
71
77
|
hash: chunk.contentHash[i18ntype(locale)]
|
|
72
78
|
};
|
|
73
79
|
}
|
|
80
|
+
|
|
74
81
|
emitI18nFilesForChunk(chunk, compilation) {
|
|
75
82
|
const i18nKeys = (0, _getI18nKeysFormModules.default)(chunk.modulesIterable);
|
|
76
83
|
const manifestForChunk = {
|
|
@@ -78,12 +85,14 @@ class I18nFilesEmitter {
|
|
|
78
85
|
hasI18n: false,
|
|
79
86
|
hasChanges: false
|
|
80
87
|
};
|
|
88
|
+
|
|
81
89
|
if (!i18nKeys.length) {
|
|
82
90
|
// why it is not checked as 0
|
|
83
91
|
return manifestForChunk;
|
|
84
92
|
}
|
|
85
|
-
|
|
86
|
-
// const locales = ['en_US'];
|
|
93
|
+
|
|
94
|
+
manifestForChunk.hasI18n = true; // const locales = ['en_US'];
|
|
95
|
+
|
|
87
96
|
this.locales.forEach(locale => {
|
|
88
97
|
const result = this.renderI18nLocaleChunk(chunk, locale, i18nKeys, compilation);
|
|
89
98
|
const {
|
|
@@ -95,31 +104,34 @@ class I18nFilesEmitter {
|
|
|
95
104
|
} = result;
|
|
96
105
|
const filePath = compilation.getPath(filenameTemplate, pathOptions);
|
|
97
106
|
manifestForChunk.assets[locale] = filePath;
|
|
107
|
+
|
|
98
108
|
if (this.prevHashes[identifier] === hash) {
|
|
99
109
|
return;
|
|
100
110
|
}
|
|
111
|
+
|
|
101
112
|
manifestForChunk.hasChanges = true;
|
|
102
113
|
this.prevHashes[identifier] = hash;
|
|
103
114
|
this.emitAsset(compilation, filePath, render(), {
|
|
104
115
|
locale,
|
|
105
116
|
chunkId: chunk.id,
|
|
106
117
|
chunkName: chunk.name
|
|
107
|
-
});
|
|
108
|
-
// compilation.assets[filePath] = render();
|
|
118
|
+
}); // compilation.assets[filePath] = render();
|
|
109
119
|
});
|
|
110
|
-
|
|
111
120
|
return manifestForChunk;
|
|
112
121
|
}
|
|
122
|
+
|
|
113
123
|
emitI18nAssert(compilation) {
|
|
114
124
|
let manifest = {};
|
|
115
125
|
let needEmitManifest = false;
|
|
116
126
|
compilation.chunks.forEach(chunk => {
|
|
117
127
|
const manifestForChunk = this.emitI18nFilesForChunk(chunk, compilation);
|
|
128
|
+
|
|
118
129
|
if (manifestForChunk.hasI18n) {
|
|
119
130
|
manifest[chunk.id] = manifestForChunk.assets;
|
|
120
131
|
needEmitManifest = needEmitManifest || manifestForChunk.hasChanges;
|
|
121
132
|
}
|
|
122
133
|
});
|
|
134
|
+
|
|
123
135
|
if (needEmitManifest) {
|
|
124
136
|
const manifestSource = new _webpackSources.RawSource(JSON.stringify(manifest));
|
|
125
137
|
this.emitAsset(compilation, this.i18nManifestFileName, manifestSource, {
|
|
@@ -127,6 +139,7 @@ class I18nFilesEmitter {
|
|
|
127
139
|
});
|
|
128
140
|
}
|
|
129
141
|
}
|
|
142
|
+
|
|
130
143
|
apply(compiler) {
|
|
131
144
|
/*
|
|
132
145
|
compiler.hooks.thisCompilation.tap(pluginName, compilation => {
|
|
@@ -149,7 +162,6 @@ class I18nFilesEmitter {
|
|
|
149
162
|
this.emitI18nAssert(compilation);
|
|
150
163
|
});
|
|
151
164
|
}
|
|
152
|
-
|
|
153
165
|
/*
|
|
154
166
|
renderChunk(result, compilation, chunk) {
|
|
155
167
|
const i18nKeys = getI18nKeysFormModules(chunk.modulesIterable);
|
|
@@ -164,5 +176,8 @@ class I18nFilesEmitter {
|
|
|
164
176
|
}
|
|
165
177
|
}
|
|
166
178
|
*/
|
|
179
|
+
|
|
180
|
+
|
|
167
181
|
}
|
|
182
|
+
|
|
168
183
|
exports.default = I18nFilesEmitter;
|
|
@@ -4,12 +4,16 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
+
|
|
7
8
|
var _utils = require("./utils");
|
|
9
|
+
|
|
8
10
|
var _I18nDependency = require("./I18nDependency");
|
|
11
|
+
|
|
9
12
|
var _NullFactory = _interopRequireDefault(require("webpack/lib/NullFactory"));
|
|
13
|
+
|
|
10
14
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
-
const pluginName = 'I18nKeysIdentifer';
|
|
12
15
|
|
|
16
|
+
const pluginName = 'I18nKeysIdentifer';
|
|
13
17
|
/**
|
|
14
18
|
* this plugin search the i18 keys and make it as I18nDependency.
|
|
15
19
|
* how it works?
|
|
@@ -19,22 +23,24 @@ const pluginName = 'I18nKeysIdentifer';
|
|
|
19
23
|
* after the walk of AST we get some I18n keys
|
|
20
24
|
* then we make it as I18nDependency.
|
|
21
25
|
*/
|
|
26
|
+
|
|
22
27
|
class I18nKeysIdentifer {
|
|
23
28
|
constructor(jsResourceI18nKeys) {
|
|
24
29
|
this.jsResourceI18nKeys = jsResourceI18nKeys;
|
|
25
30
|
}
|
|
31
|
+
|
|
26
32
|
defineConfigarationForI18nDependency(compilation) {
|
|
27
33
|
compilation.dependencyFactories.set(_I18nDependency.I18nDependency, new _NullFactory.default());
|
|
28
34
|
compilation.dependencyTemplates.set(_I18nDependency.I18nDependency, new _I18nDependency.I18nDependencyTemplate());
|
|
29
35
|
}
|
|
36
|
+
|
|
30
37
|
addI18nDependency(module, i18nKeys) {
|
|
31
38
|
const identifier = `i18n ${module.resource}`;
|
|
32
39
|
const dep = new _I18nDependency.I18nDependency({
|
|
33
40
|
identifier,
|
|
34
41
|
i18nKeys
|
|
35
42
|
}, module.context, 0);
|
|
36
|
-
module.addDependency(dep);
|
|
37
|
-
// console.log('module', i18nKeys, identifier);
|
|
43
|
+
module.addDependency(dep); // console.log('module', i18nKeys, identifier);
|
|
38
44
|
}
|
|
39
45
|
|
|
40
46
|
apply(compiler) {
|
|
@@ -42,23 +48,23 @@ class I18nKeysIdentifer {
|
|
|
42
48
|
// this below hook was tapped for we use I18nDependency
|
|
43
49
|
// so we must define module factory for I18nDependency
|
|
44
50
|
// and we must define how it import statement look like I18nDependencyTemplate
|
|
45
|
-
this.defineConfigarationForI18nDependency(compilation);
|
|
51
|
+
this.defineConfigarationForI18nDependency(compilation); // handler for parser
|
|
46
52
|
|
|
47
|
-
// handler for parser
|
|
48
53
|
let handler = parser => {
|
|
49
54
|
parser.hooks.program.tap(pluginName, (ast, commmets) => {
|
|
50
55
|
const {
|
|
51
56
|
module
|
|
52
|
-
} = parser.state;
|
|
53
|
-
|
|
57
|
+
} = parser.state; //
|
|
58
|
+
|
|
54
59
|
if (!(module && /\.jsx?$/.test(module.resource))) {
|
|
55
60
|
return;
|
|
56
|
-
}
|
|
57
|
-
|
|
61
|
+
} // i18n grep proper contract regex
|
|
62
|
+
|
|
63
|
+
|
|
58
64
|
let i18nKeys = (0, _utils.collectI18nKeysfromAST)(ast, this.jsResourceI18nKeys);
|
|
59
|
-
i18nKeys = i18nKeys.concat(
|
|
60
|
-
// i18n grep proper contract regex
|
|
65
|
+
i18nKeys = i18nKeys.concat( // i18n grep proper contract regex
|
|
61
66
|
(0, _utils.collectI18nKeysfromComments)(commmets, this.jsResourceI18nKeys));
|
|
67
|
+
|
|
62
68
|
if (i18nKeys.length) {
|
|
63
69
|
// console.log(
|
|
64
70
|
// 'i18nKeys.length',
|
|
@@ -68,17 +74,19 @@ class I18nKeysIdentifer {
|
|
|
68
74
|
this.addI18nDependency(module, i18nKeys);
|
|
69
75
|
}
|
|
70
76
|
});
|
|
71
|
-
};
|
|
77
|
+
}; // this below hook was tapped for collect I18n Key from files and add as Deppenensy
|
|
72
78
|
|
|
73
|
-
// this below hook was tapped for collect I18n Key from files and add as Deppenensy
|
|
74
79
|
|
|
75
80
|
const factory = params.normalModuleFactory;
|
|
76
81
|
factory.hooks.parser.for('javascript/auto').tap(pluginName, handler);
|
|
77
82
|
factory.hooks.parser.for('javascript/dynamic').tap(pluginName, handler);
|
|
78
83
|
});
|
|
79
84
|
}
|
|
85
|
+
|
|
80
86
|
}
|
|
87
|
+
|
|
81
88
|
exports.default = I18nKeysIdentifer;
|
|
89
|
+
|
|
82
90
|
I18nKeysIdentifer.isChunkHasI18n = function (chunk) {
|
|
83
91
|
for (const module of chunk.modulesIterable) {
|
|
84
92
|
for (const dep of module.dependencies) {
|
|
@@ -87,5 +95,6 @@ I18nKeysIdentifer.isChunkHasI18n = function (chunk) {
|
|
|
87
95
|
}
|
|
88
96
|
}
|
|
89
97
|
}
|
|
98
|
+
|
|
90
99
|
return false;
|
|
91
100
|
};
|
|
@@ -4,14 +4,23 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
+
|
|
7
8
|
var _utils = require("./utils");
|
|
9
|
+
|
|
8
10
|
var _webpack = require("webpack");
|
|
11
|
+
|
|
9
12
|
var _I18nKeysIdentifer = _interopRequireDefault(require("./I18nKeysIdentifer"));
|
|
13
|
+
|
|
10
14
|
var _I18nFilesEmitter = _interopRequireDefault(require("./I18nFilesEmitter"));
|
|
15
|
+
|
|
11
16
|
var _I18nDownlodLogic = _interopRequireDefault(require("./I18nDownlodLogic"));
|
|
17
|
+
|
|
12
18
|
var _getI18nKeysFormModules = _interopRequireDefault(require("./utils/getI18nKeysFormModules"));
|
|
19
|
+
|
|
13
20
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
21
|
+
|
|
14
22
|
// #region initial
|
|
23
|
+
|
|
15
24
|
/**
|
|
16
25
|
* @TODO:
|
|
17
26
|
* [?] add comment line options for properties file and get all keys form property file do right way to genarate them
|
|
@@ -30,16 +39,16 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
30
39
|
* - file means your machine files
|
|
31
40
|
* - asset means that also file but that will create by webpack after build
|
|
32
41
|
*/
|
|
33
|
-
|
|
34
42
|
// const getI18nLocales = require('./utils/getI18nLocales');
|
|
35
43
|
// const { ConcatSource, SourceMapSource, OriginalSource } = sources;
|
|
36
44
|
const {
|
|
37
45
|
createHash
|
|
38
46
|
} = _webpack.util;
|
|
39
47
|
const MODULE_TYPE = 'json/i18n';
|
|
48
|
+
|
|
40
49
|
const i18ntype = locale => `${MODULE_TYPE}/${locale}`;
|
|
41
|
-
const pluginName = 'i18n-plugin';
|
|
42
50
|
|
|
51
|
+
const pluginName = 'i18n-plugin';
|
|
43
52
|
/**
|
|
44
53
|
* @typedef I18nPluginOptions
|
|
45
54
|
* @property {String} filenameTemplate this was template for i18n chunk
|
|
@@ -68,16 +77,15 @@ class I18nPlugin {
|
|
|
68
77
|
propertiesFolder,
|
|
69
78
|
jsonpFunc
|
|
70
79
|
} = this.options;
|
|
71
|
-
this.publicPath = publicPath;
|
|
72
|
-
|
|
80
|
+
this.publicPath = publicPath; // gethere i18n keys and values
|
|
81
|
+
|
|
73
82
|
this.jsResourceI18nKeys = jsResource ? (0, _utils.getPropertiesAsJSON)(jsResource) : {};
|
|
74
83
|
this.allI18nObject = (0, _utils.getAllI18n)({
|
|
75
84
|
folderPath: propertiesFolder,
|
|
76
85
|
disableDefault,
|
|
77
86
|
jsResourceI18nKeys: this.jsResourceI18nKeys
|
|
78
|
-
});
|
|
87
|
+
}); // initialize base data's and plugis
|
|
79
88
|
|
|
80
|
-
// initialize base data's and plugis
|
|
81
89
|
this.locales = Object.keys(this.allI18nObject);
|
|
82
90
|
this.i18nKeysIdentifer = new _I18nKeysIdentifer.default(this.jsResourceI18nKeys);
|
|
83
91
|
this.i18nFilesEmitter = new _I18nFilesEmitter.default({
|
|
@@ -94,6 +102,7 @@ class I18nPlugin {
|
|
|
94
102
|
localeVarName
|
|
95
103
|
});
|
|
96
104
|
}
|
|
105
|
+
|
|
97
106
|
maintainHashForAllI18nAssets(compilation) {
|
|
98
107
|
/**
|
|
99
108
|
* we write chunkHash logic inside of our plugin Because we only add Dependency not Module.
|
|
@@ -113,13 +122,14 @@ class I18nPlugin {
|
|
|
113
122
|
hashDigestLength
|
|
114
123
|
} = outputOptions;
|
|
115
124
|
const i18nKeys = (0, _getI18nKeysFormModules.default)(chunk.modulesIterable);
|
|
125
|
+
|
|
116
126
|
if (!i18nKeys.length) {
|
|
117
127
|
return;
|
|
118
128
|
}
|
|
129
|
+
|
|
119
130
|
const {
|
|
120
131
|
contentHash
|
|
121
|
-
} = chunk;
|
|
122
|
-
// contentHash = {
|
|
132
|
+
} = chunk; // contentHash = {
|
|
123
133
|
// javascript: 'abcd2938',
|
|
124
134
|
// 'css/mini-extract': 'askdijasod'
|
|
125
135
|
// };
|
|
@@ -131,21 +141,19 @@ class I18nPlugin {
|
|
|
131
141
|
});
|
|
132
142
|
});
|
|
133
143
|
}
|
|
144
|
+
|
|
134
145
|
apply(compiler) {
|
|
135
146
|
this.i18nKeysIdentifer.apply(compiler);
|
|
136
147
|
compiler.hooks.thisCompilation.tap(pluginName, compilation => {
|
|
137
148
|
// this below hook was tapped for hash for the specific i18nChunk Files and write logic to requireEnsure
|
|
138
|
-
this.maintainHashForAllI18nAssets(compilation);
|
|
139
|
-
|
|
140
|
-
// const { mainTemplate } = compilation;
|
|
149
|
+
this.maintainHashForAllI18nAssets(compilation); // const { mainTemplate } = compilation;
|
|
141
150
|
// this.addDownloadLogicOfI18nInMainTemplate(mainTemplate);
|
|
142
151
|
});
|
|
143
|
-
|
|
144
152
|
this.i18nFilesEmitter.apply(compiler);
|
|
145
153
|
this.i18nDownlodLogic.apply(compiler);
|
|
146
154
|
}
|
|
147
|
-
}
|
|
148
155
|
|
|
156
|
+
}
|
|
149
157
|
/*
|
|
150
158
|
// TODO: need to reimplement this logic
|
|
151
159
|
// NOTE: this logic for split all content hash per mani chunk
|
|
@@ -172,4 +180,6 @@ class I18nPlugin {
|
|
|
172
180
|
console.log('entry, ', c, hashSource.toString());
|
|
173
181
|
}
|
|
174
182
|
*/
|
|
183
|
+
|
|
184
|
+
|
|
175
185
|
exports.default = I18nPlugin;
|
|
@@ -5,9 +5,11 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.collectI18nKeysfromAST = collectI18nKeysfromAST;
|
|
7
7
|
exports.collectI18nKeysfromComments = collectI18nKeysfromComments;
|
|
8
|
+
|
|
8
9
|
const {
|
|
9
10
|
walk
|
|
10
11
|
} = require('estree-walker');
|
|
12
|
+
|
|
11
13
|
function collectI18nKeysfromAST(ast, allI18n) {
|
|
12
14
|
let i18nKeys = {};
|
|
13
15
|
walk(ast, {
|
|
@@ -21,34 +23,42 @@ function collectI18nKeysfromAST(ast, allI18n) {
|
|
|
21
23
|
});
|
|
22
24
|
return Object.keys(i18nKeys);
|
|
23
25
|
}
|
|
26
|
+
|
|
24
27
|
const prefixI18nComment = 'I18N';
|
|
25
28
|
const prefixI18nComment1 = 'dynamic-i18n-key';
|
|
29
|
+
|
|
26
30
|
function getI18nKeysFromComment(comment) {
|
|
27
31
|
let commentString = comment.value.trim();
|
|
28
32
|
let i18nKeyStr;
|
|
33
|
+
|
|
29
34
|
if (commentString.startsWith(prefixI18nComment)) {
|
|
30
35
|
i18nKeyStr = commentString.slice(prefixI18nComment.length).trim();
|
|
31
36
|
} else if (commentString.startsWith(prefixI18nComment1)) {
|
|
32
37
|
i18nKeyStr = commentString.slice(prefixI18nComment1.length).trim();
|
|
33
38
|
}
|
|
39
|
+
|
|
34
40
|
if (!i18nKeyStr) {
|
|
35
41
|
return [];
|
|
36
42
|
}
|
|
43
|
+
|
|
37
44
|
const i18nKeys = i18nKeyStr.split(',');
|
|
38
45
|
return i18nKeys;
|
|
39
|
-
}
|
|
46
|
+
} // export function fromComments(comments, allI18n) {
|
|
47
|
+
|
|
40
48
|
|
|
41
|
-
// export function fromComments(comments, allI18n) {
|
|
42
49
|
function collectI18nKeysfromComments(comments, allI18n) {
|
|
43
50
|
// TODO: need to implement
|
|
44
51
|
let i18nKeys = {};
|
|
52
|
+
|
|
45
53
|
for (let comment of comments) {
|
|
46
54
|
let keys = getI18nKeysFromComment(comment);
|
|
55
|
+
|
|
47
56
|
for (let key of keys) {
|
|
48
57
|
if (key && allI18n[key]) {
|
|
49
58
|
i18nKeys[key] = allI18n[key];
|
|
50
59
|
}
|
|
51
60
|
}
|
|
52
61
|
}
|
|
62
|
+
|
|
53
63
|
return Object.keys(i18nKeys);
|
|
54
64
|
}
|
|
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.getI18nFileUrlPathTemplate = getI18nFileUrlPathTemplate;
|
|
7
|
+
|
|
7
8
|
function getI18nFileUrlPathTemplate(compilation, chunk, filenameTemplate, localeTemplate) {
|
|
8
9
|
let urlpath = compilation.getPath(filenameTemplate, {
|
|
9
10
|
chunk
|
|
@@ -4,18 +4,23 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = getI18nKeysFormModules;
|
|
7
|
+
|
|
7
8
|
var _I18nDependency = require("../I18nDependency");
|
|
9
|
+
|
|
8
10
|
function getI18nKeysFormModules(modules) {
|
|
9
11
|
const i18nTemObj = {};
|
|
12
|
+
|
|
10
13
|
for (let m of modules) {
|
|
11
14
|
for (let dep of m.dependencies) {
|
|
12
15
|
if (!(dep instanceof _I18nDependency.I18nDependency)) {
|
|
13
16
|
continue;
|
|
14
17
|
}
|
|
18
|
+
|
|
15
19
|
for (const key of dep.i18nKeys) {
|
|
16
20
|
i18nTemObj[key] = 1;
|
|
17
21
|
}
|
|
18
22
|
}
|
|
19
23
|
}
|
|
24
|
+
|
|
20
25
|
return Object.keys(i18nTemObj);
|
|
21
26
|
}
|
|
@@ -6,7 +6,9 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.REGEXP_CONTENTHASH = void 0;
|
|
7
7
|
exports.getShortI18nAssets = getShortI18nAssets;
|
|
8
8
|
exports.hasContentHash = hasContentHash;
|
|
9
|
+
|
|
9
10
|
var _urlConcat = require("../../../utils/urlConcat");
|
|
11
|
+
|
|
10
12
|
// export const REGEXP_CHUNKHASH = /\[chunkhash(?::(\d+))?\]/gi;
|
|
11
13
|
// export const REGEXP_HASH = /\[hash(?::(\d+))?\]/gi;
|
|
12
14
|
// export const REGEXP_NAME = /\[name\]/gi;
|
|
@@ -14,18 +16,22 @@ var _urlConcat = require("../../../utils/urlConcat");
|
|
|
14
16
|
// TODO: want to choose file type for i18n load
|
|
15
17
|
const REGEXP_CONTENTHASH = /\[contenthash(?::(\d+))?\]/gi;
|
|
16
18
|
exports.REGEXP_CONTENTHASH = REGEXP_CONTENTHASH;
|
|
19
|
+
|
|
17
20
|
function hasContentHash(filenameTemplate) {
|
|
18
21
|
return REGEXP_CONTENTHASH.test(filenameTemplate);
|
|
19
22
|
}
|
|
23
|
+
|
|
20
24
|
function getShortI18nAssets(chunks, i18nManifest, publicPathPrefix) {
|
|
21
25
|
const i18nAssets = {};
|
|
22
26
|
chunks.forEach(chunk => {
|
|
23
27
|
const i18nFiles = i18nManifest[chunk.id];
|
|
28
|
+
|
|
24
29
|
if (i18nFiles) {
|
|
25
30
|
Object.keys(i18nFiles).forEach(locale => {
|
|
26
31
|
if (!i18nAssets[locale]) {
|
|
27
32
|
i18nAssets[locale] = [];
|
|
28
33
|
}
|
|
34
|
+
|
|
29
35
|
i18nAssets[locale].push((0, _urlConcat.urlConcat)(publicPathPrefix, i18nFiles[locale]));
|
|
30
36
|
});
|
|
31
37
|
}
|