@zohodesk/client_build_tool 0.0.1-0.exp.0.0.3
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/.babelrc +12 -0
- package/.lintstagedrc +3 -0
- package/.vscode/settings.json +5 -0
- package/CHANGELOG.md +84 -0
- package/ConfigurationDocumentation.md +567 -0
- package/ContributionGuide.md +2 -0
- package/NOTES-Dec12.md +12 -0
- package/README.md +184 -0
- package/README_backup.md +100 -0
- package/TODO.md +35 -0
- package/cli.js +31 -0
- package/docs/BabelCustomizations.md +55 -0
- package/docs/CSSCustomPluginsDocumentation.md +71 -0
- package/docs/CustomChunksConfiguration.md +0 -0
- package/docs/EFCFileTemplate.md +0 -0
- package/docs/MockApi.md +61 -0
- package/docs/NameTemplateUtility.md +93 -0
- package/docs/ServiseWorkerTemplate.md +0 -0
- package/docs/SupportedBrowserVersions.md +61 -0
- package/helpDocs/check.js +7 -0
- package/helpDocs/commmands/build.md +0 -0
- package/helpDocs/commmands/start.md +0 -0
- package/helpDocs/examples/buildWithContentHash.md +0 -0
- package/helpDocs/examples/startDevServer.md +0 -0
- package/helpDocs/examples/startWithMockAPI.md +0 -0
- package/helpDocs/node18-env.md +30 -0
- package/helpDocs/troubleshootings/NewMachineSetup.md +71 -0
- package/helpDocs/troubleshootings/README.md +9 -0
- package/helpDocs/troubleshootings/hg_install.sh +18 -0
- package/helpDocs/troubleshootings/newMachineMac.sh +86 -0
- package/helpDocs/troubleshootings/newMachineUbundu.bash +84 -0
- package/lib/allCommandsConfigs.js +25 -0
- package/lib/commands/build/commandExecutor.js +17 -0
- package/lib/commands/build/config.js +12 -0
- package/lib/commands/build/optionsProcessor.js +35 -0
- package/lib/commands/build/preProcessor.js +12 -0
- package/lib/commands/buildEs/commandExecutor.js +33 -0
- package/lib/commands/buildEs/config.js +12 -0
- package/lib/commands/buildEs/preProcessor.js +17 -0
- package/lib/commands/buildLib/commandExecutor.js +33 -0
- package/lib/commands/buildLib/config.js +12 -0
- package/lib/commands/buildLib/preProcessor.js +17 -0
- package/lib/commands/mockserver/commandExecutor.js +43 -0
- package/lib/commands/mockserver/config.js +12 -0
- package/lib/commands/pre_process/commandExecutor.js +18 -0
- package/lib/commands/pre_process/config.js +12 -0
- package/lib/commands/start/commandExecutor.js +12 -0
- package/lib/commands/start/config.js +12 -0
- package/lib/commands/start/optionsProcessor.js +30 -0
- package/lib/commands/start/preProcessor.js +12 -0
- package/lib/commands/template/commandExecutor.js +28 -0
- package/lib/commands/template/config.js +12 -0
- package/lib/commands/version/commandExecutor.js +14 -0
- package/lib/commands/version/config.js +12 -0
- package/lib/commandsRouter.js +74 -0
- package/lib/index.js +12 -0
- package/lib/logger.js +34 -0
- package/lib/schemas/applyValuesToSchema/index.js +34 -0
- package/lib/schemas/applyValuesToSchema/isObject.js +10 -0
- package/lib/schemas/applyValuesToSchema/isValid.js +14 -0
- package/lib/schemas/cliArgsToObject.js +39 -0
- package/lib/schemas/defaultConfigValues.js +393 -0
- package/lib/schemas/defaultConfigValuesOnly.js +200 -0
- package/lib/schemas/deprecatedOptionsHandler.js +67 -0
- package/lib/schemas/getNpmVersion.js +22 -0
- package/lib/schemas/giveDefaultValue.js +18 -0
- package/lib/schemas/npmConfigToObject.js +35 -0
- package/lib/schemas/readOptions.js +87 -0
- package/lib/schemas/readOptionsForConfigFile.js +42 -0
- package/lib/shared/babel/addDefaultPlugins.js +15 -0
- package/lib/shared/babel/babelWebConfig.js +54 -0
- package/lib/shared/babel/babel_plugins/removeAttributesPlugin.js +23 -0
- package/lib/shared/babel/getBabelPlugin.js +42 -0
- package/lib/shared/babel/runBabelForJSFile.js +24 -0
- package/lib/shared/babel/runBabelForTsFile.js +30 -0
- package/lib/shared/bundler/webpack/common/decidePublicPath.js +57 -0
- package/lib/shared/bundler/webpack/common/hashUtils.js +20 -0
- package/lib/shared/bundler/webpack/common/libAlias.js +31 -0
- package/lib/shared/bundler/webpack/common/modeUtils.js +39 -0
- package/lib/shared/bundler/webpack/common/nameTemplates.js +105 -0
- package/lib/shared/bundler/webpack/common/resourceBasedPublicPath.js +21 -0
- package/lib/shared/bundler/webpack/configCustomLoaders.js +10 -0
- package/lib/shared/bundler/webpack/cssLoaders.js +16 -0
- package/lib/shared/bundler/webpack/custom_plugins/BundleIntegrityReport/index.js +83 -0
- package/lib/shared/bundler/webpack/custom_plugins/CdnChangePlugin/index.js +119 -0
- package/lib/shared/bundler/webpack/custom_plugins/CdnChangePlugin/webpackCustomJsUrlLoader.js +46 -0
- package/lib/shared/bundler/webpack/custom_plugins/CustomScriptLoadingPlugin.js +109 -0
- package/lib/shared/bundler/webpack/custom_plugins/EFCTemplatePlugin.js +112 -0
- package/lib/shared/bundler/webpack/custom_plugins/I18nNumericIndexPlugin/I18nNumericIndexHtmlInjectorPlugin.js +47 -0
- package/lib/shared/bundler/webpack/custom_plugins/I18nNumericIndexPlugin/I18nNumericIndexPlugin.js +190 -0
- package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/ContributionGuide.md +11 -0
- package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/I18nFilesEmitPlugin.js +174 -0
- package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/I18nKeysIdentifer.js +76 -0
- package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/I18nRuntimeDealerPlugin.js +223 -0
- package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/I18nSplit.md +95 -0
- package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/LocaleChunkAssetsStore.js +73 -0
- package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/ModulesI18nKeysStore.js +88 -0
- package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/README.md +25 -0
- package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/constants.js +29 -0
- package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/createHash.js +24 -0
- package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/getI18nLoadingRuntimeModule.js +76 -0
- package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/index.js +39 -0
- package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/iterateModulesInChunk.js +50 -0
- package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/optionsHandler.js +68 -0
- package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/pathCreator.js +23 -0
- package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/readI18nValues.js +29 -0
- package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/templateFileName.js +43 -0
- package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/templateHashHelpers.js +77 -0
- package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/utils/collectAstKeys.js +98 -0
- package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/utils/collectI18nKeys.js +66 -0
- package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/utils/getChunkModules.js +13 -0
- package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/utils/hashUtils.js +19 -0
- package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/utils/index.js +31 -0
- package/lib/shared/bundler/webpack/custom_plugins/I18nSplitPlugin/utils/propertiesUtils.js +129 -0
- package/lib/shared/bundler/webpack/custom_plugins/InitialHtmlPlugin.js +60 -0
- package/lib/shared/bundler/webpack/custom_plugins/ManifestJsonPlugin/addFilesNamesToManifestJson.js +30 -0
- package/lib/shared/bundler/webpack/custom_plugins/ManifestJsonPlugin/createInitialEntries.js +23 -0
- package/lib/shared/bundler/webpack/custom_plugins/ManifestJsonPlugin/createManifestJson.js +35 -0
- package/lib/shared/bundler/webpack/custom_plugins/ManifestJsonPlugin/findInitialFileNames.js +18 -0
- package/lib/shared/bundler/webpack/custom_plugins/ManifestJsonPlugin/index.js +46 -0
- package/lib/shared/bundler/webpack/custom_plugins/ManifestJsonPlugin/removeHashFromFileName.js +18 -0
- package/lib/shared/bundler/webpack/custom_plugins/RTLSplitPlugin.js +1 -0
- package/lib/shared/bundler/webpack/custom_plugins/ResourceHintsPlugin.js +193 -0
- package/lib/shared/bundler/webpack/custom_plugins/RtlSplitPlugin/OverwriteCssPathForRTL.js +62 -0
- package/lib/shared/bundler/webpack/custom_plugins/RtlSplitPlugin/RtlCssPlugin.js +84 -0
- package/lib/shared/bundler/webpack/custom_plugins/RtlSplitPlugin/RtrSplit.md +34 -0
- package/lib/shared/bundler/webpack/custom_plugins/RtlSplitPlugin/replaceCssDirTemplate.js +27 -0
- package/lib/shared/bundler/webpack/custom_plugins/RuntimeResourceCleanup/index.js +73 -0
- package/lib/shared/bundler/webpack/custom_plugins/SelectorWeightPlugin/classHandling.js +20 -0
- package/lib/shared/bundler/webpack/custom_plugins/SelectorWeightPlugin/index.js +78 -0
- package/lib/shared/bundler/webpack/custom_plugins/SelectorWeightPlugin/selectorWeightPrefixAdder.js +51 -0
- package/lib/shared/bundler/webpack/custom_plugins/SelectorWeightPlugin/windowsModification.js +16 -0
- package/lib/shared/bundler/webpack/custom_plugins/ServiceWorkerPlugin.js +120 -0
- package/lib/shared/bundler/webpack/custom_plugins/ServiceWorkerPluginUtils.js +13 -0
- package/lib/shared/bundler/webpack/custom_plugins/SourceMapPlugin/index.js +71 -0
- package/lib/shared/bundler/webpack/custom_plugins/TPHashMappingPlugin/addHashToFilePath.js +22 -0
- package/lib/shared/bundler/webpack/custom_plugins/TPHashMappingPlugin/index.js +55 -0
- package/lib/shared/bundler/webpack/custom_plugins/UglifyCSSPlugin/index.js.js +49 -0
- package/lib/shared/bundler/webpack/custom_plugins/VariableConversionCollector/ErrorHandler.js +62 -0
- package/lib/shared/bundler/webpack/custom_plugins/VariableConversionCollector/index.js +362 -0
- package/lib/shared/bundler/webpack/custom_plugins/custom_attribute_plugin/index.js +80 -0
- package/lib/shared/bundler/webpack/custom_plugins/emitAsset.js +14 -0
- package/lib/shared/bundler/webpack/custom_plugins/getInitialAssetsFuncTemplate.js +57 -0
- package/lib/shared/bundler/webpack/custom_plugins/getInitialI18nAssetsArrayStr.js +87 -0
- package/lib/shared/bundler/webpack/defaultVendorPatternList.js +13 -0
- package/lib/shared/bundler/webpack/devtoolConfig.js +13 -0
- package/lib/shared/bundler/webpack/entryConfig.js +28 -0
- package/lib/shared/bundler/webpack/externals.js +17 -0
- package/lib/shared/bundler/webpack/getCSSLoaders.js +29 -0
- package/lib/shared/bundler/webpack/getFilenameFromModule.js +24 -0
- package/lib/shared/bundler/webpack/jsLoaders.js +30 -0
- package/lib/shared/bundler/webpack/loaderConfigs/assetLoaders.js +12 -0
- package/lib/shared/bundler/webpack/loaderConfigs/babelLoaderConfig.js +18 -0
- package/lib/shared/bundler/webpack/loaderConfigs/checkIsPatternsMatchFilename.js +56 -0
- package/lib/shared/bundler/webpack/loaderConfigs/configHtmlTemplateLoader.js +18 -0
- package/lib/shared/bundler/webpack/loaderConfigs/configPostCssLoader.js +37 -0
- package/lib/shared/bundler/webpack/loaderConfigs/configWebWorkerLoader.js +21 -0
- package/lib/shared/bundler/webpack/loaderConfigs/configsAssetsLoaders.js +86 -0
- package/lib/shared/bundler/webpack/loaderConfigs/cssClassNameGenerate.js +65 -0
- package/lib/shared/bundler/webpack/loaderConfigs/getCssLoaderOptions.js +21 -0
- package/lib/shared/bundler/webpack/loaderConfigs/i18nIdReplaceLoaderConfig.js +94 -0
- package/lib/shared/bundler/webpack/loaders/i18nIdReplaceLoader.js +201 -0
- package/lib/shared/bundler/webpack/loaders/miniCssFallBackLoader.js +7 -0
- package/lib/shared/bundler/webpack/loaders/workerLoader.js +133 -0
- package/lib/shared/bundler/webpack/optimizationConfig.js +56 -0
- package/lib/shared/bundler/webpack/outputConfig.js +38 -0
- package/lib/shared/bundler/webpack/pluginConfigs/configBundleAnalyzer.js +40 -0
- package/lib/shared/bundler/webpack/pluginConfigs/configBundleIntegrityReport.js +36 -0
- package/lib/shared/bundler/webpack/pluginConfigs/configCSSMinifierPlugin.js +28 -0
- package/lib/shared/bundler/webpack/pluginConfigs/configCdnChangePlugin.js +27 -0
- package/lib/shared/bundler/webpack/pluginConfigs/configCopyPublicFolders.js +63 -0
- package/lib/shared/bundler/webpack/pluginConfigs/configCustomAttributesPlugin.js +20 -0
- package/lib/shared/bundler/webpack/pluginConfigs/configCustomScriptLoadingStrategyPlugin.js +76 -0
- package/lib/shared/bundler/webpack/pluginConfigs/configEFCTemplatePlugin.js +46 -0
- package/lib/shared/bundler/webpack/pluginConfigs/configEnvVariables.js +51 -0
- package/lib/shared/bundler/webpack/pluginConfigs/configHtmlWebpackPlugin.js +56 -0
- package/lib/shared/bundler/webpack/pluginConfigs/configI18nNumericIndexPlugin.js +113 -0
- package/lib/shared/bundler/webpack/pluginConfigs/configI18nSplitPlugin.js +41 -0
- package/lib/shared/bundler/webpack/pluginConfigs/configIgnorePlugin.js +16 -0
- package/lib/shared/bundler/webpack/pluginConfigs/configManifestJsonPlugin.js +44 -0
- package/lib/shared/bundler/webpack/pluginConfigs/configMiniCSSExtractPlugin.js +24 -0
- package/lib/shared/bundler/webpack/pluginConfigs/configProgressPlugin.js +24 -0
- package/lib/shared/bundler/webpack/pluginConfigs/configResourceHintsPlugin.js +21 -0
- package/lib/shared/bundler/webpack/pluginConfigs/configRtlCssPlugin.js +27 -0
- package/lib/shared/bundler/webpack/pluginConfigs/configRuntimeResourceCleanup.js +31 -0
- package/lib/shared/bundler/webpack/pluginConfigs/configSelectorWeightPlugin.js +28 -0
- package/lib/shared/bundler/webpack/pluginConfigs/configServiceWorkerPlugin.js +40 -0
- package/lib/shared/bundler/webpack/pluginConfigs/configSourceMapPlugin.js +20 -0
- package/lib/shared/bundler/webpack/pluginConfigs/configTPHashMappingPlugin.js +32 -0
- package/lib/shared/bundler/webpack/pluginConfigs/configVariableConversionPlugin.js +25 -0
- package/lib/shared/bundler/webpack/plugins.js +77 -0
- package/lib/shared/bundler/webpack/resolvers.js +82 -0
- package/lib/shared/bundler/webpack/splitChunksConfig.js +116 -0
- package/lib/shared/bundler/webpack/statsConfig.js +30 -0
- package/lib/shared/bundler/webpack/tsLoaders.js +17 -0
- package/lib/shared/bundler/webpack/utils/index.js +31 -0
- package/lib/shared/bundler/webpack/utils/object-manipulation.js +87 -0
- package/lib/shared/bundler/webpack/utils/updateArrayWithDefault.js +34 -0
- package/lib/shared/bundler/webpack/webpackBuild.js +27 -0
- package/lib/shared/bundler/webpack/webpackConfig.js +58 -0
- package/lib/shared/commands-utils/doBasicRequirementCheck.js +17 -0
- package/lib/shared/commands-utils/getCliPath.js +39 -0
- package/lib/shared/commands-utils/index.js +29 -0
- package/lib/shared/commands-utils/log.js +13 -0
- package/lib/shared/commands-utils/readArgsFormCommandLine.js +11 -0
- package/lib/shared/commands-utils/readOptionFormCommandLine.js +11 -0
- package/lib/shared/commands-utils/spawnSyncIO.js +38 -0
- package/lib/shared/constants.js +48 -0
- package/lib/shared/fileUtils/copyFile.js +38 -0
- package/lib/shared/fileUtils/directoryIterator.js +21 -0
- package/lib/shared/fileUtils/watchRun.js +112 -0
- package/lib/shared/postcss/custom_postcss_plugins/EmptyPlugin.js +21 -0
- package/lib/shared/postcss/custom_postcss_plugins/HoverActivePlugin/constants.js +10 -0
- package/lib/shared/postcss/custom_postcss_plugins/HoverActivePlugin/handleIgnores.js +66 -0
- package/lib/shared/postcss/custom_postcss_plugins/HoverActivePlugin/index.js +136 -0
- package/lib/shared/postcss/custom_postcss_plugins/HoverActivePlugin/insertBefore.js +32 -0
- package/lib/shared/postcss/custom_postcss_plugins/HoverActivePlugin/isPreviouslyProcessed.js +20 -0
- package/lib/shared/postcss/custom_postcss_plugins/HoverActivePlugin/replaceUtils.js +20 -0
- package/lib/shared/postcss/custom_postcss_plugins/HoverActivePlugin/separateHoveredSelectorAndNormalSelector.js +24 -0
- package/lib/shared/postcss/custom_postcss_plugins/HoverActivePlugin/specialCases.js +43 -0
- package/lib/shared/postcss/custom_postcss_plugins/HoverActivePlugin/typeCheckUtils.js +52 -0
- package/lib/shared/postcss/custom_postcss_plugins/RTLSplitPlugin.js +139 -0
- package/lib/shared/postcss/custom_postcss_plugins/SelectorReplace.js +90 -0
- package/lib/shared/postcss/custom_postcss_plugins/ValueReplacer.js +57 -0
- package/lib/shared/postcss/custom_postcss_plugins/VariableModificationPlugin/index.js +347 -0
- package/lib/shared/postcss/filterPluginsAllowedForSpecficFile.js +55 -0
- package/lib/shared/postcss/getAllowedPostCssPlugins.js +30 -0
- package/lib/shared/postcss/getSpecificPostCssPlugin.js +58 -0
- package/lib/shared/postcss/runPostCssForCssFile.js +37 -0
- package/lib/shared/pre_process/runPreProcess.js +58 -0
- package/lib/shared/server/configWebpackDevMiddleware.js +41 -0
- package/lib/shared/server/corsHandling.js +30 -0
- package/lib/shared/server/getIp.js +30 -0
- package/lib/shared/server/getServerURL.js +36 -0
- package/lib/shared/server/httpsOptions.js +46 -0
- package/lib/shared/server/initExpressApp.js +19 -0
- package/lib/shared/server/initialHTMLHandling.js +99 -0
- package/lib/shared/server/mockApiHandler.js +67 -0
- package/lib/shared/server/mockServer.js +41 -0
- package/lib/shared/server/serveContextFiles.js +27 -0
- package/lib/shared/server/serverBywebpackDevMiddleware.js +35 -0
- package/lib/shared/server/startHttpServer.js +26 -0
- package/lib/shared/server/startHttpsServer.js +38 -0
- package/lib/shared/server/unwanted/addHttp2Server.js +41 -0
- package/lib/shared/server/unwanted/configWebpackDevMiddleware.js +44 -0
- package/lib/shared/server/unwanted/mockApiSupport.js +19 -0
- package/lib/shared/server/unwanted/websocketMockSetup.js +48 -0
- package/lib/shared/server/urlConcat.js +32 -0
- package/lib/shared/utils/requireLocalOrGlobal.js +81 -0
- package/lib/shared/utils/utils.js +1 -0
- package/lib/shared/utils/versionPrint.js +20 -0
- package/npm-shrinkwrap.json +5657 -0
- package/package.json +64 -0
- package/polyfillForOldNodeVersion.js +10 -0
- package/templates/app/README.MD +30 -0
- package/templates/app/package.json +12 -0
- package/templates/library/README.MD +28 -0
- package/templates/library/package.json +11 -0
- package/templates/wms/index.html +43 -0
package/lib/shared/bundler/webpack/custom_plugins/I18nNumericIndexPlugin/I18nNumericIndexPlugin.js
ADDED
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
|
|
5
|
+
const path = require('path');
|
|
6
|
+
|
|
7
|
+
const {
|
|
8
|
+
sources,
|
|
9
|
+
Compilation
|
|
10
|
+
} = require('webpack');
|
|
11
|
+
|
|
12
|
+
const {
|
|
13
|
+
createHash
|
|
14
|
+
} = require("../I18nSplitPlugin/createHash");
|
|
15
|
+
|
|
16
|
+
const {
|
|
17
|
+
RawSource
|
|
18
|
+
} = sources;
|
|
19
|
+
const pluginName = 'I18nNumericIndexPlugin';
|
|
20
|
+
|
|
21
|
+
class I18nNumericIndexPlugin {
|
|
22
|
+
constructor(options) {
|
|
23
|
+
this.options = options;
|
|
24
|
+
this.numericMap = null;
|
|
25
|
+
this.numericMapPath = options.numericMapPath;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
loadNumericMapOnce(compilation) {
|
|
29
|
+
if (this.numericMap) {
|
|
30
|
+
return this.numericMap;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
try {
|
|
34
|
+
if (this.numericMapPath && fs.existsSync(this.numericMapPath)) {
|
|
35
|
+
const fileContent = fs.readFileSync(this.numericMapPath, 'utf-8');
|
|
36
|
+
const parsedData = JSON.parse(fileContent);
|
|
37
|
+
|
|
38
|
+
if (parsedData && parsedData.sortedOriginalKeys && parsedData.totalKeys !== undefined) {
|
|
39
|
+
this.numericMap = {
|
|
40
|
+
sortedOriginalKeys: parsedData.sortedOriginalKeys,
|
|
41
|
+
totalKeys: parsedData.totalKeys
|
|
42
|
+
};
|
|
43
|
+
compilation.logger.info(`${pluginName}: Loaded numeric map from ${this.numericMapPath}.`);
|
|
44
|
+
return this.numericMap;
|
|
45
|
+
} else {
|
|
46
|
+
compilation.logger.error(`${pluginName}: Invalid format in numeric map file at ${this.numericMapPath}.`);
|
|
47
|
+
this.numericMap = {
|
|
48
|
+
sortedOriginalKeys: [],
|
|
49
|
+
totalKeys: 0
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
} else {
|
|
53
|
+
compilation.logger.warn(`${pluginName}: Numeric map path not provided or file not found at ${this.numericMapPath}.`);
|
|
54
|
+
this.numericMap = {
|
|
55
|
+
sortedOriginalKeys: [],
|
|
56
|
+
totalKeys: 0
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
} catch (err) {
|
|
60
|
+
compilation.logger.error(`${pluginName}: Error loading numeric map from ${this.numericMapPath}: ${err.message}`);
|
|
61
|
+
this.numericMap = {
|
|
62
|
+
sortedOriginalKeys: [],
|
|
63
|
+
totalKeys: 0
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return this.numericMap;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
emitFile(compilation, baseFilenameTemplate, locale, fileContentData, jsonpFunc, typeSuffix = '') {
|
|
71
|
+
const fileContent = `${jsonpFunc}(${JSON.stringify(fileContentData)});`;
|
|
72
|
+
const source = new RawSource(fileContent);
|
|
73
|
+
const actualContentHash = createHash({
|
|
74
|
+
//
|
|
75
|
+
outputOptions: compilation.outputOptions,
|
|
76
|
+
content: fileContent
|
|
77
|
+
});
|
|
78
|
+
let processedFilenameTemplate = baseFilenameTemplate.replace(/\[locale\]/g, locale).replace(/\[name\]/g, locale).replace(/\[id\]/g, locale);
|
|
79
|
+
const finalFileName = compilation.getAssetPath(processedFilenameTemplate, {
|
|
80
|
+
locale: locale,
|
|
81
|
+
contentHash: actualContentHash,
|
|
82
|
+
hash: compilation.hash,
|
|
83
|
+
chunk: {
|
|
84
|
+
id: `i18n-${typeSuffix || 'data'}-${locale}`,
|
|
85
|
+
name: `${typeSuffix || 'data'}-${locale}`,
|
|
86
|
+
hash: actualContentHash,
|
|
87
|
+
contentHash: {
|
|
88
|
+
[this.options.moduleType || 'i18n/mini-extract']: actualContentHash
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
contentHashType: this.options.moduleType || 'i18n/mini-extract'
|
|
92
|
+
});
|
|
93
|
+
compilation.emitAsset(finalFileName, source);
|
|
94
|
+
compilation.logger.info(`${pluginName}: Emitted ${typeSuffix} i18n file for locale ${locale} to ${finalFileName}`);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
apply(compiler) {
|
|
98
|
+
compiler.hooks.thisCompilation.tap(pluginName, compilation => {
|
|
99
|
+
compilation.hooks.processAssets.tapAsync({
|
|
100
|
+
name: pluginName,
|
|
101
|
+
stage: Compilation.PROCESS_ASSETS_STAGE_SUMMARIZE
|
|
102
|
+
}, (assets, callback) => {
|
|
103
|
+
const {
|
|
104
|
+
sortedOriginalKeys,
|
|
105
|
+
totalKeys
|
|
106
|
+
} = this.loadNumericMapOnce(compilation);
|
|
107
|
+
|
|
108
|
+
if (totalKeys === 0 && (!sortedOriginalKeys || sortedOriginalKeys.length === 0)) {
|
|
109
|
+
compilation.logger.info(`${pluginName}: No numeric keys to process. Skipping numeric file emission.`);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const globallyUsedLiteralKeys = new Set();
|
|
113
|
+
const globallyUsedCommentKeys = new Set();
|
|
114
|
+
|
|
115
|
+
for (const module of compilation.modules) {
|
|
116
|
+
if (module.buildInfo) {
|
|
117
|
+
if (Array.isArray(module.buildInfo.loaderIdentifiedLiteralI18nKeys)) {
|
|
118
|
+
module.buildInfo.loaderIdentifiedLiteralI18nKeys.forEach(key => globallyUsedLiteralKeys.add(key));
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if (Array.isArray(module.buildInfo.loaderIdentifiedCommentI18nKeys)) {
|
|
122
|
+
module.buildInfo.loaderIdentifiedCommentI18nKeys.forEach(key => globallyUsedCommentKeys.add(key));
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
compilation.logger.info(`${pluginName}: Globally identified Literal Keys: ${globallyUsedLiteralKeys.size}, Comment Keys: ${globallyUsedCommentKeys.size}`);
|
|
128
|
+
const {
|
|
129
|
+
locales,
|
|
130
|
+
allI18nObject,
|
|
131
|
+
numericFilenameTemplate,
|
|
132
|
+
dynamicFilenameTemplate,
|
|
133
|
+
numericJsonpFunc,
|
|
134
|
+
dynamicJsonpFunc
|
|
135
|
+
} = this.options;
|
|
136
|
+
|
|
137
|
+
if (!locales || !allI18nObject || !numericFilenameTemplate || !dynamicFilenameTemplate || !numericJsonpFunc || !dynamicJsonpFunc) {
|
|
138
|
+
compilation.errors.push(new Error(`${pluginName}: Missing some required options (locales, allI18nObject, filename templates, jsonp funcs).`));
|
|
139
|
+
return callback();
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
if (totalKeys > 0 && sortedOriginalKeys && sortedOriginalKeys.length > 0) {
|
|
143
|
+
for (const locale of locales) {
|
|
144
|
+
const localeTranslations = allI18nObject[locale] || {};
|
|
145
|
+
const orderedNumericTranslations = new Array(totalKeys);
|
|
146
|
+
|
|
147
|
+
for (let i = 0; i < totalKeys; i++) {
|
|
148
|
+
const originalKey = sortedOriginalKeys[i];
|
|
149
|
+
|
|
150
|
+
if (globallyUsedLiteralKeys.has(originalKey)) {
|
|
151
|
+
orderedNumericTranslations[i] = localeTranslations[originalKey] !== undefined ? localeTranslations[originalKey] : 0; // Use 0 or null as placeholder for missing keys
|
|
152
|
+
} else {
|
|
153
|
+
orderedNumericTranslations[i] = 0; // Placeholder for keys not identified as literals or not used
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
this.emitFile(compilation, numericFilenameTemplate, locale, orderedNumericTranslations, numericJsonpFunc, 'numeric');
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
if (globallyUsedCommentKeys.size > 0) {
|
|
162
|
+
for (const locale of locales) {
|
|
163
|
+
const localeTranslations = allI18nObject[locale] || {};
|
|
164
|
+
const dynamicKeyTranslations = {};
|
|
165
|
+
globallyUsedCommentKeys.forEach(originalKey => {
|
|
166
|
+
if (localeTranslations[originalKey] !== undefined) {
|
|
167
|
+
dynamicKeyTranslations[originalKey] = localeTranslations[originalKey];
|
|
168
|
+
} else {
|
|
169
|
+
dynamicKeyTranslations[originalKey] = null;
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
if (Object.keys(dynamicKeyTranslations).length > 0) {
|
|
174
|
+
this.emitFile(compilation, dynamicFilenameTemplate, locale, dynamicKeyTranslations, dynamicJsonpFunc, 'dynamic');
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
} else {
|
|
178
|
+
compilation.logger.info(`${pluginName}: No globally used comment keys found. Skipping dynamic file emission.`);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
callback();
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
module.exports = {
|
|
189
|
+
I18nNumericIndexPlugin
|
|
190
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# I18n Split Plugin ContributionGuide
|
|
2
|
+
we have modifyed mini-css-extract-plugin to sute our needs of i18n related extraction and downloading.
|
|
3
|
+
So In future may be when we need to update mini-css-extract-plugin Kindly cross check with this I18n Plugin as well.
|
|
4
|
+
|
|
5
|
+
Even not breaking change, may be just performacne update or feature update. addeding that to this plugin will be use full. Kindly consider it.
|
|
6
|
+
|
|
7
|
+
## Thing we Ignored
|
|
8
|
+
* we use webpack ast hook for adding I18nDependency. So we did not need `loader.js`
|
|
9
|
+
* we ignore order of import in single chunk since I18n going to be download as object.
|
|
10
|
+
we did not need it.
|
|
11
|
+
*
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.I18nFilesEmitPlugin = void 0;
|
|
7
|
+
|
|
8
|
+
var _webpack = require("webpack");
|
|
9
|
+
|
|
10
|
+
var _createHash = require("./createHash");
|
|
11
|
+
|
|
12
|
+
var _pathCreator = require("./pathCreator");
|
|
13
|
+
|
|
14
|
+
var _propertiesUtils = require("./utils/propertiesUtils");
|
|
15
|
+
|
|
16
|
+
var _LocaleChunkAssetsStore = require("./LocaleChunkAssetsStore");
|
|
17
|
+
|
|
18
|
+
/* eslint-disable no-restricted-syntax */
|
|
19
|
+
const pluginName = 'I18nFilesEmitPlugin';
|
|
20
|
+
const {
|
|
21
|
+
RawSource
|
|
22
|
+
} = _webpack.sources;
|
|
23
|
+
|
|
24
|
+
class I18nFilesEmitPlugin {
|
|
25
|
+
constructor(options) {
|
|
26
|
+
this.options = options; // this.options = {
|
|
27
|
+
// locales: options.locales,
|
|
28
|
+
// chunkFilename: options.chunkFilename,
|
|
29
|
+
// filename: options.filename,
|
|
30
|
+
// allI18nObject: options.allI18nObject,
|
|
31
|
+
// jsonpFunc: options.jsonpFunc
|
|
32
|
+
// };
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
apply(compiler) {
|
|
36
|
+
compiler.hooks.thisCompilation.tap(pluginName, compilation => {
|
|
37
|
+
// Get store for cache
|
|
38
|
+
this.store = (0, _LocaleChunkAssetsStore.getLocaleChunkAssetsStore)(compilation);
|
|
39
|
+
const i18nStore = this.store;
|
|
40
|
+
compilation.hooks.beforeHash.tap(pluginName, () => {
|
|
41
|
+
i18nStore.clear();
|
|
42
|
+
this.createAndStoreFileContentForEveryChunkAndLocale(compilation);
|
|
43
|
+
});
|
|
44
|
+
compilation.hooks.chunkHash.tap(pluginName, (chunk, hash) => {
|
|
45
|
+
this.updateChunkHashForEveryLocale(chunk, hash);
|
|
46
|
+
});
|
|
47
|
+
compilation.hooks.contentHash.tap(pluginName, chunk => {
|
|
48
|
+
if (!i18nStore.isChunkHasI18n(chunk.id)) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
this.emitI18nFileForEveryLocale(chunk, compilation);
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
createAndStoreFileContentForEveryChunkAndLocale(compilation) {
|
|
58
|
+
const {
|
|
59
|
+
chunks
|
|
60
|
+
} = compilation;
|
|
61
|
+
const {
|
|
62
|
+
locales
|
|
63
|
+
} = this.options;
|
|
64
|
+
const i18nStore = this.store;
|
|
65
|
+
|
|
66
|
+
for (const chunk of chunks) {
|
|
67
|
+
const i18nKeys = i18nStore.getI18nKeysForChunk(chunk);
|
|
68
|
+
|
|
69
|
+
if (!i18nKeys.length) {
|
|
70
|
+
// eslint-disable-next-line no-continue
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
for (const locale of locales) {
|
|
75
|
+
const content = this.getI18nChunkFileContent(i18nKeys, locale);
|
|
76
|
+
i18nStore.storeData(chunk.id, locale, {
|
|
77
|
+
content
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
updateChunkHashForEveryLocale(chunk, hash) {
|
|
84
|
+
const {
|
|
85
|
+
locales
|
|
86
|
+
} = this.options;
|
|
87
|
+
const i18nStore = this.store;
|
|
88
|
+
|
|
89
|
+
if (i18nStore.isChunkHasI18n(chunk.id)) {
|
|
90
|
+
for (const loc of locales) {
|
|
91
|
+
const content = i18nStore.getContent(chunk.id, loc);
|
|
92
|
+
hash.update(content);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
emitI18nFileForEveryLocale(chunk, compilation) {
|
|
98
|
+
const i18nStore = this.store;
|
|
99
|
+
const {
|
|
100
|
+
locales,
|
|
101
|
+
chunkFilename,
|
|
102
|
+
filename
|
|
103
|
+
} = this.options;
|
|
104
|
+
const fileNameTemplate = chunk.canBeInitial() ? filename : chunkFilename; // const { chunks } = compilation;
|
|
105
|
+
|
|
106
|
+
for (const locale of locales) {
|
|
107
|
+
const content = i18nStore.getContent(chunk.id, locale);
|
|
108
|
+
const contentHash = (0, _createHash.createHash)({
|
|
109
|
+
outputOptions: compilation.outputOptions,
|
|
110
|
+
content
|
|
111
|
+
});
|
|
112
|
+
const {
|
|
113
|
+
filename
|
|
114
|
+
} = I18nFilesEmitPlugin.createFilenameWithHash({
|
|
115
|
+
compilation,
|
|
116
|
+
contentHash,
|
|
117
|
+
fileNameTemplate,
|
|
118
|
+
chunk,
|
|
119
|
+
locale
|
|
120
|
+
});
|
|
121
|
+
i18nStore.storeData(chunk.id, locale, {
|
|
122
|
+
contentHash,
|
|
123
|
+
filename
|
|
124
|
+
});
|
|
125
|
+
compilation.emitAsset(filename, new RawSource(content));
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
static createFilenameWithHash({
|
|
130
|
+
compilation,
|
|
131
|
+
fileNameTemplate,
|
|
132
|
+
chunk,
|
|
133
|
+
locale,
|
|
134
|
+
contentHash
|
|
135
|
+
}) {
|
|
136
|
+
const fileName = fileNameTemplate.replaceAll('[locale]', locale);
|
|
137
|
+
const filename = (0, _pathCreator.pathCreator)(fileName, compilation, {
|
|
138
|
+
hash: compilation.hash,
|
|
139
|
+
locale,
|
|
140
|
+
chunkName: chunk.name,
|
|
141
|
+
chunkId: chunk.id,
|
|
142
|
+
chunkHash: chunk.hash,
|
|
143
|
+
contentHash
|
|
144
|
+
});
|
|
145
|
+
return {
|
|
146
|
+
contentHash,
|
|
147
|
+
filename
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
getI18nContentForkeys(i18nKeys, locale) {
|
|
152
|
+
const {
|
|
153
|
+
allI18nObject
|
|
154
|
+
} = this.options;
|
|
155
|
+
const data = {};
|
|
156
|
+
|
|
157
|
+
for (const key of i18nKeys) {
|
|
158
|
+
data[key] = allI18nObject[locale][key];
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
return data;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
getI18nChunkFileContent(i18nKeys, loc) {
|
|
165
|
+
const {
|
|
166
|
+
jsonpFunc
|
|
167
|
+
} = this.options;
|
|
168
|
+
const data = this.getI18nContentForkeys(i18nKeys, loc);
|
|
169
|
+
return `${jsonpFunc}(${(0, _propertiesUtils.jsonToString)(data)})`;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
exports.I18nFilesEmitPlugin = I18nFilesEmitPlugin;
|
|
@@ -0,0 +1,76 @@
|
|
|
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
|
+
var _LocaleChunkAssetsStore = require("./LocaleChunkAssetsStore");
|
|
11
|
+
|
|
12
|
+
/* eslint-disable max-classes-per-file */
|
|
13
|
+
const pluginName = 'I18nKeysIdentifier';
|
|
14
|
+
/**
|
|
15
|
+
* this plugin search the i18 keys and make it as I18nDependency.
|
|
16
|
+
* how it works?
|
|
17
|
+
* this plugin get jsResourceI18nKeys in constructor.
|
|
18
|
+
* we walk thought the js files AST
|
|
19
|
+
* if any string literal in that AST is in jsResourceI18nKeys then we consider that string as I18n key
|
|
20
|
+
* after the walk of AST we get some I18n keys
|
|
21
|
+
* then we make it as I18nDependency.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
class I18nKeysIdentifer {
|
|
25
|
+
constructor({
|
|
26
|
+
jsResourceI18nKeys
|
|
27
|
+
}) {
|
|
28
|
+
this.jsResourceI18nKeys = jsResourceI18nKeys;
|
|
29
|
+
this.store = new _LocaleChunkAssetsStore.LocaleChunkAssetsStore();
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
apply(compiler) {
|
|
33
|
+
// const { splitChunks } = compiler.options.optimization;
|
|
34
|
+
// if (splitChunks) {
|
|
35
|
+
// if (splitChunks.defaultSizeTypes.includes('...')) {
|
|
36
|
+
// splitChunks.defaultSizeTypes.push(MODULE_TYPE);
|
|
37
|
+
// }
|
|
38
|
+
// }
|
|
39
|
+
compiler.hooks.thisCompilation.tap(pluginName, compilation => {
|
|
40
|
+
this.store.updateCompilation(compilation);
|
|
41
|
+
(0, _LocaleChunkAssetsStore.setLocaleChunkAssetsStore)(compilation, this.store);
|
|
42
|
+
});
|
|
43
|
+
compiler.hooks.normalModuleFactory.tap(pluginName, factory => {
|
|
44
|
+
// handler for parser
|
|
45
|
+
const handler = parser => {
|
|
46
|
+
parser.hooks.program.tap(pluginName, (ast, comments) => {
|
|
47
|
+
const {
|
|
48
|
+
module
|
|
49
|
+
} = parser.state; //
|
|
50
|
+
|
|
51
|
+
if (!(module && /\.jsx?$/.test(module.resource))) {
|
|
52
|
+
return;
|
|
53
|
+
} // i18n grep proper contract regex
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
let i18nKeys = (0, _utils.collectI18nKeysfromAST)(ast, this.jsResourceI18nKeys);
|
|
57
|
+
i18nKeys = i18nKeys.concat( // i18n grep proper contract regex
|
|
58
|
+
(0, _utils.collectI18nKeysfromComments)(comments, this.jsResourceI18nKeys));
|
|
59
|
+
|
|
60
|
+
if (i18nKeys.length) {
|
|
61
|
+
// console.log('i18nKeys.length', module.resource, i18nKeys);
|
|
62
|
+
this.store.updateModuleI18nKeys(module.resource, i18nKeys);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
}; // this below hook was tapped for collect I18n Key from files and add as Dependency
|
|
66
|
+
// const factory = params.normalModuleFactory;
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
factory.hooks.parser.for('javascript/auto').tap(pluginName, handler);
|
|
70
|
+
factory.hooks.parser.for('javascript/dynamic').tap(pluginName, handler);
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
exports.default = I18nKeysIdentifer;
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.I18nRuntimeDealerPlugin = void 0;
|
|
7
|
+
|
|
8
|
+
var _webpack = require("webpack");
|
|
9
|
+
|
|
10
|
+
var _htmlWebpackPlugin = _interopRequireDefault(require("html-webpack-plugin"));
|
|
11
|
+
|
|
12
|
+
var _constants = require("./constants");
|
|
13
|
+
|
|
14
|
+
var _getI18nLoadingRuntimeModule = require("./getI18nLoadingRuntimeModule");
|
|
15
|
+
|
|
16
|
+
var _templateFileName = require("./templateFileName");
|
|
17
|
+
|
|
18
|
+
var _hashUtils = require("./utils/hashUtils");
|
|
19
|
+
|
|
20
|
+
var _urlConcat = require("../../../../server/urlConcat");
|
|
21
|
+
|
|
22
|
+
var _I18nFilesEmitPlugin = require("./I18nFilesEmitPlugin");
|
|
23
|
+
|
|
24
|
+
var _LocaleChunkAssetsStore = require("./LocaleChunkAssetsStore");
|
|
25
|
+
|
|
26
|
+
var _logger = require("../../../../../logger");
|
|
27
|
+
|
|
28
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
29
|
+
|
|
30
|
+
const {
|
|
31
|
+
RawSource
|
|
32
|
+
} = _webpack.sources;
|
|
33
|
+
const pluginName = 'I18nRuntimeDealerPlugin'; // I18nExtractPlugin.loader = require.resolve('./loader');
|
|
34
|
+
|
|
35
|
+
class I18nRuntimeDealerPlugin {
|
|
36
|
+
constructor(options) {
|
|
37
|
+
this.options = options;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
apply(compiler) {
|
|
41
|
+
compiler.hooks.thisCompilation.tap(pluginName, compilation => {
|
|
42
|
+
// Get store for cache
|
|
43
|
+
this.store = (0, _LocaleChunkAssetsStore.getLocaleChunkAssetsStore)(compilation);
|
|
44
|
+
|
|
45
|
+
if (!this.options.runtime) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
this.createI18nDownloadCodeInRuntimeFile(compilation);
|
|
50
|
+
this.addI18nIntoInitialHtml(compilation);
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
addI18nIntoInitialHtml(compilation) {
|
|
55
|
+
const i18nStore = this.store;
|
|
56
|
+
|
|
57
|
+
_htmlWebpackPlugin.default.getHooks(compilation).beforeAssetTagGeneration.tap(pluginName, hookOptions => {
|
|
58
|
+
const {
|
|
59
|
+
assets
|
|
60
|
+
} = hookOptions;
|
|
61
|
+
const {
|
|
62
|
+
templateLabel,
|
|
63
|
+
filename,
|
|
64
|
+
publicPath = '',
|
|
65
|
+
mainChunkName
|
|
66
|
+
} = this.options; // const dummyContent = '// dummy comment';
|
|
67
|
+
|
|
68
|
+
const dummyContentHash = 'dummy0content0hashes';
|
|
69
|
+
const entryPoint = compilation.entrypoints.get(mainChunkName);
|
|
70
|
+
const initialChunks = Array.from(entryPoint.chunks).filter(c => c.canBeInitial() && c.id !== c.runtime);
|
|
71
|
+
const initialI18nAssets = initialChunks.filter(c => i18nStore.isChunkHasI18n(c)).map(c => {
|
|
72
|
+
const data = _I18nFilesEmitPlugin.I18nFilesEmitPlugin.createFilenameWithHash({
|
|
73
|
+
compilation,
|
|
74
|
+
fileNameTemplate: filename,
|
|
75
|
+
chunk: c,
|
|
76
|
+
locale: templateLabel,
|
|
77
|
+
// NOTE: we used dummy content hash.
|
|
78
|
+
// Because we have no plan on use in content hash to initial I18n chunks
|
|
79
|
+
// So Dummy hash was being used it will not work just skip warnings
|
|
80
|
+
contentHash: dummyContentHash
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
return (0, _urlConcat.urlConcat)(publicPath, data.filename);
|
|
84
|
+
});
|
|
85
|
+
const allJSAssets = [...initialI18nAssets, ...assets.js].map(url => url.replaceAll('[locale]', templateLabel).replaceAll('%5Blocale%5D', templateLabel));
|
|
86
|
+
return {
|
|
87
|
+
assets: { ...assets,
|
|
88
|
+
js: allJSAssets
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
createI18nDownloadCodeInRuntimeFile(compilation) {
|
|
95
|
+
const {
|
|
96
|
+
chunkFilename,
|
|
97
|
+
locales,
|
|
98
|
+
localeVarName
|
|
99
|
+
} = this.options;
|
|
100
|
+
const chunkFilenameHasContentHash = (0, _hashUtils.hasContentHash)(chunkFilename);
|
|
101
|
+
|
|
102
|
+
const getI18nChunks = mainChunk => this.filterI18nUsedChunks(mainChunk.getAllAsyncChunks());
|
|
103
|
+
|
|
104
|
+
const I18nLoadingRuntimeModule = (0, _getI18nLoadingRuntimeModule.getI18nLoadingRuntimeModule)({
|
|
105
|
+
getI18nChunks
|
|
106
|
+
});
|
|
107
|
+
const enabledChunks = new WeakSet();
|
|
108
|
+
|
|
109
|
+
const chunkFilenameUrlGenerator = (i18nChunks, locale) => (0, _templateFileName.templateFileName)({
|
|
110
|
+
compilation,
|
|
111
|
+
localeVarName,
|
|
112
|
+
dynamicFilename: chunkFilename,
|
|
113
|
+
contentHashes: this.getContentHashes(locale),
|
|
114
|
+
chunks: i18nChunks
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
const prefixFunc = () => _constants.I18N_CHUNK_NAME_GENERATION_SEGMENT;
|
|
118
|
+
|
|
119
|
+
const handler = (entryRuntimeChunk, set) => {
|
|
120
|
+
if (enabledChunks.has(entryRuntimeChunk)) {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
enabledChunks.add(entryRuntimeChunk);
|
|
125
|
+
const {
|
|
126
|
+
chunkFilename,
|
|
127
|
+
// filename: initialFilename,
|
|
128
|
+
runtimeOptions
|
|
129
|
+
} = this.options;
|
|
130
|
+
|
|
131
|
+
if (typeof chunkFilename === 'string' && /\[(full)?hash(:\d+)?\]/.test(chunkFilename)) {
|
|
132
|
+
set.add(_webpack.RuntimeGlobals.getFullHash);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
set.add(_webpack.RuntimeGlobals.publicPath);
|
|
136
|
+
compilation.addRuntimeModule(entryRuntimeChunk, new I18nLoadingRuntimeModule(set, {
|
|
137
|
+
prefixFunc: chunkFilenameHasContentHash ? prefixFunc : chunkFilenameUrlGenerator,
|
|
138
|
+
runtimeOptions,
|
|
139
|
+
chunkFilename
|
|
140
|
+
}));
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
compilation.hooks.runtimeRequirementInTree.for(_webpack.RuntimeGlobals.ensureChunkHandlers).tap(pluginName, handler);
|
|
144
|
+
|
|
145
|
+
if (chunkFilenameHasContentHash) {
|
|
146
|
+
compilation.hooks.processAssets.tap({
|
|
147
|
+
name: pluginName,
|
|
148
|
+
stage: _webpack.Compilation.PROCESS_ASSETS_STAGE_DERIVED // additionalAssets: true
|
|
149
|
+
|
|
150
|
+
}, assets => {
|
|
151
|
+
// eslint-disable-next-line no-underscore-dangle
|
|
152
|
+
const entries = compilation._getChunkGraphEntries();
|
|
153
|
+
|
|
154
|
+
function createRuntimeFilePerLocale({
|
|
155
|
+
locale,
|
|
156
|
+
runtimeFileName,
|
|
157
|
+
runtimeFileSourceStr,
|
|
158
|
+
i18nChunks
|
|
159
|
+
}) {
|
|
160
|
+
const newRuntimeName = runtimeFileName.replaceAll('[locale]', locale);
|
|
161
|
+
const replaceText = chunkFilenameUrlGenerator(i18nChunks, locale);
|
|
162
|
+
const replacedStr = runtimeFileSourceStr.replace(_constants.I18N_CHUNK_NAME_GENERATION_SEGMENT, replaceText);
|
|
163
|
+
compilation.emitAsset(newRuntimeName, new RawSource(replacedStr));
|
|
164
|
+
} // eslint-disable-next-line no-restricted-syntax
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
for (const entryChunk of entries) {
|
|
168
|
+
const i18nChunks = getI18nChunks(entryChunk);
|
|
169
|
+
const runtimeFileName = [...entryChunk.files][0];
|
|
170
|
+
const runtimeFileSourceStr = assets[runtimeFileName].source();
|
|
171
|
+
locales.forEach(locale => createRuntimeFilePerLocale({
|
|
172
|
+
locale,
|
|
173
|
+
entryChunk,
|
|
174
|
+
runtimeFileName,
|
|
175
|
+
runtimeFileSourceStr,
|
|
176
|
+
i18nChunks
|
|
177
|
+
})); // NOTE: we don't delete, Because of HTML plugin needs to add runtime file in html and efc
|
|
178
|
+
// compilation.deleteAsset(runtimeFileName);
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
compilation.hooks.processAssets.tap({
|
|
182
|
+
name: pluginName,
|
|
183
|
+
stage: _webpack.Compilation.PROCESS_ASSETS_STAGE_SUMMARIZE // additionalAssets: true
|
|
184
|
+
|
|
185
|
+
}, () => {
|
|
186
|
+
// eslint-disable-next-line no-underscore-dangle
|
|
187
|
+
const entries = compilation._getChunkGraphEntries(); // eslint-disable-next-line no-restricted-syntax
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
for (const entryChunk of entries) {
|
|
191
|
+
const runtimeFileName = [...entryChunk.files][0] || '';
|
|
192
|
+
|
|
193
|
+
if (runtimeFileName.includes('runtime') && runtimeFileName.includes('[locale]')) {
|
|
194
|
+
(0, _logger.verboseLogger)('deleteAsset', runtimeFileName);
|
|
195
|
+
compilation.deleteAsset(runtimeFileName);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
filterI18nUsedChunks(chunks) {
|
|
203
|
+
const i18nStore = this.store;
|
|
204
|
+
return Array.from(chunks).filter(c => i18nStore.isChunkHasI18n(c.id));
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
getContentHashes(locale) {
|
|
208
|
+
const i18nStore = this.store;
|
|
209
|
+
const contentHashes = {};
|
|
210
|
+
i18nStore.forEachChunkId(chunkId => {
|
|
211
|
+
const contentHash = i18nStore.getContentHash(chunkId, locale);
|
|
212
|
+
|
|
213
|
+
if (contentHash) {
|
|
214
|
+
contentHashes[chunkId] = contentHash;
|
|
215
|
+
}
|
|
216
|
+
}); // console.log({ contentHashes });
|
|
217
|
+
|
|
218
|
+
return contentHashes;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
exports.I18nRuntimeDealerPlugin = I18nRuntimeDealerPlugin;
|