@zohodesk/react-cli 0.0.1-beta.99 → 0.0.1-betaa.138.2

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.
Files changed (202) hide show
  1. package/.eslintignore +7 -7
  2. package/.eslintrc.js +183 -183
  3. package/CHANGELOG.md +5 -0
  4. package/README.md +636 -491
  5. package/bin/cli.js +372 -367
  6. package/files/eslintrc.js +57 -0
  7. package/files/prettierrc.js +3 -0
  8. package/lib/babel/cmjs-plugins-presets.js +16 -9
  9. package/lib/babel/es-plugins-presets.js +26 -14
  10. package/lib/common/getEntries.js +31 -22
  11. package/lib/common/getPublicPathConfig.js +27 -13
  12. package/lib/common/index.js +21 -25
  13. package/lib/common/splitChunks.js +62 -53
  14. package/lib/common/templateParameters.js +10 -8
  15. package/lib/configs/jest.config.js +15 -25
  16. package/lib/configs/webpack.component.umd.config.js +31 -37
  17. package/lib/configs/webpack.css.umd.config.js +44 -47
  18. package/lib/configs/webpack.dev.config.js +70 -52
  19. package/lib/configs/webpack.docs.config.js +106 -106
  20. package/lib/configs/webpack.prod.config.js +95 -75
  21. package/lib/hooks/docsProptypeHook.js +32 -38
  22. package/lib/jest/commitedFilesResult.js +103 -74
  23. package/lib/jest/coverageCollector.js +41 -21
  24. package/lib/jest/jsonMaker.js +15 -16
  25. package/lib/jest/preProcessors/cssPreprocessor.js +16 -18
  26. package/lib/jest/preProcessors/jsPreprocessor.js +3 -5
  27. package/lib/jest/preProcessors/otherFilesPreprocessor.js +5 -6
  28. package/lib/jest/result.js +90 -45
  29. package/lib/jest/run.js +43 -43
  30. package/lib/jest/setup.js +102 -95
  31. package/lib/loaderUtils/getCSSLoaders.js +21 -22
  32. package/lib/loaderUtils/getDevJsLoaders.js +25 -23
  33. package/lib/loaderUtils/index.js +11 -13
  34. package/lib/loaders/docsLoader.js +15 -15
  35. package/lib/loaders/docsPropsLoader.js +14 -17
  36. package/lib/loaders/fileLoader.js +33 -35
  37. package/lib/loaders/scriptInstrumentLoader.js +21 -20
  38. package/lib/loaders/workerLoader.js +136 -0
  39. package/lib/middlewares/HMRMiddleware.js +54 -45
  40. package/lib/middlewares/SSTMiddleware.js +8 -5
  41. package/lib/pluginUtils/getDevPlugins.js +114 -52
  42. package/lib/pluginUtils/getDocsPlugins.js +25 -29
  43. package/lib/pluginUtils/getLibraryPlugins.js +8 -10
  44. package/lib/pluginUtils/getProdPlugins.js +163 -74
  45. package/lib/pluginUtils/getServerPlugins.js +8 -11
  46. package/lib/pluginUtils/getUMDCSSPlugins.js +11 -15
  47. package/lib/pluginUtils/getUMDComponentPlugins.js +11 -15
  48. package/lib/pluginUtils/index.js +36 -43
  49. package/lib/plugins/CdnChangePlugin.js +63 -0
  50. package/lib/plugins/CleanupStatsPlugin.js +18 -32
  51. package/lib/plugins/CustomAttributePlugin.js +79 -0
  52. package/lib/plugins/CustomAttributePlugin.md +35 -0
  53. package/lib/plugins/EFCPlugin.js +185 -0
  54. package/lib/plugins/I18NInjectIntoIndexPlugin.js +118 -52
  55. package/lib/plugins/I18nSplitPlugin/I18nDebugPlugin.js +60 -0
  56. package/lib/plugins/I18nSplitPlugin/I18nDependency.js +44 -0
  57. package/lib/plugins/I18nSplitPlugin/I18nDownlodLogic.js +266 -0
  58. package/lib/plugins/I18nSplitPlugin/I18nFilesEmitter.js +183 -0
  59. package/lib/plugins/I18nSplitPlugin/I18nKeysIdentifer.js +100 -0
  60. package/lib/plugins/I18nSplitPlugin/I18nSplit.md +86 -0
  61. package/lib/plugins/I18nSplitPlugin/README.md +25 -0
  62. package/lib/plugins/I18nSplitPlugin/index.js +185 -0
  63. package/lib/plugins/I18nSplitPlugin/utils/collectI18nKeys.js +64 -0
  64. package/lib/plugins/I18nSplitPlugin/utils/getI18nFileUrlPathTemplate.js +13 -0
  65. package/lib/plugins/I18nSplitPlugin/utils/getI18nKeysFormModules.js +26 -0
  66. package/lib/plugins/I18nSplitPlugin/utils/hashUtils.js +40 -0
  67. package/lib/plugins/I18nSplitPlugin/utils/index.js +31 -0
  68. package/lib/plugins/I18nSplitPlugin/utils/propertiesUtils.js +112 -0
  69. package/lib/plugins/ManifestPlugin.js +52 -63
  70. package/lib/plugins/ModuleStatsPlugin.js +83 -173
  71. package/lib/plugins/OptimizeJSPlugin.js +24 -41
  72. package/lib/plugins/PublicPathCallbackPlugin.js +42 -116
  73. package/lib/plugins/PublicPathChangePlugin.js +175 -284
  74. package/lib/plugins/ReportGeneratePlugin.js +150 -151
  75. package/lib/plugins/ResourceHintsPlugin.js +53 -35
  76. package/lib/plugins/ScriptInstrumentPlugin.js +22 -37
  77. package/lib/plugins/ServiceWorkerPlugin.js +81 -57
  78. package/lib/plugins/ShadowDOMSupportPlugin.js +153 -234
  79. package/lib/plugins/SourceMapHookPlugin.js +21 -33
  80. package/lib/plugins/TPHashMappingPlugin.js +67 -0
  81. package/lib/plugins/UglifyCSSPlugin.js +23 -30
  82. package/lib/plugins/UnusedFilesFindPlugin.js +137 -152
  83. package/lib/plugins/index.js +100 -91
  84. package/lib/plugins/webpackwatchrunplugin.js +18 -30
  85. package/lib/postcss-plugins/ExcludeRTLPlugin.js +14 -17
  86. package/lib/schemas/index.js +336 -81
  87. package/lib/servers/clusterHubServer.js +22 -26
  88. package/lib/servers/docsServer.js +3 -5
  89. package/lib/servers/docsServerCore.js +84 -91
  90. package/lib/servers/helpServer.js +19 -21
  91. package/lib/servers/impactServer.js +99 -92
  92. package/lib/servers/mockserver.js +24 -24
  93. package/lib/servers/scrServer.js +78 -98
  94. package/lib/servers/server.js +101 -122
  95. package/lib/servers/ssServer.js +63 -61
  96. package/lib/sh/pre-commit.sh +34 -34
  97. package/lib/sh/reportPublish.sh +45 -46
  98. package/lib/templates/CoverageScriptTemplate.js +45 -18
  99. package/lib/templates/WMSTemplate.js +17 -18
  100. package/lib/templates/linterConstant.js +6 -4
  101. package/lib/utils/babelPresets.js +12 -5
  102. package/lib/utils/buildstats.html +148 -148
  103. package/lib/utils/clean.js +12 -11
  104. package/lib/utils/copy.js +12 -34
  105. package/lib/utils/copyTimezones.js +9 -16
  106. package/lib/utils/createEventStream.js +24 -19
  107. package/lib/utils/cssClassNameGenerate.js +44 -73
  108. package/lib/utils/cssURLReplacer.js +60 -54
  109. package/lib/utils/dependencyPostPublish.js +20 -19
  110. package/lib/utils/fileUtils.js +66 -54
  111. package/lib/utils/folderIterator.js +20 -21
  112. package/lib/utils/getComponents.js +70 -27
  113. package/lib/utils/getCurrentBranch.js +11 -17
  114. package/lib/utils/getDependenciesImpactList.js +114 -187
  115. package/lib/utils/getHash.js +9 -13
  116. package/lib/utils/getIp.js +9 -9
  117. package/lib/utils/getOptions.js +26 -29
  118. package/lib/utils/getServerURL.js +19 -10
  119. package/lib/utils/index.js +147 -126
  120. package/lib/utils/init.js +2 -2
  121. package/lib/utils/initPreCommitHook.js +40 -32
  122. package/lib/utils/jsonHelper.js +37 -21
  123. package/lib/utils/lint/addScripts.js +27 -0
  124. package/lib/utils/lint/checkExistingConfig.js +67 -0
  125. package/lib/utils/lint/copyConfigs.js +24 -0
  126. package/lib/utils/lint/index.js +54 -0
  127. package/lib/utils/lint/lintScripts.js +11 -0
  128. package/lib/utils/lint/lintSetup.js +31 -0
  129. package/lib/utils/lint/lintStagedPreCommitHook.js +7 -0
  130. package/lib/utils/lint/question.js +30 -0
  131. package/lib/utils/lintReporter.js +70 -56
  132. package/lib/utils/mailSender.js +12 -27
  133. package/lib/utils/pullOrigin.js +21 -18
  134. package/lib/utils/reinstallDependencies.js +76 -85
  135. package/lib/utils/removeAttributes.js +25 -23
  136. package/lib/utils/repoClone.js +47 -45
  137. package/lib/utils/request.js +64 -77
  138. package/lib/utils/resultSchema.json +73 -73
  139. package/lib/utils/rtl.js +22 -29
  140. package/lib/utils/setEnvVariables.js +5 -6
  141. package/lib/utils/ssTestHack.js +21 -19
  142. package/lib/utils/switchBranch.js +21 -20
  143. package/lib/utils/urlConcat.js +22 -0
  144. package/package.json +141 -136
  145. package/templates/app/.eslintrc.js +140 -140
  146. package/templates/app/README.md +12 -12
  147. package/templates/app/app/index.html +24 -24
  148. package/templates/app/app/properties/ApplicationResources_en_US.properties +1 -1
  149. package/templates/app/app/properties/i18nkeys.json +3 -3
  150. package/templates/app/docs/all.html +69 -69
  151. package/templates/app/mockapi/index.js +18 -18
  152. package/templates/app/package.json +37 -37
  153. package/templates/app/src/actions/SampleActions/index.js +37 -37
  154. package/templates/app/src/actions/index.js +65 -65
  155. package/templates/app/src/appUrls.js +19 -19
  156. package/templates/app/src/components/Alert/Alert.js +134 -134
  157. package/templates/app/src/components/Alert/Alert.module.css +79 -79
  158. package/templates/app/src/components/FreezeLayer/FreezeLayer.css +37 -37
  159. package/templates/app/src/components/FreezeLayer/FreezeLayer.js +84 -84
  160. package/templates/app/src/components/Sample/Sample.module.css +11 -11
  161. package/templates/app/src/components/Sample/SampleList.js +61 -61
  162. package/templates/app/src/components/Slider/Slider.css +41 -41
  163. package/templates/app/src/components/Slider/Slider.js +55 -55
  164. package/templates/app/src/containers/AlertContainer/index.js +15 -15
  165. package/templates/app/src/containers/AppContainer/index.js +96 -96
  166. package/templates/app/src/containers/AppContainer/index.module.css +27 -27
  167. package/templates/app/src/containers/CustomMatch/index.js +65 -65
  168. package/templates/app/src/containers/DevTools/index.js +10 -10
  169. package/templates/app/src/containers/Header/index.js +67 -67
  170. package/templates/app/src/containers/Header/index.module.css +43 -43
  171. package/templates/app/src/containers/Redirect/index.js +63 -63
  172. package/templates/app/src/containers/Redirector/index.js +47 -47
  173. package/templates/app/src/containers/SampleListContainer/ListContainer.js +42 -42
  174. package/templates/app/src/containers/SampleListContainer/ListContainer.module.css +3 -3
  175. package/templates/app/src/historyChange.js +5 -5
  176. package/templates/app/src/index.html +10 -10
  177. package/templates/app/src/index.js +24 -24
  178. package/templates/app/src/middleware/PromiseMiddleware.js +59 -59
  179. package/templates/app/src/reducers/alertData.js +11 -11
  180. package/templates/app/src/reducers/index.js +6 -6
  181. package/templates/app/src/reducers/samples.js +19 -19
  182. package/templates/app/src/store/configureStore.dev.js +51 -51
  183. package/templates/app/src/store/configureStore.js +5 -5
  184. package/templates/app/src/store/configureStore.prod.js +26 -26
  185. package/templates/app/src/util/Common.js +5 -5
  186. package/templates/app/src/util/RequestAPI.js +132 -132
  187. package/templates/docs/all.html +249 -249
  188. package/templates/docs/component.html +178 -178
  189. package/templates/docs/components.html +221 -221
  190. package/templates/docs/css/b.min.css +6 -6
  191. package/templates/docs/css/component.css +42 -42
  192. package/templates/docs/css/componentTest.css +6 -6
  193. package/templates/docs/css/hopscotch.css +585 -585
  194. package/templates/docs/css/style.css +1022 -1022
  195. package/templates/docs/index.html +1493 -1493
  196. package/templates/docs/js/active-line.js +72 -72
  197. package/templates/docs/js/b.min.js +7 -7
  198. package/templates/docs/js/codemirror.js +9680 -9680
  199. package/templates/docs/js/designTokens.js +334 -334
  200. package/templates/docs/js/j.min.js +4 -4
  201. package/templates/docs/js/javascript.js +874 -874
  202. package/templates/docs/js/matchbrackets.js +145 -145
@@ -1,75 +1,141 @@
1
- 'use strict';
1
+ "use strict";
2
2
 
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ exports.default = void 0;
6
7
 
7
- var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
8
+ var _htmlWebpackPlugin = _interopRequireDefault(require("html-webpack-plugin"));
8
9
 
9
- var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
10
+ var _utils = require("../utils");
10
11
 
11
- var _path = require('path');
12
+ var _urlConcat = require("../utils/urlConcat");
12
13
 
13
- var _path2 = _interopRequireDefault(_path);
14
+ var _path = _interopRequireDefault(require("path"));
14
15
 
15
- var _webpackSources = require('webpack-sources');
16
+ var _webpackSources = require("webpack-sources");
17
+
18
+ var _hashUtils = require("./I18nSplitPlugin/utils/hashUtils");
19
+
20
+ var _getI18nFileUrlPathTemplate = require("./I18nSplitPlugin/utils/getI18nFileUrlPathTemplate");
16
21
 
17
22
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
18
23
 
19
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
24
+ let i18nObj = null;
25
+ let options = (0, _utils.getOptions)();
20
26
 
21
- var i18nObj = null;
27
+ function newAssign(target, data) {
28
+ return Object.assign({}, target, data);
29
+ }
22
30
 
23
- var I18NInjectIntoIndexPlugin = function () {
24
- function I18NInjectIntoIndexPlugin(options) {
25
- _classCallCheck(this, I18NInjectIntoIndexPlugin);
31
+ const {
32
+ i18n
33
+ } = options;
26
34
 
27
- this.isDevelopment = options.mode === 'dev' || options.mode === 'prod' || options.mode === 'dev-no-warn';
35
+ class I18NInjectIntoIndexPlugin {
36
+ constructor(options) {
37
+ this.isDevelopment = options.isDevelopment;
38
+ this.i18nFileNameTemplate = options.i18nFileNameTemplate;
28
39
  this.publicPath = options.publicPath;
40
+ this.templateLabel = options.templateLabel || '{{--user-locale}}';
41
+ this.i18nManifestFileName = options.i18nManifestFileName;
42
+ this.entryPointName = options.mainChunkName;
43
+ }
44
+
45
+ getI18nFileUrlPath(chunk, compilation) {
46
+ let urlpath = (0, _getI18nFileUrlPathTemplate.getI18nFileUrlPathTemplate)(compilation, chunk, this.i18nFileNameTemplate, this.templateLabel);
47
+ return (0, _urlConcat.urlConcat)(this.publicPath, urlpath);
48
+ }
49
+
50
+ getI18nManifest(compilation) {
51
+ const i18nManifestFile = compilation.assets[this.i18nManifestFileName];
52
+
53
+ if (!i18nManifestFile) {
54
+ return {};
55
+ }
56
+
57
+ const manifest = JSON.parse(i18nManifestFile.source());
58
+ return manifest;
59
+ }
60
+
61
+ injectI18nURLsToHTML(compilation) {
62
+ _htmlWebpackPlugin.default.getHooks(compilation).beforeAssetTagGeneration.tapAsync('I18NInjectIntoIndexPlugin', (data, cb) => {
63
+ const {
64
+ assets
65
+ } = data; // Manipulate the content
66
+
67
+ const i18nManifest = this.getI18nManifest(compilation);
68
+ const entryPoint = compilation.entrypoints.get(this.entryPointName);
69
+ const i18nScriptURLs = entryPoint.chunks.filter(c => !!i18nManifest[c.id]).map(c => this.getI18nFileUrlPath(c, compilation)); // .map(url => getI18nScriptTagObj(url));
70
+ // .join('');
71
+ // Tell webpack to move on
72
+
73
+ cb(null, newAssign(data, {
74
+ assets: newAssign(assets, {
75
+ js: i18nScriptURLs.concat(assets.js)
76
+ })
77
+ }));
78
+ });
29
79
  }
30
80
 
31
- _createClass(I18NInjectIntoIndexPlugin, [{
32
- key: 'apply',
33
- value: function apply(compiler) {
34
- var _this = this;
35
-
36
- compiler.hooks.emit.tap('I18NInjectIntoIndexPlugin', function (compilation) {
37
- // let cdns = Object.keys(this.publicPaths);
38
- if (i18nObj === null) {
39
- var i18nFiles = Object.keys(compilation.assets).filter(function (assert) {
40
- return assert.indexOf('i18n' + _path2.default.sep) !== -1;
41
- });
42
- //hook for i18n url contains i18n/ may cause problem
43
- i18nObj = i18nFiles.reduce(function (res, next) {
44
- var fileName = next.replace('i18n' + _path2.default.sep, '');
45
- var splittedFileName = fileName.split('.');
46
- if (_this.isDevelopment) {
47
- res[splittedFileName[0]] = _this.publicPath + '/i18n/' + fileName;
48
- } else {
49
- res[splittedFileName[0]] = fileName;
50
- }
51
- return res;
52
- }, {});
53
- }
54
-
55
- var _Object$keys$filter = Object.keys(compilation.assets).filter(function (filename) {
56
- return (/\.html$/g.test(filename)
57
- );
58
- }),
59
- _Object$keys$filter2 = _slicedToArray(_Object$keys$filter, 1),
60
- indexFile = _Object$keys$filter2[0];
61
-
62
- if (indexFile) {
63
- var source = compilation.assets[indexFile].source();
64
- compilation.assets[indexFile] = new _webpackSources.RawSource(source.replace(new RegExp('<!--I18nInfoToServer(.*)I18nInfoToServer-->', 'g'), function (match, arg) {
65
- return match.replace(arg, JSON.stringify(i18nObj));
66
- }));
67
- }
81
+ withI18nSpitHandling(compiler) {
82
+ compiler.hooks.make.tap('I18NInjectIntoIndexPlugin', compilation => {
83
+ // let cdns = Object.keys(this.publicPaths);
84
+ // console.log('compilation.assets', Object.keys(compilation.assets).filter(a => a.includes('i18n')));
85
+ if (!(0, _hashUtils.hasContentHash)(this.i18nFileNameTemplate)) {
86
+ this.injectI18nURLsToHTML(compilation);
87
+ return;
88
+ }
89
+
90
+ _htmlWebpackPlugin.default.getHooks(compilation).beforeEmit.tapAsync('I18NInjectIntoIndexPlugin', (data, cb) => {
91
+ // Manipulate the content
92
+ const i18nManifest = this.getI18nManifest(compilation);
93
+ const entryPoint = compilation.entrypoints.get(this.entryPointName);
94
+ let i18nAssets = (0, _hashUtils.getShortI18nAssets)(entryPoint.chunks, i18nManifest, this.publicPath);
95
+ data.html = data.html.replace(new RegExp('<!--I18nInfoToServer(.*?)I18nInfoToServer-->', 'g'), (match, arg) => match.replace(arg, JSON.stringify(i18nAssets))); // Tell webpack to move on
96
+
97
+ cb(null, data);
68
98
  });
99
+ });
100
+ }
101
+
102
+ apply(compiler) {
103
+ if (i18n.chunkSplitEnable) {
104
+ this.withI18nSpitHandling(compiler);
105
+ } else {
106
+ this.withoutI18nSpitHandling(compiler);
69
107
  }
70
- }]);
108
+ }
109
+
110
+ withoutI18nSpitHandling(compiler) {
111
+ compiler.hooks.emit.tap('I18NInjectIntoIndexPlugin', compilation => {
112
+ // let cdns = Object.keys(this.publicPaths);
113
+ if (i18nObj === null) {
114
+ let i18nFiles = Object.keys(compilation.assets).filter(assert => assert.indexOf(`i18n${_path.default.sep}`) !== -1); //hook for i18n url contains i18n/ may cause problem
115
+
116
+ i18nObj = i18nFiles.reduce((res, next) => {
117
+ let fileName = next.replace(`i18n${_path.default.sep}`, '');
118
+ let splittedFileName = fileName.split('.');
119
+ /* if (this.isDevelopment) {
120
+ res[splittedFileName[0]] = `${this.publicPath}/i18n/${fileName}`;
121
+ } else {
122
+ res[splittedFileName[0]] = fileName;
123
+ } */
124
+
125
+ res[splittedFileName[0]] = `${this.publicPath}/i18n/${fileName}`;
126
+ return res;
127
+ }, {});
128
+ }
129
+
130
+ let [indexFile] = Object.keys(compilation.assets).filter(filename => /\.html$/g.test(filename));
131
+
132
+ if (indexFile) {
133
+ let source = compilation.assets[indexFile].source();
134
+ compilation.assets[indexFile] = new _webpackSources.RawSource(source.replace(new RegExp('<!--I18nInfoToServer(.*)I18nInfoToServer-->', 'g'), (match, arg) => match.replace(arg, JSON.stringify(i18nObj))));
135
+ }
136
+ });
137
+ }
71
138
 
72
- return I18NInjectIntoIndexPlugin;
73
- }();
139
+ }
74
140
 
75
141
  exports.default = I18NInjectIntoIndexPlugin;
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _utils = require("./utils");
9
+
10
+ const pluginName = 'I18nDebugPlugin'; // this plugin only for debug related purpose
11
+
12
+ class I18nDebugPlugin {
13
+ constructor(jsResourceI18nKeys) {
14
+ this.jsResourceI18nKeys = jsResourceI18nKeys;
15
+ this.warnings = [];
16
+ }
17
+
18
+ apply(compiler) {
19
+ compiler.hooks.thisCompilation.tap(pluginName, (compilation, compilationParams) => {
20
+ // TEMP : only for debugging purpose
21
+ this.compilation1 = compilation;
22
+ this.compilationParams = compilationParams.normalModuleFactory;
23
+ });
24
+ compiler.hooks.normalModuleFactory.tap(pluginName, factory => {
25
+ if (!this.compilationParams || this.compilationParams.normalModuleFactory === factory) {
26
+ return;
27
+ } // console.log('skiped');
28
+
29
+
30
+ let handler = parser => {
31
+ parser.hooks.program.tap(pluginName, (ast, commmets) => {
32
+ const {
33
+ module
34
+ } = parser.state; //
35
+
36
+ if (!(module && /\.jsx?$/.test(module.resource))) {
37
+ return;
38
+ } // i18n grep proper contract regex
39
+
40
+
41
+ let i18nKeys = (0, _utils.collectI18nKeysfromAST)(ast, this.jsResourceI18nKeys);
42
+ i18nKeys = i18nKeys.concat( // i18n grep proper contract regex
43
+ (0, _utils.collectI18nKeysfromComments)(commmets, this.jsResourceI18nKeys));
44
+ i18nKeys.length && this.warnings.push({
45
+ message: 'skiped i18n keys',
46
+ reason: 'may be some child compiler',
47
+ fileName: module.resource,
48
+ i18nKeys
49
+ });
50
+ });
51
+ };
52
+
53
+ factory.hooks.parser.for('javascript/auto').tap(pluginName, handler);
54
+ factory.hooks.parser.for('javascript/dynamic').tap(pluginName, handler); // factory.hooks.parser.for('javascript/esm').tap(pluginName, handler);
55
+ });
56
+ }
57
+
58
+ }
59
+
60
+ exports.default = I18nDebugPlugin;
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.I18nDependencyTemplate = exports.I18nDependency = void 0;
7
+
8
+ var _webpack = require("webpack");
9
+
10
+ // const webpack = require('webpack');
11
+ class I18nDependency extends _webpack.Dependency {
12
+ constructor({
13
+ identifier,
14
+ i18nKeys
15
+ }, context, identifierIndex) {
16
+ super();
17
+ this.identifier = identifier;
18
+ this.identifierIndex = identifierIndex;
19
+ this.i18nKeys = i18nKeys;
20
+ this.context = context;
21
+ }
22
+
23
+ getResourceIdentifier() {
24
+ return `i18n-module-${this.identifier}-${this.identifierIndex}`;
25
+ }
26
+
27
+ }
28
+
29
+ exports.I18nDependency = I18nDependency;
30
+
31
+ class I18nDependencyTemplate {
32
+ //eslint-disable-next-line no-empty-function
33
+ apply() {} // apply(dep, source) {
34
+ // if (typeof dep.range === "number") {
35
+ // source.insert(0, `/* comment by I18nSplitPlugin , i18n keys = ${JSON.stringify(dep.i18nKeys)} */`);
36
+ // return;
37
+ // }
38
+ // source.replace(dep.range[0], dep.range[1] - 1, dep.expression);
39
+ // }
40
+
41
+
42
+ }
43
+
44
+ exports.I18nDependencyTemplate = I18nDependencyTemplate;
@@ -0,0 +1,266 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _webpack = require("webpack");
9
+
10
+ var _I18nKeysIdentifer = _interopRequireDefault(require("./I18nKeysIdentifer"));
11
+
12
+ var _hashUtils = require("./utils/hashUtils");
13
+
14
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
+
16
+ /**
17
+ * this plugin for the download i18n files
18
+ * So, if need to downoad i18n in browser this plugin handle that
19
+ *
20
+ *
21
+ * this plugin works
22
+ * how it works?
23
+ * this plugin hook the requireEnsure method and we write logic for current compiled file download logic
24
+ *
25
+ * hinds:-
26
+ * requireEnsure method was loader for all js chunk's ,
27
+ * which means if we use dynamic import then this function will create script tag for that dynamic resource
28
+ * so every dynamic js chunk will load by this function,
29
+ * So we update this function with when dynamic jschunk call the nour code also execute
30
+ *
31
+ * some thing missing in this definetion
32
+ *
33
+ */
34
+ // import { REGEXP_HASH, REGEXP_CHUNKHASH } from './utils/hashUtils';
35
+ const pluginName = 'DownloadLogicOfI18n'; // const pluginName = 'i18n-plugin';
36
+
37
+ const MODULE_TYPE = 'json/i18n';
38
+
39
+ const ltype = locale => `${MODULE_TYPE}/${locale}`;
40
+
41
+ function hashesWithLength(hashes, length) {
42
+ const shortChunkHashMap = {};
43
+
44
+ for (let key of Object.keys(hashes)) {
45
+ if (typeof hashes[key] === 'string') {
46
+ shortChunkHashMap[key] = hashes.slice(0, length);
47
+ }
48
+ }
49
+
50
+ return shortChunkHashMap;
51
+ }
52
+
53
+ function getContentHashMaxLength(filenameTemplate) {
54
+ let length = 0;
55
+ let matches = filenameTemplate.match(_hashUtils.REGEXP_CONTENTHASH);
56
+
57
+ for (let match of matches) {
58
+ let tem = match.match(/\d+/);
59
+
60
+ if (tem) {
61
+ length = Math.max(parseInt(tem[0]), length);
62
+ } else {
63
+ length = 0;
64
+ break;
65
+ }
66
+ }
67
+
68
+ return length;
69
+ }
70
+
71
+ class I18nDownlodLogic {
72
+ constructor({
73
+ filenameTemplate,
74
+ publicPath,
75
+ localeVarName = 'document.documentElement.lang',
76
+ locales
77
+ }) {
78
+ this.locales = locales;
79
+ this.publicPath = publicPath;
80
+ this.options = {
81
+ filenameTemplate,
82
+ localeVarName
83
+ };
84
+ }
85
+
86
+ getShortContentHashes(chunk, hashLength) {
87
+ let allContenHashes = {};
88
+ const chunkMaps = chunk.getChunkMaps();
89
+ this.locales.forEach(locale => {
90
+ allContenHashes[locale] = chunkMaps.contentHash[ltype(locale)];
91
+ });
92
+
93
+ if (!length) {
94
+ return allContenHashes;
95
+ }
96
+
97
+ let shortContentHashMap = {};
98
+
99
+ for (const locale of this.locales) {
100
+ shortContentHashMap[locale] = hashesWithLength(allContenHashes[locale], hashLength);
101
+ }
102
+
103
+ return shortContentHashMap;
104
+ }
105
+
106
+ getI18nChunkObject(mainChunk) {
107
+ const obj = {};
108
+
109
+ for (const chunk of mainChunk.getAllAsyncChunks()) {
110
+ if (_I18nKeysIdentifer.default.isChunkHasI18n(chunk)) {
111
+ obj[chunk.id] = 1;
112
+ }
113
+ }
114
+
115
+ return obj;
116
+ }
117
+
118
+ addDownloadLogicOfI18nInMainTemplate(mainTemplate) {
119
+ mainTemplate.hooks.localVars.tap(pluginName, (source, mainChunk) => {
120
+ const chunkMap = this.getI18nChunkObject(mainChunk);
121
+
122
+ if (!Object.keys(chunkMap).length) {
123
+ return source;
124
+ }
125
+
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')), '};']);
127
+ });
128
+ mainTemplate.hooks.requireEnsure.tap(pluginName, (source, mainChunk, hash) => {
129
+ /**
130
+ * for Information this is tapped in mainTemplate ,
131
+ * So this hooks argument chunk is main chunk means entry chunk mostly.
132
+ * if any chunk has i18n then we must write our download i18n logic,
133
+ */
134
+ const chunkMap = this.getI18nChunkObject(mainChunk);
135
+
136
+ if (!Object.keys(chunkMap).length) {
137
+ return source;
138
+ }
139
+ /**
140
+ * chunkMaps has
141
+ * @property {Object} hash [it has key as chunk id and value as chunkHash ]
142
+ * @property {Object} name [it has key as chunk id and value as chunk name ]
143
+ */
144
+
145
+
146
+ const chunkMaps = mainChunk.getChunkMaps();
147
+ const {
148
+ crossOriginLoading
149
+ } = mainTemplate.outputOptions;
150
+ const {
151
+ filenameTemplate,
152
+ localeVarName = 'document.documentElement.lang'
153
+ } = this.options;
154
+ const i18nSrcPath = mainTemplate.getAssetPath(JSON.stringify(filenameTemplate).replace(/\[locale\]/gi, '"+ locale +"'), // "i18n-chunk/[locale]/[name].[chunkhash].js"
155
+ {
156
+ hash: `" + ${mainTemplate.renderCurrentHashCode(hash)} + "`,
157
+ hashWithLength: length => `" + ${mainTemplate.renderCurrentHashCode(hash, length)} + "`,
158
+ chunk: {
159
+ id: '" + chunkId + "',
160
+ hash: `" + ${JSON.stringify(chunkMaps.hash)}[chunkId] + "`,
161
+
162
+ hashWithLength(length) {
163
+ const shortChunkHashMap = hashesWithLength(chunkMaps.hash, length);
164
+ return `" + ${JSON.stringify(shortChunkHashMap)}[chunkId] + "`;
165
+ },
166
+
167
+ // contentHash: contentHashMap,
168
+ // contentHashWithLength: contentHashLengthMap,
169
+ contentHash: {
170
+ [MODULE_TYPE]: '" + contentHash + "'
171
+ },
172
+ contentHashWithLength: {
173
+ [MODULE_TYPE]: length => `" + contentHash.slice(0,${length}) + "`
174
+ },
175
+ name: `" + (${JSON.stringify(chunkMaps.name)}[chunkId]||chunkId) + "`
176
+ },
177
+ contentHashType: MODULE_TYPE
178
+ });
179
+ /** IDEA:
180
+ * as my suggestion ignore this `jsop` approch,
181
+ * Because json parse is faster then js parse.
182
+ * my suggestion is make ajax or fetch request
183
+ */
184
+
185
+ const buf = [];
186
+ /*
187
+ if (REGEXP_HASH.test(filenameTemplate)) {
188
+ buf.push(
189
+ `var hash = ${mainTemplate.renderCurrentHashCode(hash)};`
190
+ );
191
+ }
192
+ if (REGEXP_CHUNKHASH.test(filenameTemplate)) {
193
+ buf.push(`var chunkHashes = ${JSON.stringify(chunkMaps.hash)};`);
194
+ }
195
+ */
196
+
197
+ if ((0, _hashUtils.hasContentHash)(filenameTemplate)) {
198
+ const hashLength = getContentHashMaxLength(filenameTemplate);
199
+ const contentHashes = this.getShortContentHashes(mainChunk, hashLength);
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;', '}']));
201
+ buf.push('var contentHash = i18nContentHashes[locale][chunkId]');
202
+ }
203
+
204
+ const hashUtils = _webpack.Template.asString(buf);
205
+
206
+ const publicPath = this.publicPath ? JSON.stringify(this.publicPath) : `${mainTemplate.requireFn}.p`;
207
+ return _webpack.Template.asString([source, `
208
+ (function() {
209
+ // ${pluginName} I18N loading
210
+ var i18nChunks = ${JSON.stringify(chunkMap)};
211
+ var locale = ${localeVarName};
212
+ // ${pluginName} I18N hasehes
213
+ ${hashUtils}
214
+ if(installedI18nChunks[chunkId]) {
215
+ promises.push(installedI18nChunks[chunkId]);
216
+ } else if(installedI18nChunks[chunkId] !== 0 && i18nChunks[chunkId]) {
217
+ promises.push(installedI18nChunks[chunkId] = new Promise(function(resolve, reject) {
218
+ var srcPath = (${i18nSrcPath});
219
+ ${'' // TODO: I think this is the area for download chunk of i18n we can
220
+ // change mainTemplate.requireFn as our cdn server urls !!!
221
+ // and we can change the i18n download logic here
222
+ }
223
+ var fullsrcPath = ${publicPath} + srcPath;
224
+ var existingLinkTags = document.getElementsByTagName("script");
225
+ for(var i = 0; i < existingLinkTags.length; i++) {
226
+ var tag = existingLinkTags[i];
227
+ var dataSrc = tag.getAttribute("data-src") || tag.getAttribute("src");
228
+ if(dataSrc === srcPath || dataSrc === fullsrcPath){ return resolve();}
229
+ }
230
+ var scriptTag = document.createElement("script");
231
+ scriptTag.onload = resolve;
232
+ scriptTag.onerror = function(event) {
233
+ var request = event && event.target && event.target.src || fullsrcPath;
234
+ var err = new Error("Loading I18N chunk " + chunkId + " failed.\\n(" + request + ")");
235
+ err.code = "I18N_CHUNK_LOAD_FAILED";
236
+ err.request = request;
237
+ delete installedI18nChunks[chunkId];
238
+ scriptTag.parentNode.removeChild(scriptTag);
239
+ reject(err);
240
+ };
241
+ ${mainTemplate.requireFn}.nc && scriptTag.setAttribute("nonce", ${mainTemplate.requireFn}.nc);
242
+ scriptTag.src = fullsrcPath;
243
+ ${crossOriginLoading ? `if (scriptTag.src.indexOf(window.location.origin + '/') !== 0) {
244
+ scriptTag.crossOrigin = ${JSON.stringify(crossOriginLoading)};
245
+ }` : ''}
246
+ document.body.appendChild(scriptTag);
247
+ }).then(function() {
248
+ installedI18nChunks[chunkId] = 0;
249
+ }));
250
+ }
251
+ })()`]);
252
+ });
253
+ }
254
+
255
+ apply(compiler) {
256
+ compiler.hooks.thisCompilation.tap(pluginName, compilation => {
257
+ const {
258
+ mainTemplate
259
+ } = compilation;
260
+ this.addDownloadLogicOfI18nInMainTemplate(mainTemplate);
261
+ });
262
+ }
263
+
264
+ }
265
+
266
+ exports.default = I18nDownlodLogic;