@zohodesk/react-cli 0.0.1-exp.175.1 → 0.0.1-exp.176.11
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
}
|