🚀 Socket Launch Week Day 5:Introducing Repository Access Permissions and Custom Roles.Learn more
Sign In

@rushstack/localization-plugin

Package Overview
Dependencies
Maintainers
3
Versions
259
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@rushstack/localization-plugin - npm Package Compare versions

Comparing version
0.3.66
to
0.3.67
+35
-0
CHANGELOG.json

@@ -5,2 +5,37 @@ {

{
"version": "0.3.67",
"tag": "@rushstack/localization-plugin_v0.3.67",
"date": "Wed, 30 Sep 2020 06:53:53 GMT",
"comments": {
"patch": [
{
"comment": "Update README.md"
}
],
"dependency": [
{
"comment": "Updating dependency \"@rushstack/node-core-library\" to `3.34.0`"
},
{
"comment": "Updating dependency \"@rushstack/typings-generator\" to `0.2.11`"
},
{
"comment": "Updating dependency \"@rushstack/eslint-config\" to `2.1.2`"
},
{
"comment": "Updating dependency \"@rushstack/heft\" to `0.14.0`"
},
{
"comment": "Updating dependency \"@rushstack/heft-node-rig\" to `0.1.0`"
},
{
"comment": "Updating dependency \"@rushstack/set-webpack-public-path-plugin\" to `3.0.0`"
},
{
"comment": "Updating dependency \"@rushstack/set-webpack-public-path-plugin\" from `^2.4.65` to `^3.0.0`"
}
]
}
},
{
"version": "0.3.66",

@@ -7,0 +42,0 @@ "tag": "@rushstack/localization-plugin_v0.3.66",

+8
-1
# Change Log - @rushstack/localization-plugin
This log was last generated on Tue, 22 Sep 2020 05:45:57 GMT and should not be manually modified.
This log was last generated on Wed, 30 Sep 2020 06:53:53 GMT and should not be manually modified.
## 0.3.67
Wed, 30 Sep 2020 06:53:53 GMT
### Patches
- Update README.md
## 0.3.66

@@ -6,0 +13,0 @@ Tue, 22 Sep 2020 05:45:57 GMT

+1
-1

@@ -8,5 +8,5 @@ // This file is read by tools that parse documentation comments conforming to the TSDoc standard.

"packageName": "@microsoft/api-extractor",
"packageVersion": "7.9.21"
"packageVersion": "7.9.22"
}
]
}
"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const lodash = require("lodash");
exports.AssetProcessor = exports.PLACEHOLDER_REGEX = void 0;
const lodash = __importStar(require("lodash"));
const Constants_1 = require("./utilities/Constants");

@@ -7,0 +27,0 @@ exports.PLACEHOLDER_REGEX = new RegExp(`${Constants_1.Constants.STRING_PLACEHOLDER_PREFIX}_(\\\\*)_([A-C])(\\+[^+]+\\+)?_(\\d+)`, 'g');

@@ -1,1 +0,1 @@

{"version":3,"file":"AssetProcessor.js","sourceRoot":"","sources":["../src/AssetProcessor.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport * as Webpack from 'webpack';\r\nimport * as lodash from 'lodash';\r\n\r\nimport { Constants } from './utilities/Constants';\r\nimport { ILocaleElementMap } from './interfaces';\r\nimport { LocalizationPlugin, IStringSerialNumberData as IStringData } from './LocalizationPlugin';\r\n\r\ninterface IReconstructionElement {\r\n kind: 'static' | 'localized' | 'dynamic';\r\n}\r\n\r\ninterface IStaticReconstructionElement extends IReconstructionElement {\r\n kind: 'static';\r\n staticString: string;\r\n}\r\n\r\ninterface ILocalizedReconstructionElement extends IReconstructionElement {\r\n kind: 'localized';\r\n values: ILocaleElementMap;\r\n size: number;\r\n stringName: string;\r\n escapedBackslash: string;\r\n locFilePath: string;\r\n}\r\n\r\ninterface IDynamicReconstructionElement extends IReconstructionElement {\r\n kind: 'dynamic';\r\n valueFn: (locale: string | undefined, token: string | undefined) => string;\r\n size: number;\r\n escapedBackslash: string;\r\n token?: string;\r\n}\r\n\r\ninterface IParseResult {\r\n issues: string[];\r\n reconstructionSeries: IReconstructionElement[];\r\n}\r\n\r\ninterface IReconstructedString {\r\n source: string;\r\n size: number;\r\n}\r\n\r\ninterface ILocalizedReconstructionResult {\r\n result: Map<string, IReconstructedString>;\r\n issues: string[];\r\n}\r\n\r\ninterface INonLocalizedReconstructionResult {\r\n result: IReconstructedString;\r\n issues: string[];\r\n}\r\n\r\nexport interface IProcessAssetOptionsBase {\r\n plugin: LocalizationPlugin;\r\n compilation: Webpack.compilation.Compilation;\r\n assetName: string;\r\n asset: IAsset;\r\n chunk: Webpack.compilation.Chunk;\r\n noStringsLocaleName: string;\r\n chunkHasLocalizedModules: (chunk: Webpack.compilation.Chunk) => boolean;\r\n}\r\n\r\nexport interface IProcessNonLocalizedAssetOptions extends IProcessAssetOptionsBase {}\r\n\r\nexport interface IProcessLocalizedAssetOptions extends IProcessAssetOptionsBase {\r\n locales: Set<string>;\r\n fillMissingTranslationStrings: boolean;\r\n defaultLocale: string;\r\n}\r\n\r\nexport interface IAsset {\r\n size(): number;\r\n source(): string;\r\n}\r\n\r\nexport interface IProcessAssetResult {\r\n filename: string;\r\n asset: IAsset;\r\n}\r\n\r\nexport const PLACEHOLDER_REGEX: RegExp = new RegExp(\r\n `${Constants.STRING_PLACEHOLDER_PREFIX}_(\\\\\\\\*)_([A-C])(\\\\+[^+]+\\\\+)?_(\\\\d+)`,\r\n 'g'\r\n);\r\n\r\nexport class AssetProcessor {\r\n public static processLocalizedAsset(\r\n options: IProcessLocalizedAssetOptions\r\n ): Map<string, IProcessAssetResult> {\r\n const assetSource: string = options.asset.source();\r\n\r\n const parsedAsset: IParseResult = AssetProcessor._parseStringToReconstructionSequence(\r\n options.plugin,\r\n assetSource,\r\n this._getJsonpFunction(options.chunk, options.chunkHasLocalizedModules, options.noStringsLocaleName)\r\n );\r\n const reconstructedAsset: ILocalizedReconstructionResult = AssetProcessor._reconstructLocalized(\r\n parsedAsset.reconstructionSeries,\r\n options.locales,\r\n options.fillMissingTranslationStrings,\r\n options.defaultLocale,\r\n options.asset.size()\r\n );\r\n\r\n const parsedAssetName: IParseResult = AssetProcessor._parseStringToReconstructionSequence(\r\n options.plugin,\r\n options.assetName,\r\n () => {\r\n throw new Error('unsupported');\r\n }\r\n );\r\n const reconstructedAssetName: ILocalizedReconstructionResult = AssetProcessor._reconstructLocalized(\r\n parsedAssetName.reconstructionSeries,\r\n options.locales,\r\n options.fillMissingTranslationStrings,\r\n options.defaultLocale,\r\n options.assetName.length\r\n );\r\n\r\n const result: Map<string, IProcessAssetResult> = new Map<string, IProcessAssetResult>();\r\n for (const [locale, { source, size }] of reconstructedAsset.result) {\r\n const newAsset: IAsset = lodash.clone(options.asset);\r\n newAsset.source = () => source;\r\n newAsset.size = () => size;\r\n\r\n result.set(locale, {\r\n filename: reconstructedAssetName.result.get(locale)!.source,\r\n asset: newAsset\r\n });\r\n }\r\n\r\n const issues: string[] = [\r\n ...parsedAsset.issues,\r\n ...reconstructedAsset.issues,\r\n ...parsedAssetName.issues,\r\n ...reconstructedAssetName.issues\r\n ];\r\n\r\n if (issues.length > 0) {\r\n options.compilation.errors.push(\r\n Error(`localization:\\n${issues.map((issue) => ` ${issue}`).join('\\n')}`)\r\n );\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public static processNonLocalizedAsset(options: IProcessNonLocalizedAssetOptions): IProcessAssetResult {\r\n const assetSource: string = options.asset.source();\r\n\r\n const parsedAsset: IParseResult = AssetProcessor._parseStringToReconstructionSequence(\r\n options.plugin,\r\n assetSource,\r\n this._getJsonpFunction(options.chunk, options.chunkHasLocalizedModules, options.noStringsLocaleName)\r\n );\r\n const reconstructedAsset: INonLocalizedReconstructionResult = AssetProcessor._reconstructNonLocalized(\r\n parsedAsset.reconstructionSeries,\r\n options.asset.size(),\r\n options.noStringsLocaleName\r\n );\r\n\r\n const parsedAssetName: IParseResult = AssetProcessor._parseStringToReconstructionSequence(\r\n options.plugin,\r\n options.assetName,\r\n () => {\r\n throw new Error('unsupported');\r\n }\r\n );\r\n const reconstructedAssetName: INonLocalizedReconstructionResult = AssetProcessor._reconstructNonLocalized(\r\n parsedAssetName.reconstructionSeries,\r\n options.assetName.length,\r\n options.noStringsLocaleName\r\n );\r\n\r\n const issues: string[] = [\r\n ...parsedAsset.issues,\r\n ...reconstructedAsset.issues,\r\n ...parsedAssetName.issues,\r\n ...reconstructedAssetName.issues\r\n ];\r\n\r\n if (issues.length > 0) {\r\n options.compilation.errors.push(\r\n Error(`localization:\\n${issues.map((issue) => ` ${issue}`).join('\\n')}`)\r\n );\r\n }\r\n\r\n const newAsset: IAsset = lodash.clone(options.asset);\r\n newAsset.source = () => reconstructedAsset.result.source;\r\n newAsset.size = () => reconstructedAsset.result.size;\r\n return {\r\n filename: reconstructedAssetName.result.source,\r\n asset: newAsset\r\n };\r\n }\r\n\r\n private static _reconstructLocalized(\r\n reconstructionSeries: IReconstructionElement[],\r\n locales: Set<string>,\r\n fillMissingTranslationStrings: boolean,\r\n defaultLocale: string,\r\n initialSize: number\r\n ): ILocalizedReconstructionResult {\r\n const localizedResults: Map<string, IReconstructedString> = new Map<string, IReconstructedString>();\r\n const issues: string[] = [];\r\n\r\n for (const locale of locales) {\r\n const reconstruction: string[] = [];\r\n\r\n let sizeDiff: number = 0;\r\n for (const element of reconstructionSeries) {\r\n switch (element.kind) {\r\n case 'static': {\r\n reconstruction.push((element as IStaticReconstructionElement).staticString);\r\n break;\r\n }\r\n\r\n case 'localized': {\r\n const localizedElement: ILocalizedReconstructionElement = element as ILocalizedReconstructionElement;\r\n let newValue: string | undefined = localizedElement.values[locale];\r\n if (!newValue) {\r\n if (fillMissingTranslationStrings) {\r\n newValue = localizedElement.values[defaultLocale];\r\n } else {\r\n issues.push(\r\n `The string \"${localizedElement.stringName}\" in \"${localizedElement.locFilePath}\" is missing in ` +\r\n `the locale ${locale}`\r\n );\r\n\r\n newValue = '-- MISSING STRING --';\r\n }\r\n }\r\n\r\n const escapedBackslash: string = localizedElement.escapedBackslash || '\\\\';\r\n\r\n // Replace backslashes with the properly escaped backslash\r\n newValue = newValue.replace(/\\\\/g, escapedBackslash);\r\n\r\n // @todo: look into using JSON.parse(...) to get the escaping characters\r\n const escapingCharacterSequence: string = escapedBackslash.substr(escapedBackslash.length / 2);\r\n\r\n // Ensure the the quotemark, apostrophe, tab, and newline characters are properly escaped\r\n newValue = newValue.replace(/\\r/g, `${escapingCharacterSequence}r`);\r\n newValue = newValue.replace(/\\n/g, `${escapingCharacterSequence}n`);\r\n newValue = newValue.replace(/\\t/g, `${escapingCharacterSequence}t`);\r\n newValue = newValue.replace(/\\\"/g, `${escapingCharacterSequence}u0022`);\r\n newValue = newValue.replace(/\\'/g, `${escapingCharacterSequence}u0027`);\r\n\r\n reconstruction.push(newValue);\r\n sizeDiff += newValue.length - localizedElement.size;\r\n break;\r\n }\r\n\r\n case 'dynamic': {\r\n const dynamicElement: IDynamicReconstructionElement = element as IDynamicReconstructionElement;\r\n const newValue: string = dynamicElement.valueFn(locale, dynamicElement.token);\r\n reconstruction.push(newValue);\r\n sizeDiff += newValue.length - dynamicElement.size;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const newAssetSource: string = reconstruction.join('');\r\n localizedResults.set(locale, {\r\n source: newAssetSource,\r\n size: initialSize + sizeDiff\r\n });\r\n }\r\n\r\n return {\r\n issues,\r\n result: localizedResults\r\n };\r\n }\r\n\r\n private static _reconstructNonLocalized(\r\n reconstructionSeries: IReconstructionElement[],\r\n initialSize: number,\r\n noStringsLocaleName: string\r\n ): INonLocalizedReconstructionResult {\r\n const issues: string[] = [];\r\n\r\n const reconstruction: string[] = [];\r\n\r\n let sizeDiff: number = 0;\r\n for (const element of reconstructionSeries) {\r\n switch (element.kind) {\r\n case 'static': {\r\n reconstruction.push((element as IStaticReconstructionElement).staticString);\r\n break;\r\n }\r\n\r\n case 'localized': {\r\n const localizedElement: ILocalizedReconstructionElement = element as ILocalizedReconstructionElement;\r\n issues.push(\r\n `The string \"${localizedElement.stringName}\" in \"${localizedElement.locFilePath}\" appeared in an asset ` +\r\n 'that is not expected to contain localized resources.'\r\n );\r\n\r\n const newValue: string = '-- NOT EXPECTED TO BE LOCALIZED --';\r\n reconstruction.push(newValue);\r\n sizeDiff += newValue.length - localizedElement.size;\r\n break;\r\n }\r\n\r\n case 'dynamic': {\r\n const dynamicElement: IDynamicReconstructionElement = element as IDynamicReconstructionElement;\r\n const newValue: string = dynamicElement.valueFn(noStringsLocaleName, dynamicElement.token);\r\n reconstruction.push(newValue);\r\n sizeDiff += newValue.length - dynamicElement.size;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const newAssetSource: string = reconstruction.join('');\r\n return {\r\n issues,\r\n result: {\r\n source: newAssetSource,\r\n size: initialSize + sizeDiff\r\n }\r\n };\r\n }\r\n\r\n private static _parseStringToReconstructionSequence(\r\n plugin: LocalizationPlugin,\r\n source: string,\r\n jsonpFunction: (locale: string, chunkIdToken: string) => string\r\n ): IParseResult {\r\n const issues: string[] = [];\r\n const reconstructionSeries: IReconstructionElement[] = [];\r\n\r\n let lastIndex: number = 0;\r\n let regexResult: RegExpExecArray | null;\r\n while ((regexResult = PLACEHOLDER_REGEX.exec(source))) {\r\n // eslint-disable-line no-cond-assign\r\n const staticElement: IStaticReconstructionElement = {\r\n kind: 'static',\r\n staticString: source.substring(lastIndex, regexResult.index)\r\n };\r\n reconstructionSeries.push(staticElement);\r\n\r\n const [placeholder, escapedBackslash, elementLabel, token, placeholderSerialNumber] = regexResult;\r\n\r\n let localizedReconstructionElement: IReconstructionElement;\r\n switch (elementLabel) {\r\n case Constants.STRING_PLACEHOLDER_LABEL: {\r\n const stringData: IStringData | undefined = plugin.getDataForSerialNumber(placeholderSerialNumber);\r\n if (!stringData) {\r\n issues.push(`Missing placeholder ${placeholder}`);\r\n const brokenLocalizedElement: IStaticReconstructionElement = {\r\n kind: 'static',\r\n staticString: placeholder\r\n };\r\n localizedReconstructionElement = brokenLocalizedElement;\r\n } else {\r\n const localizedElement: ILocalizedReconstructionElement = {\r\n kind: 'localized',\r\n values: stringData.values,\r\n size: placeholder.length,\r\n locFilePath: stringData.locFilePath,\r\n escapedBackslash: escapedBackslash,\r\n stringName: stringData.stringName\r\n };\r\n localizedReconstructionElement = localizedElement;\r\n }\r\n break;\r\n }\r\n\r\n case Constants.LOCALE_NAME_PLACEHOLDER_LABEL: {\r\n const dynamicElement: IDynamicReconstructionElement = {\r\n kind: 'dynamic',\r\n valueFn: (locale: string) => locale,\r\n size: placeholder.length,\r\n escapedBackslash: escapedBackslash\r\n };\r\n localizedReconstructionElement = dynamicElement;\r\n break;\r\n }\r\n\r\n case Constants.JSONP_PLACEHOLDER_LABEL: {\r\n const dynamicElement: IDynamicReconstructionElement = {\r\n kind: 'dynamic',\r\n valueFn: jsonpFunction,\r\n size: placeholder.length,\r\n escapedBackslash: escapedBackslash,\r\n token: token.substring(1, token.length - 1)\r\n };\r\n localizedReconstructionElement = dynamicElement;\r\n break;\r\n }\r\n\r\n default: {\r\n throw new Error(`Unexpected label ${elementLabel}`);\r\n }\r\n }\r\n\r\n reconstructionSeries.push(localizedReconstructionElement);\r\n lastIndex = regexResult.index + placeholder.length;\r\n }\r\n\r\n const lastElement: IStaticReconstructionElement = {\r\n kind: 'static',\r\n staticString: source.substr(lastIndex)\r\n };\r\n reconstructionSeries.push(lastElement);\r\n\r\n return {\r\n issues,\r\n reconstructionSeries\r\n };\r\n }\r\n\r\n private static _getJsonpFunction(\r\n chunk: Webpack.compilation.Chunk,\r\n chunkHasLocalizedModules: (chunk: Webpack.compilation.Chunk) => boolean,\r\n noStringsLocaleName: string\r\n ): (locale: string, chunkIdToken: string | undefined) => string {\r\n const idsWithStrings: Set<string> = new Set<string>();\r\n const idsWithoutStrings: Set<string> = new Set<string>();\r\n\r\n const asyncChunks: Set<Webpack.compilation.Chunk> = chunk.getAllAsyncChunks();\r\n for (const asyncChunk of asyncChunks) {\r\n if (chunkHasLocalizedModules(asyncChunk)) {\r\n idsWithStrings.add(asyncChunk.id);\r\n } else {\r\n idsWithoutStrings.add(asyncChunk.id);\r\n }\r\n }\r\n\r\n if (idsWithStrings.size === 0) {\r\n return () => JSON.stringify(noStringsLocaleName);\r\n } else if (idsWithoutStrings.size === 0) {\r\n return (locale: string) => JSON.stringify(locale);\r\n } else {\r\n // Generate an array [<locale>, <nostrings locale>] and an object that is used as an indexer into that\r\n // object that maps chunk IDs to 0s for chunks with localized strings and 1s for chunks without localized\r\n // strings\r\n //\r\n // This can be improved in the future. We can maybe sort the chunks such that the chunks below a certain ID\r\n // number are localized and the those above are not.\r\n const chunkMapping: { [chunkId: string]: number } = {};\r\n for (const idWithStrings of idsWithStrings) {\r\n chunkMapping[idWithStrings] = 0;\r\n }\r\n\r\n for (const idWithoutStrings of idsWithoutStrings) {\r\n chunkMapping[idWithoutStrings] = 1;\r\n }\r\n\r\n return (locale: string, chunkIdToken: string) => {\r\n if (!locale) {\r\n throw new Error('Missing locale name.');\r\n }\r\n\r\n return `(${JSON.stringify([locale, noStringsLocaleName])})[${JSON.stringify(\r\n chunkMapping\r\n )}[${chunkIdToken}]]`;\r\n };\r\n }\r\n }\r\n}\r\n"]}
{"version":3,"file":"AssetProcessor.js","sourceRoot":"","sources":["../src/AssetProcessor.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport * as Webpack from 'webpack';\r\nimport * as lodash from 'lodash';\r\n\r\nimport { Constants } from './utilities/Constants';\r\nimport { ILocaleElementMap } from './interfaces';\r\nimport { LocalizationPlugin, IStringSerialNumberData as IStringData } from './LocalizationPlugin';\r\n\r\ninterface IReconstructionElement {\r\n kind: 'static' | 'localized' | 'dynamic';\r\n}\r\n\r\ninterface IStaticReconstructionElement extends IReconstructionElement {\r\n kind: 'static';\r\n staticString: string;\r\n}\r\n\r\ninterface ILocalizedReconstructionElement extends IReconstructionElement {\r\n kind: 'localized';\r\n values: ILocaleElementMap;\r\n size: number;\r\n stringName: string;\r\n escapedBackslash: string;\r\n locFilePath: string;\r\n}\r\n\r\ninterface IDynamicReconstructionElement extends IReconstructionElement {\r\n kind: 'dynamic';\r\n valueFn: (locale: string, token: string | undefined) => string;\r\n size: number;\r\n escapedBackslash: string;\r\n token?: string;\r\n}\r\n\r\ninterface IParseResult {\r\n issues: string[];\r\n reconstructionSeries: IReconstructionElement[];\r\n}\r\n\r\ninterface IReconstructedString {\r\n source: string;\r\n size: number;\r\n}\r\n\r\ninterface ILocalizedReconstructionResult {\r\n result: Map<string, IReconstructedString>;\r\n issues: string[];\r\n}\r\n\r\ninterface INonLocalizedReconstructionResult {\r\n result: IReconstructedString;\r\n issues: string[];\r\n}\r\n\r\nexport interface IProcessAssetOptionsBase {\r\n plugin: LocalizationPlugin;\r\n compilation: Webpack.compilation.Compilation;\r\n assetName: string;\r\n asset: IAsset;\r\n chunk: Webpack.compilation.Chunk;\r\n noStringsLocaleName: string;\r\n chunkHasLocalizedModules: (chunk: Webpack.compilation.Chunk) => boolean;\r\n}\r\n\r\nexport interface IProcessNonLocalizedAssetOptions extends IProcessAssetOptionsBase {}\r\n\r\nexport interface IProcessLocalizedAssetOptions extends IProcessAssetOptionsBase {\r\n locales: Set<string>;\r\n fillMissingTranslationStrings: boolean;\r\n defaultLocale: string;\r\n}\r\n\r\nexport interface IAsset {\r\n size(): number;\r\n source(): string;\r\n}\r\n\r\nexport interface IProcessAssetResult {\r\n filename: string;\r\n asset: IAsset;\r\n}\r\n\r\nexport const PLACEHOLDER_REGEX: RegExp = new RegExp(\r\n `${Constants.STRING_PLACEHOLDER_PREFIX}_(\\\\\\\\*)_([A-C])(\\\\+[^+]+\\\\+)?_(\\\\d+)`,\r\n 'g'\r\n);\r\n\r\nexport class AssetProcessor {\r\n public static processLocalizedAsset(\r\n options: IProcessLocalizedAssetOptions\r\n ): Map<string, IProcessAssetResult> {\r\n const assetSource: string = options.asset.source();\r\n\r\n const parsedAsset: IParseResult = AssetProcessor._parseStringToReconstructionSequence(\r\n options.plugin,\r\n assetSource,\r\n this._getJsonpFunction(options.chunk, options.chunkHasLocalizedModules, options.noStringsLocaleName)\r\n );\r\n const reconstructedAsset: ILocalizedReconstructionResult = AssetProcessor._reconstructLocalized(\r\n parsedAsset.reconstructionSeries,\r\n options.locales,\r\n options.fillMissingTranslationStrings,\r\n options.defaultLocale,\r\n options.asset.size()\r\n );\r\n\r\n const parsedAssetName: IParseResult = AssetProcessor._parseStringToReconstructionSequence(\r\n options.plugin,\r\n options.assetName,\r\n () => {\r\n throw new Error('unsupported');\r\n }\r\n );\r\n const reconstructedAssetName: ILocalizedReconstructionResult = AssetProcessor._reconstructLocalized(\r\n parsedAssetName.reconstructionSeries,\r\n options.locales,\r\n options.fillMissingTranslationStrings,\r\n options.defaultLocale,\r\n options.assetName.length\r\n );\r\n\r\n const result: Map<string, IProcessAssetResult> = new Map<string, IProcessAssetResult>();\r\n for (const [locale, { source, size }] of reconstructedAsset.result) {\r\n const newAsset: IAsset = lodash.clone(options.asset);\r\n newAsset.source = () => source;\r\n newAsset.size = () => size;\r\n\r\n result.set(locale, {\r\n filename: reconstructedAssetName.result.get(locale)!.source,\r\n asset: newAsset\r\n });\r\n }\r\n\r\n const issues: string[] = [\r\n ...parsedAsset.issues,\r\n ...reconstructedAsset.issues,\r\n ...parsedAssetName.issues,\r\n ...reconstructedAssetName.issues\r\n ];\r\n\r\n if (issues.length > 0) {\r\n options.compilation.errors.push(\r\n Error(`localization:\\n${issues.map((issue) => ` ${issue}`).join('\\n')}`)\r\n );\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public static processNonLocalizedAsset(options: IProcessNonLocalizedAssetOptions): IProcessAssetResult {\r\n const assetSource: string = options.asset.source();\r\n\r\n const parsedAsset: IParseResult = AssetProcessor._parseStringToReconstructionSequence(\r\n options.plugin,\r\n assetSource,\r\n this._getJsonpFunction(options.chunk, options.chunkHasLocalizedModules, options.noStringsLocaleName)\r\n );\r\n const reconstructedAsset: INonLocalizedReconstructionResult = AssetProcessor._reconstructNonLocalized(\r\n parsedAsset.reconstructionSeries,\r\n options.asset.size(),\r\n options.noStringsLocaleName\r\n );\r\n\r\n const parsedAssetName: IParseResult = AssetProcessor._parseStringToReconstructionSequence(\r\n options.plugin,\r\n options.assetName,\r\n () => {\r\n throw new Error('unsupported');\r\n }\r\n );\r\n const reconstructedAssetName: INonLocalizedReconstructionResult = AssetProcessor._reconstructNonLocalized(\r\n parsedAssetName.reconstructionSeries,\r\n options.assetName.length,\r\n options.noStringsLocaleName\r\n );\r\n\r\n const issues: string[] = [\r\n ...parsedAsset.issues,\r\n ...reconstructedAsset.issues,\r\n ...parsedAssetName.issues,\r\n ...reconstructedAssetName.issues\r\n ];\r\n\r\n if (issues.length > 0) {\r\n options.compilation.errors.push(\r\n Error(`localization:\\n${issues.map((issue) => ` ${issue}`).join('\\n')}`)\r\n );\r\n }\r\n\r\n const newAsset: IAsset = lodash.clone(options.asset);\r\n newAsset.source = () => reconstructedAsset.result.source;\r\n newAsset.size = () => reconstructedAsset.result.size;\r\n return {\r\n filename: reconstructedAssetName.result.source,\r\n asset: newAsset\r\n };\r\n }\r\n\r\n private static _reconstructLocalized(\r\n reconstructionSeries: IReconstructionElement[],\r\n locales: Set<string>,\r\n fillMissingTranslationStrings: boolean,\r\n defaultLocale: string,\r\n initialSize: number\r\n ): ILocalizedReconstructionResult {\r\n const localizedResults: Map<string, IReconstructedString> = new Map<string, IReconstructedString>();\r\n const issues: string[] = [];\r\n\r\n for (const locale of locales) {\r\n const reconstruction: string[] = [];\r\n\r\n let sizeDiff: number = 0;\r\n for (const element of reconstructionSeries) {\r\n switch (element.kind) {\r\n case 'static': {\r\n reconstruction.push((element as IStaticReconstructionElement).staticString);\r\n break;\r\n }\r\n\r\n case 'localized': {\r\n const localizedElement: ILocalizedReconstructionElement = element as ILocalizedReconstructionElement;\r\n let newValue: string | undefined = localizedElement.values[locale];\r\n if (!newValue) {\r\n if (fillMissingTranslationStrings) {\r\n newValue = localizedElement.values[defaultLocale];\r\n } else {\r\n issues.push(\r\n `The string \"${localizedElement.stringName}\" in \"${localizedElement.locFilePath}\" is missing in ` +\r\n `the locale ${locale}`\r\n );\r\n\r\n newValue = '-- MISSING STRING --';\r\n }\r\n }\r\n\r\n const escapedBackslash: string = localizedElement.escapedBackslash || '\\\\';\r\n\r\n // Replace backslashes with the properly escaped backslash\r\n newValue = newValue.replace(/\\\\/g, escapedBackslash);\r\n\r\n // @todo: look into using JSON.parse(...) to get the escaping characters\r\n const escapingCharacterSequence: string = escapedBackslash.substr(escapedBackslash.length / 2);\r\n\r\n // Ensure the the quotemark, apostrophe, tab, and newline characters are properly escaped\r\n newValue = newValue.replace(/\\r/g, `${escapingCharacterSequence}r`);\r\n newValue = newValue.replace(/\\n/g, `${escapingCharacterSequence}n`);\r\n newValue = newValue.replace(/\\t/g, `${escapingCharacterSequence}t`);\r\n newValue = newValue.replace(/\\\"/g, `${escapingCharacterSequence}u0022`);\r\n newValue = newValue.replace(/\\'/g, `${escapingCharacterSequence}u0027`);\r\n\r\n reconstruction.push(newValue);\r\n sizeDiff += newValue.length - localizedElement.size;\r\n break;\r\n }\r\n\r\n case 'dynamic': {\r\n const dynamicElement: IDynamicReconstructionElement = element as IDynamicReconstructionElement;\r\n const newValue: string = dynamicElement.valueFn(locale, dynamicElement.token);\r\n reconstruction.push(newValue);\r\n sizeDiff += newValue.length - dynamicElement.size;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const newAssetSource: string = reconstruction.join('');\r\n localizedResults.set(locale, {\r\n source: newAssetSource,\r\n size: initialSize + sizeDiff\r\n });\r\n }\r\n\r\n return {\r\n issues,\r\n result: localizedResults\r\n };\r\n }\r\n\r\n private static _reconstructNonLocalized(\r\n reconstructionSeries: IReconstructionElement[],\r\n initialSize: number,\r\n noStringsLocaleName: string\r\n ): INonLocalizedReconstructionResult {\r\n const issues: string[] = [];\r\n\r\n const reconstruction: string[] = [];\r\n\r\n let sizeDiff: number = 0;\r\n for (const element of reconstructionSeries) {\r\n switch (element.kind) {\r\n case 'static': {\r\n reconstruction.push((element as IStaticReconstructionElement).staticString);\r\n break;\r\n }\r\n\r\n case 'localized': {\r\n const localizedElement: ILocalizedReconstructionElement = element as ILocalizedReconstructionElement;\r\n issues.push(\r\n `The string \"${localizedElement.stringName}\" in \"${localizedElement.locFilePath}\" appeared in an asset ` +\r\n 'that is not expected to contain localized resources.'\r\n );\r\n\r\n const newValue: string = '-- NOT EXPECTED TO BE LOCALIZED --';\r\n reconstruction.push(newValue);\r\n sizeDiff += newValue.length - localizedElement.size;\r\n break;\r\n }\r\n\r\n case 'dynamic': {\r\n const dynamicElement: IDynamicReconstructionElement = element as IDynamicReconstructionElement;\r\n const newValue: string = dynamicElement.valueFn(noStringsLocaleName, dynamicElement.token);\r\n reconstruction.push(newValue);\r\n sizeDiff += newValue.length - dynamicElement.size;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const newAssetSource: string = reconstruction.join('');\r\n return {\r\n issues,\r\n result: {\r\n source: newAssetSource,\r\n size: initialSize + sizeDiff\r\n }\r\n };\r\n }\r\n\r\n private static _parseStringToReconstructionSequence(\r\n plugin: LocalizationPlugin,\r\n source: string,\r\n jsonpFunction: (locale: string, chunkIdToken: string | undefined) => string\r\n ): IParseResult {\r\n const issues: string[] = [];\r\n const reconstructionSeries: IReconstructionElement[] = [];\r\n\r\n let lastIndex: number = 0;\r\n let regexResult: RegExpExecArray | null;\r\n while ((regexResult = PLACEHOLDER_REGEX.exec(source))) {\r\n // eslint-disable-line no-cond-assign\r\n const staticElement: IStaticReconstructionElement = {\r\n kind: 'static',\r\n staticString: source.substring(lastIndex, regexResult.index)\r\n };\r\n reconstructionSeries.push(staticElement);\r\n\r\n const [placeholder, escapedBackslash, elementLabel, token, placeholderSerialNumber] = regexResult;\r\n\r\n let localizedReconstructionElement: IReconstructionElement;\r\n switch (elementLabel) {\r\n case Constants.STRING_PLACEHOLDER_LABEL: {\r\n const stringData: IStringData | undefined = plugin.getDataForSerialNumber(placeholderSerialNumber);\r\n if (!stringData) {\r\n issues.push(`Missing placeholder ${placeholder}`);\r\n const brokenLocalizedElement: IStaticReconstructionElement = {\r\n kind: 'static',\r\n staticString: placeholder\r\n };\r\n localizedReconstructionElement = brokenLocalizedElement;\r\n } else {\r\n const localizedElement: ILocalizedReconstructionElement = {\r\n kind: 'localized',\r\n values: stringData.values,\r\n size: placeholder.length,\r\n locFilePath: stringData.locFilePath,\r\n escapedBackslash: escapedBackslash,\r\n stringName: stringData.stringName\r\n };\r\n localizedReconstructionElement = localizedElement;\r\n }\r\n break;\r\n }\r\n\r\n case Constants.LOCALE_NAME_PLACEHOLDER_LABEL: {\r\n const dynamicElement: IDynamicReconstructionElement = {\r\n kind: 'dynamic',\r\n valueFn: (locale: string) => locale,\r\n size: placeholder.length,\r\n escapedBackslash: escapedBackslash\r\n };\r\n localizedReconstructionElement = dynamicElement;\r\n break;\r\n }\r\n\r\n case Constants.JSONP_PLACEHOLDER_LABEL: {\r\n const dynamicElement: IDynamicReconstructionElement = {\r\n kind: 'dynamic',\r\n valueFn: jsonpFunction,\r\n size: placeholder.length,\r\n escapedBackslash: escapedBackslash,\r\n token: token.substring(1, token.length - 1)\r\n };\r\n localizedReconstructionElement = dynamicElement;\r\n break;\r\n }\r\n\r\n default: {\r\n throw new Error(`Unexpected label ${elementLabel}`);\r\n }\r\n }\r\n\r\n reconstructionSeries.push(localizedReconstructionElement);\r\n lastIndex = regexResult.index + placeholder.length;\r\n }\r\n\r\n const lastElement: IStaticReconstructionElement = {\r\n kind: 'static',\r\n staticString: source.substr(lastIndex)\r\n };\r\n reconstructionSeries.push(lastElement);\r\n\r\n return {\r\n issues,\r\n reconstructionSeries\r\n };\r\n }\r\n\r\n private static _getJsonpFunction(\r\n chunk: Webpack.compilation.Chunk,\r\n chunkHasLocalizedModules: (chunk: Webpack.compilation.Chunk) => boolean,\r\n noStringsLocaleName: string\r\n ): (locale: string, chunkIdToken: string | undefined) => string {\r\n const idsWithStrings: Set<string> = new Set<string>();\r\n const idsWithoutStrings: Set<string> = new Set<string>();\r\n\r\n const asyncChunks: Set<Webpack.compilation.Chunk> = chunk.getAllAsyncChunks();\r\n for (const asyncChunk of asyncChunks) {\r\n if (chunkHasLocalizedModules(asyncChunk)) {\r\n idsWithStrings.add(asyncChunk.id);\r\n } else {\r\n idsWithoutStrings.add(asyncChunk.id);\r\n }\r\n }\r\n\r\n if (idsWithStrings.size === 0) {\r\n return () => JSON.stringify(noStringsLocaleName);\r\n } else if (idsWithoutStrings.size === 0) {\r\n return (locale: string) => JSON.stringify(locale);\r\n } else {\r\n // Generate an array [<locale>, <nostrings locale>] and an object that is used as an indexer into that\r\n // object that maps chunk IDs to 0s for chunks with localized strings and 1s for chunks without localized\r\n // strings\r\n //\r\n // This can be improved in the future. We can maybe sort the chunks such that the chunks below a certain ID\r\n // number are localized and the those above are not.\r\n const chunkMapping: { [chunkId: string]: number } = {};\r\n for (const idWithStrings of idsWithStrings) {\r\n chunkMapping[idWithStrings] = 0;\r\n }\r\n\r\n for (const idWithoutStrings of idsWithoutStrings) {\r\n chunkMapping[idWithoutStrings] = 1;\r\n }\r\n\r\n return (locale: string, chunkIdToken: string | undefined) => {\r\n if (!locale) {\r\n throw new Error('Missing locale name.');\r\n }\r\n\r\n return `(${JSON.stringify([locale, noStringsLocaleName])})[${JSON.stringify(\r\n chunkMapping\r\n )}[${chunkIdToken}]]`;\r\n };\r\n }\r\n }\r\n}\r\n"]}

@@ -6,7 +6,7 @@ "use strict";

var LocalizationPlugin_1 = require("./LocalizationPlugin");
exports.LocalizationPlugin = LocalizationPlugin_1.LocalizationPlugin;
Object.defineProperty(exports, "LocalizationPlugin", { enumerable: true, get: function () { return LocalizationPlugin_1.LocalizationPlugin; } });
var LocFileParser_1 = require("./utilities/LocFileParser");
exports._LocFileParser = LocFileParser_1.LocFileParser;
Object.defineProperty(exports, "_LocFileParser", { enumerable: true, get: function () { return LocFileParser_1.LocFileParser; } });
var LocFileTypingsGenerator_1 = require("./LocFileTypingsGenerator");
exports.TypingsGenerator = LocFileTypingsGenerator_1.LocFileTypingsGenerator;
Object.defineProperty(exports, "TypingsGenerator", { enumerable: true, get: function () { return LocFileTypingsGenerator_1.LocFileTypingsGenerator; } });
//# sourceMappingURL=index.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;AAE3D,2DAAqG;AAA5F,kDAAA,kBAAkB,CAAA;AAuB3B,2DAGmC;AAFjC,yCAAA,aAAa,CAAkB;AAMjC,qEAGmC;AADjC,qDAAA,uBAAuB,CAAoB","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nexport { LocalizationPlugin, IStringPlaceholder as _IStringPlaceholder } from './LocalizationPlugin';\r\n\r\nexport {\r\n IDefaultLocaleOptions,\r\n ILocaleData,\r\n ILocaleElementMap,\r\n ILocaleFileData,\r\n ILocalizationFile as _ILocalizationFile,\r\n ILocalizationPluginOptions,\r\n ILocalizationStats,\r\n ILocalizationStatsChunkGroup,\r\n ILocalizationStatsEntrypoint,\r\n ILocalizationStatsOptions,\r\n ILocalizedData,\r\n ILocalizedString as _ILocalizedString,\r\n ILocalizedStrings,\r\n IPassthroughLocaleOptions,\r\n IPseudolocaleOptions,\r\n IPseudolocalesOptions,\r\n IResolvedMissingTranslations,\r\n ITypingsGenerationOptions\r\n} from './interfaces';\r\n\r\nexport {\r\n LocFileParser as _LocFileParser,\r\n IParseLocFileOptions as _IParseLocFileOptions\r\n} from './utilities/LocFileParser';\r\n\r\nexport { ILocalizedWebpackChunk } from './webpackInterfaces';\r\n\r\nexport {\r\n ITypingsGeneratorOptions,\r\n LocFileTypingsGenerator as TypingsGenerator\r\n} from './LocFileTypingsGenerator';\r\n"]}
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;AAE3D,2DAAqG;AAA5F,wHAAA,kBAAkB,OAAA;AAuB3B,2DAGmC;AAFjC,+GAAA,aAAa,OAAkB;AAMjC,qEAGmC;AADjC,2HAAA,uBAAuB,OAAoB","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nexport { LocalizationPlugin, IStringPlaceholder as _IStringPlaceholder } from './LocalizationPlugin';\r\n\r\nexport {\r\n IDefaultLocaleOptions,\r\n ILocaleData,\r\n ILocaleElementMap,\r\n ILocaleFileData,\r\n ILocalizationFile as _ILocalizationFile,\r\n ILocalizationPluginOptions,\r\n ILocalizationStats,\r\n ILocalizationStatsChunkGroup,\r\n ILocalizationStatsEntrypoint,\r\n ILocalizationStatsOptions,\r\n ILocalizedData,\r\n ILocalizedString as _ILocalizedString,\r\n ILocalizedStrings,\r\n IPassthroughLocaleOptions,\r\n IPseudolocaleOptions,\r\n IPseudolocalesOptions,\r\n IResolvedMissingTranslations,\r\n ITypingsGenerationOptions\r\n} from './interfaces';\r\n\r\nexport {\r\n LocFileParser as _LocFileParser,\r\n IParseLocFileOptions as _IParseLocFileOptions\r\n} from './utilities/LocFileParser';\r\n\r\nexport { ILocalizedWebpackChunk } from './webpackInterfaces';\r\n\r\nexport {\r\n ITypingsGeneratorOptions,\r\n LocFileTypingsGenerator as TypingsGenerator\r\n} from './LocFileTypingsGenerator';\r\n"]}

@@ -1,1 +0,1 @@

{"version":3,"file":"LoaderFactory.d.ts","sourceRoot":"","sources":["../../src/loaders/LoaderFactory.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAE3D,MAAM,WAAW,kBAAkB;IACjC,wBAAwB,EAAE,WAAW,GAAG,SAAS,CAAC;CACnD;AAED,MAAM,WAAW,aAAa;IAC5B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;CAC9B;AAED,wBAAgB,aAAa,CAAC,QAAQ,SAAS,kBAAkB,EAC/D,WAAW,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,KAAK,aAAa,GACtF,MAAM,CAAC,MAAM,CAMf"}
{"version":3,"file":"LoaderFactory.d.ts","sourceRoot":"","sources":["../../src/loaders/LoaderFactory.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAE3D,MAAM,WAAW,kBAAkB;IACjC,wBAAwB,EAAE,WAAW,GAAG,SAAS,CAAC;CACnD;AAED,MAAM,WAAW,aAAa;IAC5B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;CAC9B;AAED,wBAAgB,aAAa,CAAC,QAAQ,SAAS,kBAAkB,EAC/D,WAAW,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,KAAK,aAAa,GACtF,MAAM,CAAC,MAAM,CAUf"}
"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const loaderUtils = require("loader-utils");
exports.loaderFactory = void 0;
const loaderUtils = __importStar(require("loader-utils"));
function loaderFactory(innerLoader) {
return function (content) {
const options = loaderUtils.getOptions(this);
if (typeof content !== 'string') {
content = content.toString();
}
const resultObject = innerLoader.call(this, this.resourcePath, content, options);

@@ -10,0 +33,0 @@ return JSON.stringify(resultObject);

@@ -1,1 +0,1 @@

{"version":3,"file":"LoaderFactory.js","sourceRoot":"","sources":["../../src/loaders/LoaderFactory.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;AAG3D,4CAA4C;AAW5C,SAAgB,aAAa,CAC3B,WAAuF;IAEvF,OAAO,UAAsC,OAAe;QAC1D,MAAM,OAAO,GAAa,WAAW,CAAC,UAAU,CAAC,IAAI,CAAa,CAAC;QACnE,MAAM,YAAY,GAAkB,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAChG,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACtC,CAAC,CAAC;AACJ,CAAC;AARD,sCAQC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport { loader } from 'webpack';\r\nimport * as loaderUtils from 'loader-utils';\r\nimport { NewlineKind } from '@rushstack/node-core-library';\r\n\r\nexport interface IBaseLoaderOptions {\r\n resxNewlineNormalization: NewlineKind | undefined;\r\n}\r\n\r\nexport interface ILoaderResult {\r\n [stringName: string]: string;\r\n}\r\n\r\nexport function loaderFactory<TOptions extends IBaseLoaderOptions>(\r\n innerLoader: (locFilePath: string, content: string, options: TOptions) => ILoaderResult\r\n): loader.Loader {\r\n return function (this: loader.LoaderContext, content: string): string {\r\n const options: TOptions = loaderUtils.getOptions(this) as TOptions;\r\n const resultObject: ILoaderResult = innerLoader.call(this, this.resourcePath, content, options);\r\n return JSON.stringify(resultObject);\r\n };\r\n}\r\n"]}
{"version":3,"file":"LoaderFactory.js","sourceRoot":"","sources":["../../src/loaders/LoaderFactory.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;;;;;;;;;;;;;;;;;;;;AAG3D,0DAA4C;AAW5C,SAAgB,aAAa,CAC3B,WAAuF;IAEvF,OAAO,UAAsC,OAAwB;QACnE,MAAM,OAAO,GAAa,WAAW,CAAC,UAAU,CAAC,IAAI,CAAa,CAAC;QACnE,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;YAC/B,OAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;SAC9B;QAED,MAAM,YAAY,GAAkB,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAChG,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACtC,CAAC,CAAC;AACJ,CAAC;AAZD,sCAYC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport { loader } from 'webpack';\r\nimport * as loaderUtils from 'loader-utils';\r\nimport { NewlineKind } from '@rushstack/node-core-library';\r\n\r\nexport interface IBaseLoaderOptions {\r\n resxNewlineNormalization: NewlineKind | undefined;\r\n}\r\n\r\nexport interface ILoaderResult {\r\n [stringName: string]: string;\r\n}\r\n\r\nexport function loaderFactory<TOptions extends IBaseLoaderOptions>(\r\n innerLoader: (locFilePath: string, content: string, options: TOptions) => ILoaderResult\r\n): loader.Loader {\r\n return function (this: loader.LoaderContext, content: string | Buffer): string {\r\n const options: TOptions = loaderUtils.getOptions(this) as TOptions;\r\n if (typeof content !== 'string') {\r\n content = content.toString();\r\n }\r\n\r\n const resultObject: ILoaderResult = innerLoader.call(this, this.resourcePath, content, options);\r\n return JSON.stringify(resultObject);\r\n };\r\n}\r\n"]}

@@ -1,1 +0,1 @@

{"version":3,"file":"LocalizationPlugin.d.ts","sourceRoot":"","sources":["../src/LocalizationPlugin.ts"],"names":[],"mappings":"AAGA,OAAO,EAAwB,QAAQ,EAAe,MAAM,8BAA8B,CAAC;AAC3F,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AASnC,OAAO,EACL,0BAA0B,EAG1B,iBAAiB,EACjB,iBAAiB,EAGlB,MAAM,cAAc,CAAC;AAQtB;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,yBAAyB,EAAE,MAAM,EAAE,CAAC;IAEpC,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AA0BD;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAID;;;;GAIG;AACH,qBAAa,kBAAmB,YAAW,OAAO,CAAC,MAAM;IACvD;;OAEG;IACI,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAyC;IAE3F,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,qCAAqC,CAAoB;IACjE,OAAO,CAAC,cAAc,CAAkC;IACxD,OAAO,CAAC,yBAAyB,CAAa;IAC9C,OAAO,CAAC,qBAAqB,CAGzB;IACJ,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,sBAAsB,CAAS;IACvC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,oBAAoB,CAAS;IACrC,OAAO,CAAC,8BAA8B,CAAU;IAChD,OAAO,CAAC,iBAAiB,CAGrB;IACJ,OAAO,CAAC,yBAAyB,CAA0B;IAE3D;;;;OAIG;IACH,OAAO,CAAC,yBAAyB,CAG7B;gBAEe,OAAO,EAAE,0BAA0B;IAI/C,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,GAAG,IAAI;IAoU9C;;;;OAIG;IACI,iBAAiB,CACtB,QAAQ,EAAE,QAAQ,EAClB,qBAAqB,EAAE,MAAM,EAC7B,qBAAqB,EAAE,iBAAiB,GACvC,wBAAwB;IAyE3B;;OAEG;IACI,sBAAsB,CAAC,YAAY,EAAE,MAAM,GAAG,uBAAuB,GAAG,SAAS;IAIxF,OAAO,CAAC,WAAW;IAkCnB,OAAO,CAAC,6BAA6B;IAwNrC,OAAO,CAAC,qBAAqB;IAQ7B,OAAO,CAAC,yBAAyB;IA+BjC,OAAO,CAAC,iCAAiC;CAQ1C"}
{"version":3,"file":"LocalizationPlugin.d.ts","sourceRoot":"","sources":["../src/LocalizationPlugin.ts"],"names":[],"mappings":"AAGA,OAAO,EAAwB,QAAQ,EAAe,MAAM,8BAA8B,CAAC;AAC3F,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AASnC,OAAO,EACL,0BAA0B,EAG1B,iBAAiB,EACjB,iBAAiB,EAGlB,MAAM,cAAc,CAAC;AAQtB;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,yBAAyB,EAAE,MAAM,EAAE,CAAC;IAEpC,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AA0BD;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAID;;;;GAIG;AACH,qBAAa,kBAAmB,YAAW,OAAO,CAAC,MAAM;IACvD;;OAEG;IACI,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAyC;IAE3F,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,qCAAqC,CAAqB;IAClE,OAAO,CAAC,cAAc,CAAkC;IACxD,OAAO,CAAC,yBAAyB,CAAa;IAC9C,OAAO,CAAC,qBAAqB,CAGzB;IACJ,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,sBAAsB,CAAU;IACxC,OAAO,CAAC,cAAc,CAAU;IAChC,OAAO,CAAC,oBAAoB,CAAU;IACtC,OAAO,CAAC,8BAA8B,CAAW;IACjD,OAAO,CAAC,iBAAiB,CAGrB;IACJ,OAAO,CAAC,yBAAyB,CAA0B;IAE3D;;;;OAIG;IACH,OAAO,CAAC,yBAAyB,CAG7B;gBAEe,OAAO,EAAE,0BAA0B;IAI/C,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,GAAG,IAAI;IA8U9C;;;;OAIG;IACI,iBAAiB,CACtB,QAAQ,EAAE,QAAQ,EAClB,qBAAqB,EAAE,MAAM,EAC7B,qBAAqB,EAAE,iBAAiB,GACvC,wBAAwB;IAyE3B;;OAEG;IACI,sBAAsB,CAAC,YAAY,EAAE,MAAM,GAAG,uBAAuB,GAAG,SAAS;IAIxF,OAAO,CAAC,WAAW;IAkCnB,OAAO,CAAC,6BAA6B;IAwNrC,OAAO,CAAC,qBAAqB;IAQ7B,OAAO,CAAC,yBAAyB;IA+BjC,OAAO,CAAC,iCAAiC;CAQ1C"}
"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.LocalizationPlugin = void 0;
const node_core_library_1 = require("@rushstack/node-core-library");
const Webpack = require("webpack");
const path = require("path");
const Webpack = __importStar(require("webpack"));
const path = __importStar(require("path"));
const Constants_1 = require("./utilities/Constants");

@@ -43,3 +63,3 @@ const WebpackConfigurationUpdater_1 = require("./WebpackConfigurationUpdater");

if (!isWebpack4) {
throw new Error('The localization plugin requires webpack 4');
throw new Error(`The ${LocalizationPlugin.name} plugin requires Webpack 4`);
}

@@ -106,3 +126,4 @@ if (this._options.typingsOptions && compiler.context) {

if (errors.length === 0) {
compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation) => {
compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (untypedCompilation) => {
const compilation = untypedCompilation;
compilation.mainTemplate.hooks.assetPath.tap(PLUGIN_NAME, (assetPath, options) => {

@@ -128,3 +149,5 @@ if (options.contentHashType === 'javascript' &&

});
compilation.hooks.optimizeChunks.tap(PLUGIN_NAME, (chunks, chunkGroups) => {
compilation.hooks.optimizeChunks.tap(PLUGIN_NAME, (untypedChunks, untypedChunkGroups) => {
const chunks = untypedChunks;
const chunkGroups = untypedChunkGroups;
let chunksHaveAnyChildren = false;

@@ -131,0 +154,0 @@ for (const chunkGroup of chunkGroups) {

@@ -1,1 +0,1 @@

{"version":3,"file":"LocalizationPlugin.js","sourceRoot":"","sources":["../src/LocalizationPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport { JsonFile, FileSystem, Terminal, NewlineKind } from '@rushstack/node-core-library';\r\nimport * as Webpack from 'webpack';\r\nimport * as path from 'path';\r\nimport * as Tapable from 'tapable';\r\n\r\nimport { Constants } from './utilities/Constants';\r\nimport {\r\n IWebpackConfigurationUpdaterOptions,\r\n WebpackConfigurationUpdater\r\n} from './WebpackConfigurationUpdater';\r\nimport {\r\n ILocalizationPluginOptions,\r\n ILocalizationStats,\r\n ILocaleFileData,\r\n ILocalizationFile,\r\n ILocaleElementMap,\r\n ILocalizedStrings,\r\n IResolvedMissingTranslations\r\n} from './interfaces';\r\nimport { ILocalizedWebpackChunk } from './webpackInterfaces';\r\nimport { LocFileTypingsGenerator } from './LocFileTypingsGenerator';\r\nimport { Pseudolocalization } from './Pseudolocalization';\r\nimport { EntityMarker } from './utilities/EntityMarker';\r\nimport { IAsset, IProcessAssetResult, AssetProcessor, PLACEHOLDER_REGEX } from './AssetProcessor';\r\nimport { LocFileParser } from './utilities/LocFileParser';\r\n\r\n/**\r\n * @internal\r\n */\r\nexport interface IStringPlaceholder {\r\n value: string;\r\n suffix: string;\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nexport interface IAddDefaultLocFileResult {\r\n /**\r\n * A list of paths to translation files that were loaded\r\n */\r\n additionalLoadedFilePaths: string[];\r\n\r\n errors: Error[];\r\n}\r\n\r\ninterface IExtendedMainTemplate {\r\n hooks: {\r\n assetPath: Tapable.SyncHook<string, IAssetPathOptions>;\r\n };\r\n}\r\n\r\ninterface IExtendedConfiguration extends Webpack.compilation.Compilation {\r\n options: Webpack.Configuration;\r\n}\r\n\r\ninterface IExtendedChunkGroup extends Webpack.compilation.ChunkGroup {\r\n getChildren(): Webpack.compilation.Chunk[];\r\n}\r\n\r\ninterface IExtendedChunk extends Webpack.compilation.Chunk {\r\n filenameTemplate: string;\r\n}\r\n\r\ninterface IAssetPathOptions {\r\n chunk: Webpack.compilation.Chunk;\r\n contentHashType: string;\r\n filename: string;\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nexport interface IStringSerialNumberData {\r\n values: ILocaleElementMap;\r\n locFilePath: string;\r\n stringName: string;\r\n}\r\n\r\nconst PLUGIN_NAME: string = 'localization';\r\n\r\n/**\r\n * This plugin facilitates localization in webpack.\r\n *\r\n * @public\r\n */\r\nexport class LocalizationPlugin implements Webpack.Plugin {\r\n /**\r\n * @internal\r\n */\r\n public stringKeys: Map<string, IStringPlaceholder> = new Map<string, IStringPlaceholder>();\r\n\r\n private _options: ILocalizationPluginOptions;\r\n private _resolvedTranslatedStringsFromOptions: ILocalizedStrings;\r\n private _filesToIgnore: Set<string> = new Set<string>();\r\n private _stringPlaceholderCounter: number = 0;\r\n private _stringPlaceholderMap: Map<string, IStringSerialNumberData> = new Map<\r\n string,\r\n IStringSerialNumberData\r\n >();\r\n private _locales: Set<string> = new Set<string>();\r\n private _passthroughLocaleName: string;\r\n private _defaultLocale: string;\r\n private _noStringsLocaleName: string;\r\n private _fillMissingTranslationStrings: boolean;\r\n private _pseudolocalizers: Map<string, (str: string) => string> = new Map<\r\n string,\r\n (str: string) => string\r\n >();\r\n private _resxNewlineNormalization: NewlineKind | undefined;\r\n\r\n /**\r\n * The outermost map's keys are the locale names.\r\n * The middle map's keys are the resolved, file names.\r\n * The innermost map's keys are the string identifiers and its values are the string values.\r\n */\r\n private _resolvedLocalizedStrings: Map<string, Map<string, Map<string, string>>> = new Map<\r\n string,\r\n Map<string, Map<string, string>>\r\n >();\r\n\r\n public constructor(options: ILocalizationPluginOptions) {\r\n this._options = options;\r\n }\r\n\r\n public apply(compiler: Webpack.Compiler): void {\r\n const isWebpack4: boolean = !!compiler.hooks;\r\n\r\n if (!isWebpack4) {\r\n throw new Error('The localization plugin requires webpack 4');\r\n }\r\n\r\n if (this._options.typingsOptions && compiler.context) {\r\n if (\r\n this._options.typingsOptions.generatedTsFolder &&\r\n !path.isAbsolute(this._options.typingsOptions.generatedTsFolder)\r\n ) {\r\n this._options.typingsOptions.generatedTsFolder = path.resolve(\r\n compiler.context,\r\n this._options.typingsOptions.generatedTsFolder\r\n );\r\n }\r\n\r\n if (\r\n this._options.typingsOptions.sourceRoot &&\r\n !path.isAbsolute(this._options.typingsOptions.sourceRoot)\r\n ) {\r\n this._options.typingsOptions.sourceRoot = path.resolve(\r\n compiler.context,\r\n this._options.typingsOptions.sourceRoot\r\n );\r\n }\r\n }\r\n\r\n // https://github.com/webpack/webpack-dev-server/pull/1929/files#diff-15fb51940da53816af13330d8ce69b4eR66\r\n const isWebpackDevServer: boolean = process.env.WEBPACK_DEV_SERVER === 'true';\r\n\r\n const { errors, warnings } = this._initializeAndValidateOptions(compiler.options, isWebpackDevServer);\r\n\r\n let typingsPreprocessor: LocFileTypingsGenerator | undefined;\r\n if (this._options.typingsOptions) {\r\n typingsPreprocessor = new LocFileTypingsGenerator({\r\n srcFolder: this._options.typingsOptions.sourceRoot || compiler.context,\r\n generatedTsFolder: this._options.typingsOptions.generatedTsFolder,\r\n exportAsDefault: this._options.typingsOptions.exportAsDefault,\r\n filesToIgnore: this._options.filesToIgnore\r\n });\r\n } else {\r\n typingsPreprocessor = undefined;\r\n }\r\n\r\n const webpackConfigurationUpdaterOptions: IWebpackConfigurationUpdaterOptions = {\r\n pluginInstance: this,\r\n configuration: compiler.options,\r\n filesToIgnore: this._filesToIgnore,\r\n localeNameOrPlaceholder: Constants.LOCALE_NAME_PLACEHOLDER,\r\n resxNewlineNormalization: this._resxNewlineNormalization\r\n };\r\n\r\n if (errors.length > 0 || warnings.length > 0) {\r\n compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation: Webpack.compilation.Compilation) => {\r\n compilation.errors.push(...errors);\r\n compilation.warnings.push(...warnings);\r\n });\r\n\r\n if (errors.length > 0) {\r\n // If there are any errors, just pass through the resources in source and don't do any\r\n // additional configuration\r\n WebpackConfigurationUpdater.amendWebpackConfigurationForInPlaceLocFiles(\r\n webpackConfigurationUpdaterOptions\r\n );\r\n return;\r\n }\r\n }\r\n\r\n if (isWebpackDevServer) {\r\n if (typingsPreprocessor) {\r\n compiler.hooks.afterEnvironment.tapPromise(\r\n PLUGIN_NAME,\r\n async () => await typingsPreprocessor!.runWatcherAsync()\r\n );\r\n\r\n if (!compiler.options.plugins) {\r\n compiler.options.plugins = [];\r\n }\r\n\r\n compiler.options.plugins.push(\r\n new Webpack.WatchIgnorePlugin([this._options.typingsOptions!.generatedTsFolder])\r\n );\r\n }\r\n\r\n WebpackConfigurationUpdater.amendWebpackConfigurationForInPlaceLocFiles(\r\n webpackConfigurationUpdaterOptions\r\n );\r\n } else {\r\n if (typingsPreprocessor) {\r\n compiler.hooks.beforeRun.tapPromise(\r\n PLUGIN_NAME,\r\n async () => await typingsPreprocessor!.generateTypingsAsync()\r\n );\r\n }\r\n\r\n WebpackConfigurationUpdater.amendWebpackConfigurationForMultiLocale(webpackConfigurationUpdaterOptions);\r\n\r\n if (errors.length === 0) {\r\n compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation: IExtendedConfiguration) => {\r\n ((compilation.mainTemplate as unknown) as IExtendedMainTemplate).hooks.assetPath.tap(\r\n PLUGIN_NAME,\r\n (assetPath: string, options: IAssetPathOptions) => {\r\n if (\r\n options.contentHashType === 'javascript' &&\r\n assetPath.match(Constants.LOCALE_FILENAME_TOKEN_REGEX)\r\n ) {\r\n // Does this look like an async chunk URL generator?\r\n if (typeof options.chunk.id === 'string' && options.chunk.id.match(/^\\\" \\+/)) {\r\n return assetPath.replace(\r\n Constants.LOCALE_FILENAME_TOKEN_REGEX,\r\n `\" + ${Constants.JSONP_PLACEHOLDER} + \"`\r\n );\r\n } else {\r\n return assetPath.replace(\r\n Constants.LOCALE_FILENAME_TOKEN_REGEX,\r\n Constants.LOCALE_NAME_PLACEHOLDER\r\n );\r\n }\r\n } else if (assetPath.match(Constants.NO_LOCALE_SOURCE_MAP_FILENAME_TOKEN_REGEX)) {\r\n // Replace the placeholder with the [locale] token for sourcemaps\r\n const deLocalizedFilename: string = options.filename.replace(\r\n PLACEHOLDER_REGEX,\r\n Constants.LOCALE_FILENAME_TOKEN\r\n );\r\n return assetPath.replace(\r\n Constants.NO_LOCALE_SOURCE_MAP_FILENAME_TOKEN_REGEX,\r\n deLocalizedFilename\r\n );\r\n } else {\r\n return assetPath;\r\n }\r\n }\r\n );\r\n\r\n compilation.hooks.optimizeChunks.tap(\r\n PLUGIN_NAME,\r\n (chunks: IExtendedChunk[], chunkGroups: IExtendedChunkGroup[]) => {\r\n let chunksHaveAnyChildren: boolean = false;\r\n for (const chunkGroup of chunkGroups) {\r\n const children: Webpack.compilation.Chunk[] = chunkGroup.getChildren();\r\n if (children.length > 0) {\r\n chunksHaveAnyChildren = true;\r\n break;\r\n }\r\n }\r\n\r\n if (\r\n chunksHaveAnyChildren &&\r\n (!compilation.options.output ||\r\n !compilation.options.output.chunkFilename ||\r\n compilation.options.output.chunkFilename.indexOf(Constants.LOCALE_FILENAME_TOKEN) === -1)\r\n ) {\r\n compilation.errors.push(\r\n new Error(\r\n 'The configuration.output.chunkFilename property must be provided and must include ' +\r\n `the ${Constants.LOCALE_FILENAME_TOKEN} placeholder`\r\n )\r\n );\r\n\r\n return;\r\n }\r\n\r\n for (const chunk of chunks) {\r\n // See if the chunk contains any localized modules or loads any localized chunks\r\n const localizedChunk: boolean = this._chunkHasLocalizedModules(chunk);\r\n\r\n // Change the chunk's name to include either the locale name or the locale name for chunks without strings\r\n const replacementValue: string = localizedChunk\r\n ? Constants.LOCALE_NAME_PLACEHOLDER\r\n : this._noStringsLocaleName;\r\n if (chunk.hasRuntime()) {\r\n chunk.filenameTemplate = (compilation.options.output!.filename as string).replace(\r\n Constants.LOCALE_FILENAME_TOKEN_REGEX,\r\n replacementValue\r\n );\r\n } else {\r\n chunk.filenameTemplate = compilation.options.output!.chunkFilename!.replace(\r\n Constants.LOCALE_FILENAME_TOKEN_REGEX,\r\n replacementValue\r\n );\r\n }\r\n }\r\n }\r\n );\r\n });\r\n\r\n compiler.hooks.emit.tap(PLUGIN_NAME, (compilation: Webpack.compilation.Compilation) => {\r\n const localizationStats: ILocalizationStats = {\r\n entrypoints: {},\r\n namedChunkGroups: {}\r\n };\r\n\r\n const alreadyProcessedAssets: Set<string> = new Set<string>();\r\n const hotUpdateRegex: RegExp = /\\.hot-update\\.js$/;\r\n\r\n for (const untypedChunk of compilation.chunks) {\r\n const chunk: ILocalizedWebpackChunk = untypedChunk;\r\n const chunkFilesSet: Set<string> = new Set(chunk.files);\r\n function processChunkJsFile(callback: (chunkFilename: string) => void): void {\r\n let alreadyProcessedAFileInThisChunk: boolean = false;\r\n for (const chunkFilename of chunk.files) {\r\n if (\r\n chunkFilename.endsWith('.js') && // Ensure this is a JS file\r\n !hotUpdateRegex.test(chunkFilename) && // Ensure this is not a webpack hot update\r\n !alreadyProcessedAssets.has(chunkFilename) // Ensure this isn't a vendor chunk we've already processed\r\n ) {\r\n if (alreadyProcessedAFileInThisChunk) {\r\n throw new Error(\r\n `Found more than one JS file in chunk \"${chunk.name}\". This is not expected.`\r\n );\r\n }\r\n\r\n alreadyProcessedAFileInThisChunk = true;\r\n alreadyProcessedAssets.add(chunkFilename);\r\n callback(chunkFilename);\r\n }\r\n }\r\n }\r\n\r\n if (this._chunkHasLocalizedModules(chunk)) {\r\n processChunkJsFile((chunkFilename) => {\r\n if (chunkFilename.indexOf(Constants.LOCALE_NAME_PLACEHOLDER) === -1) {\r\n throw new Error(\r\n `Asset ${chunkFilename} is expected to be localized, but is missing a locale placeholder`\r\n );\r\n }\r\n\r\n const asset: IAsset = compilation.assets[chunkFilename];\r\n\r\n const resultingAssets: Map<\r\n string,\r\n IProcessAssetResult\r\n > = AssetProcessor.processLocalizedAsset({\r\n plugin: this,\r\n compilation,\r\n assetName: chunkFilename,\r\n asset,\r\n chunk,\r\n chunkHasLocalizedModules: this._chunkHasLocalizedModules.bind(this),\r\n locales: this._locales,\r\n noStringsLocaleName: this._noStringsLocaleName,\r\n fillMissingTranslationStrings: this._fillMissingTranslationStrings,\r\n defaultLocale: this._defaultLocale\r\n });\r\n\r\n // Delete the existing asset because it's been renamed\r\n delete compilation.assets[chunkFilename];\r\n chunkFilesSet.delete(chunkFilename);\r\n\r\n const localizedChunkAssets: ILocaleElementMap = {};\r\n for (const [locale, newAsset] of resultingAssets) {\r\n compilation.assets[newAsset.filename] = newAsset.asset;\r\n localizedChunkAssets[locale] = newAsset.filename;\r\n chunkFilesSet.add(newAsset.filename);\r\n }\r\n\r\n if (chunk.hasRuntime()) {\r\n // This is an entrypoint\r\n localizationStats.entrypoints[chunk.name] = {\r\n localizedAssets: localizedChunkAssets\r\n };\r\n } else {\r\n // This is a secondary chunk\r\n if (chunk.name) {\r\n localizationStats.namedChunkGroups[chunk.name] = {\r\n localizedAssets: localizedChunkAssets\r\n };\r\n }\r\n }\r\n\r\n chunk.localizedFiles = localizedChunkAssets;\r\n });\r\n } else {\r\n processChunkJsFile((chunkFilename) => {\r\n const asset: IAsset = compilation.assets[chunkFilename];\r\n\r\n const resultingAsset: IProcessAssetResult = AssetProcessor.processNonLocalizedAsset({\r\n plugin: this,\r\n compilation,\r\n assetName: chunkFilename,\r\n asset,\r\n chunk,\r\n noStringsLocaleName: this._noStringsLocaleName,\r\n chunkHasLocalizedModules: this._chunkHasLocalizedModules.bind(this)\r\n });\r\n\r\n // Delete the existing asset because it's been renamed\r\n delete compilation.assets[chunkFilename];\r\n chunkFilesSet.delete(chunkFilename);\r\n\r\n compilation.assets[resultingAsset.filename] = resultingAsset.asset;\r\n chunkFilesSet.add(resultingAsset.filename);\r\n });\r\n }\r\n\r\n chunk.files = Array.from(chunkFilesSet);\r\n }\r\n\r\n if (this._options.localizationStats) {\r\n if (this._options.localizationStats.dropPath) {\r\n const resolvedLocalizationStatsDropPath: string = path.resolve(\r\n compiler.outputPath,\r\n this._options.localizationStats.dropPath\r\n );\r\n JsonFile.save(localizationStats, resolvedLocalizationStatsDropPath, {\r\n ensureFolderExists: true\r\n });\r\n }\r\n\r\n if (this._options.localizationStats.callback) {\r\n try {\r\n this._options.localizationStats.callback(localizationStats);\r\n } catch (e) {\r\n /* swallow errors from the callback */\r\n }\r\n }\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n *\r\n * @returns\r\n */\r\n public addDefaultLocFile(\r\n terminal: Terminal,\r\n localizedResourcePath: string,\r\n localizedResourceData: ILocalizationFile\r\n ): IAddDefaultLocFileResult {\r\n const additionalLoadedFilePaths: string[] = [];\r\n const errors: Error[] = [];\r\n\r\n const locFileData: ILocaleFileData = this._convertLocalizationFileToLocData(localizedResourceData);\r\n this._addLocFile(this._defaultLocale, localizedResourcePath, locFileData);\r\n\r\n const normalizeLocalizedData: (localizedData: ILocaleFileData | string) => ILocaleFileData = (\r\n localizedData\r\n ) => {\r\n if (typeof localizedData === 'string') {\r\n additionalLoadedFilePaths.push(localizedData);\r\n const localizationFile: ILocalizationFile = LocFileParser.parseLocFile({\r\n filePath: localizedData,\r\n content: FileSystem.readFile(localizedData),\r\n terminal: terminal,\r\n resxNewlineNormalization: this._resxNewlineNormalization\r\n });\r\n\r\n return this._convertLocalizationFileToLocData(localizationFile);\r\n } else {\r\n return localizedData;\r\n }\r\n };\r\n\r\n const missingLocales: string[] = [];\r\n for (const [translatedLocaleName, translatedStrings] of Object.entries(\r\n this._resolvedTranslatedStringsFromOptions\r\n )) {\r\n const translatedLocFileFromOptions: ILocaleFileData | string | undefined =\r\n translatedStrings[localizedResourcePath];\r\n if (!translatedLocFileFromOptions) {\r\n missingLocales.push(translatedLocaleName);\r\n } else {\r\n const translatedLocFileData: ILocaleFileData = normalizeLocalizedData(translatedLocFileFromOptions);\r\n this._addLocFile(translatedLocaleName, localizedResourcePath, translatedLocFileData);\r\n }\r\n }\r\n\r\n if (missingLocales.length > 0 && this._options.localizedData.resolveMissingTranslatedStrings) {\r\n let resolvedTranslatedData: IResolvedMissingTranslations | undefined = undefined;\r\n try {\r\n resolvedTranslatedData = this._options.localizedData.resolveMissingTranslatedStrings(\r\n missingLocales,\r\n localizedResourcePath\r\n );\r\n } catch (e) {\r\n errors.push(e);\r\n }\r\n\r\n if (resolvedTranslatedData) {\r\n for (const [resolvedLocaleName, resolvedLocaleData] of Object.entries(resolvedTranslatedData)) {\r\n if (resolvedLocaleData) {\r\n const translatedLocFileData: ILocaleFileData = normalizeLocalizedData(resolvedLocaleData);\r\n this._addLocFile(resolvedLocaleName, localizedResourcePath, translatedLocFileData);\r\n }\r\n }\r\n }\r\n }\r\n\r\n this._pseudolocalizers.forEach((pseudolocalizer: (str: string) => string, pseudolocaleName: string) => {\r\n const pseudolocFileData: ILocaleFileData = {};\r\n\r\n for (const [stringName, stringValue] of Object.entries(locFileData)) {\r\n pseudolocFileData[stringName] = pseudolocalizer(stringValue);\r\n }\r\n\r\n this._addLocFile(pseudolocaleName, localizedResourcePath, pseudolocFileData);\r\n });\r\n\r\n return { additionalLoadedFilePaths, errors };\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public getDataForSerialNumber(serialNumber: string): IStringSerialNumberData | undefined {\r\n return this._stringPlaceholderMap.get(serialNumber);\r\n }\r\n\r\n private _addLocFile(\r\n localeName: string,\r\n localizedFilePath: string,\r\n localizedFileData: ILocaleFileData\r\n ): void {\r\n const filesMap: Map<string, Map<string, string>> = this._resolvedLocalizedStrings.get(localeName)!;\r\n\r\n const stringsMap: Map<string, string> = new Map<string, string>();\r\n filesMap.set(localizedFilePath, stringsMap);\r\n\r\n for (const [stringName, stringValue] of Object.entries(localizedFileData)) {\r\n const stringKey: string = `${localizedFilePath}?${stringName}`;\r\n if (!this.stringKeys.has(stringKey)) {\r\n const placeholder: IStringPlaceholder = this._getPlaceholderString();\r\n this.stringKeys.set(stringKey, placeholder);\r\n }\r\n\r\n const placeholder: IStringPlaceholder = this.stringKeys.get(stringKey)!;\r\n if (!this._stringPlaceholderMap.has(placeholder.suffix)) {\r\n this._stringPlaceholderMap.set(placeholder.suffix, {\r\n values: {\r\n [this._passthroughLocaleName]: stringName\r\n },\r\n locFilePath: localizedFilePath,\r\n stringName: stringName\r\n });\r\n }\r\n\r\n this._stringPlaceholderMap.get(placeholder.suffix)!.values[localeName] = stringValue;\r\n\r\n stringsMap.set(stringName, stringValue);\r\n }\r\n }\r\n\r\n private _initializeAndValidateOptions(\r\n configuration: Webpack.Configuration,\r\n isWebpackDevServer: boolean\r\n ): { errors: Error[]; warnings: Error[] } {\r\n const errors: Error[] = [];\r\n const warnings: Error[] = [];\r\n\r\n function ensureValidLocaleName(localeName: string): boolean {\r\n const LOCALE_NAME_REGEX: RegExp = /[a-z-]/i;\r\n if (!localeName.match(LOCALE_NAME_REGEX)) {\r\n errors.push(\r\n new Error(`Invalid locale name: ${localeName}. Locale names may only contain letters and hyphens.`)\r\n );\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n }\r\n\r\n // START configuration\r\n if (\r\n !configuration.output ||\r\n !configuration.output.filename ||\r\n typeof configuration.output.filename !== 'string' ||\r\n configuration.output.filename.indexOf(Constants.LOCALE_FILENAME_TOKEN) === -1\r\n ) {\r\n errors.push(\r\n new Error(\r\n 'The configuration.output.filename property must be provided, must be a string, and must include ' +\r\n `the ${Constants.LOCALE_FILENAME_TOKEN} placeholder`\r\n )\r\n );\r\n }\r\n // END configuration\r\n\r\n // START options.filesToIgnore\r\n // eslint-disable-next-line no-lone-blocks\r\n {\r\n for (const filePath of this._options.filesToIgnore || []) {\r\n const normalizedFilePath: string = path.resolve(configuration.context!, filePath);\r\n this._filesToIgnore.add(normalizedFilePath);\r\n }\r\n }\r\n // END options.filesToIgnore\r\n\r\n // START options.localizedData\r\n if (this._options.localizedData) {\r\n // START options.localizedData.passthroughLocale\r\n if (this._options.localizedData.passthroughLocale) {\r\n const {\r\n usePassthroughLocale,\r\n passthroughLocaleName = 'passthrough'\r\n } = this._options.localizedData.passthroughLocale;\r\n if (usePassthroughLocale) {\r\n this._passthroughLocaleName = passthroughLocaleName;\r\n this._locales.add(passthroughLocaleName);\r\n }\r\n }\r\n // END options.localizedData.passthroughLocale\r\n\r\n // START options.localizedData.translatedStrings\r\n const { translatedStrings } = this._options.localizedData;\r\n this._resolvedTranslatedStringsFromOptions = {};\r\n if (translatedStrings) {\r\n for (const [localeName, locale] of Object.entries(translatedStrings)) {\r\n if (this._locales.has(localeName)) {\r\n errors.push(\r\n Error(\r\n `The locale \"${localeName}\" appears multiple times. ` +\r\n 'There may be multiple instances with different casing.'\r\n )\r\n );\r\n return { errors, warnings };\r\n }\r\n\r\n if (!ensureValidLocaleName(localeName)) {\r\n return { errors, warnings };\r\n }\r\n\r\n this._locales.add(localeName);\r\n this._resolvedLocalizedStrings.set(localeName, new Map<string, Map<string, string>>());\r\n this._resolvedTranslatedStringsFromOptions[localeName] = {};\r\n\r\n const locFilePathsInLocale: Set<string> = new Set<string>();\r\n\r\n for (const [locFilePath, locFileDataFromOptions] of Object.entries(locale)) {\r\n if (locale.hasOwnProperty(locFilePath)) {\r\n const normalizedLocFilePath: string = path.resolve(configuration.context!, locFilePath);\r\n\r\n if (locFilePathsInLocale.has(normalizedLocFilePath)) {\r\n errors.push(\r\n new Error(\r\n `The localization file path \"${locFilePath}\" appears multiple times in locale ${localeName}. ` +\r\n 'There may be multiple instances with different casing.'\r\n )\r\n );\r\n return { errors, warnings };\r\n }\r\n\r\n locFilePathsInLocale.add(normalizedLocFilePath);\r\n\r\n const normalizedLocFileDataFromOptions: string | ILocaleFileData =\r\n typeof locFileDataFromOptions === 'string'\r\n ? path.resolve(configuration.context!, locFileDataFromOptions)\r\n : locFileDataFromOptions;\r\n\r\n this._resolvedTranslatedStringsFromOptions[localeName][\r\n normalizedLocFilePath\r\n ] = normalizedLocFileDataFromOptions;\r\n }\r\n }\r\n }\r\n }\r\n // END options.localizedData.translatedStrings\r\n\r\n // START options.localizedData.defaultLocale\r\n if (this._options.localizedData.defaultLocale) {\r\n const { localeName, fillMissingTranslationStrings } = this._options.localizedData.defaultLocale;\r\n if (this._options.localizedData.defaultLocale.localeName) {\r\n if (this._locales.has(localeName)) {\r\n errors.push(new Error('The default locale is also specified in the translated strings.'));\r\n return { errors, warnings };\r\n } else if (!ensureValidLocaleName(localeName)) {\r\n return { errors, warnings };\r\n }\r\n\r\n this._locales.add(localeName);\r\n this._resolvedLocalizedStrings.set(localeName, new Map<string, Map<string, string>>());\r\n this._defaultLocale = localeName;\r\n this._fillMissingTranslationStrings = !!fillMissingTranslationStrings;\r\n } else {\r\n errors.push(new Error('Missing default locale name'));\r\n return { errors, warnings };\r\n }\r\n } else {\r\n errors.push(new Error('Missing default locale options.'));\r\n return { errors, warnings };\r\n }\r\n // END options.localizedData.defaultLocale\r\n\r\n // START options.localizedData.pseudoLocales\r\n if (this._options.localizedData.pseudolocales) {\r\n for (const [pseudolocaleName, pseudoLocaleOpts] of Object.entries(\r\n this._options.localizedData.pseudolocales\r\n )) {\r\n if (this._defaultLocale === pseudolocaleName) {\r\n errors.push(\r\n new Error(`A pseudolocale (${pseudolocaleName}) name is also the default locale name.`)\r\n );\r\n return { errors, warnings };\r\n }\r\n\r\n if (this._locales.has(pseudolocaleName)) {\r\n errors.push(\r\n new Error(\r\n `A pseudolocale (${pseudolocaleName}) name is also specified in the translated strings.`\r\n )\r\n );\r\n return { errors, warnings };\r\n }\r\n\r\n this._pseudolocalizers.set(\r\n pseudolocaleName,\r\n Pseudolocalization.getPseudolocalizer(pseudoLocaleOpts)\r\n );\r\n this._locales.add(pseudolocaleName);\r\n this._resolvedLocalizedStrings.set(pseudolocaleName, new Map<string, Map<string, string>>());\r\n }\r\n }\r\n // END options.localizedData.pseudoLocales\r\n\r\n // START options.localizedData.normalizeResxNewlines\r\n if (this._options.localizedData.normalizeResxNewlines) {\r\n switch (this._options.localizedData.normalizeResxNewlines) {\r\n case 'crlf': {\r\n this._resxNewlineNormalization = NewlineKind.CrLf;\r\n break;\r\n }\r\n\r\n case 'lf': {\r\n this._resxNewlineNormalization = NewlineKind.Lf;\r\n break;\r\n }\r\n\r\n default: {\r\n errors.push(\r\n new Error(\r\n `Unexpected value \"${this._options.localizedData.normalizeResxNewlines}\" for option ` +\r\n '\"localizedData.normalizeResxNewlines\"'\r\n )\r\n );\r\n break;\r\n }\r\n }\r\n }\r\n // END options.localizedData.normalizeResxNewlines\r\n } else if (!isWebpackDevServer) {\r\n throw new Error('Localized data must be provided unless webpack dev server is running.');\r\n }\r\n // END options.localizedData\r\n\r\n // START options.noStringsLocaleName\r\n if (\r\n this._options.noStringsLocaleName === undefined ||\r\n this._options.noStringsLocaleName === null ||\r\n !ensureValidLocaleName(this._options.noStringsLocaleName)\r\n ) {\r\n this._noStringsLocaleName = 'none';\r\n } else {\r\n this._noStringsLocaleName = this._options.noStringsLocaleName;\r\n }\r\n // END options.noStringsLocaleName\r\n\r\n return { errors, warnings };\r\n }\r\n\r\n private _getPlaceholderString(): IStringPlaceholder {\r\n const suffix: string = (this._stringPlaceholderCounter++).toString();\r\n return {\r\n value: `${Constants.STRING_PLACEHOLDER_PREFIX}_\\\\_${Constants.STRING_PLACEHOLDER_LABEL}_${suffix}`,\r\n suffix: suffix\r\n };\r\n }\r\n\r\n private _chunkHasLocalizedModules(chunk: Webpack.compilation.Chunk): boolean {\r\n let chunkHasAnyLocModules: boolean | undefined = EntityMarker.getMark(chunk);\r\n if (chunkHasAnyLocModules === undefined) {\r\n chunkHasAnyLocModules = false;\r\n for (const module of chunk.getModules()) {\r\n if (EntityMarker.getMark(module)) {\r\n chunkHasAnyLocModules = true;\r\n break;\r\n }\r\n }\r\n\r\n // If this chunk doesn't directly contain any localized resources, it still\r\n // needs to be localized if it's an entrypoint chunk (i.e. - it has a runtime)\r\n // and it loads localized async chunks.\r\n // In that case, the generated chunk URL generation code needs to contain\r\n // the locale name.\r\n if (!chunkHasAnyLocModules && chunk.hasRuntime()) {\r\n for (const asyncChunk of chunk.getAllAsyncChunks()) {\r\n if (this._chunkHasLocalizedModules(asyncChunk)) {\r\n chunkHasAnyLocModules = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n EntityMarker.markEntity(chunk, chunkHasAnyLocModules);\r\n }\r\n\r\n return chunkHasAnyLocModules;\r\n }\r\n\r\n private _convertLocalizationFileToLocData(locFile: ILocalizationFile): ILocaleFileData {\r\n const locFileData: ILocaleFileData = {};\r\n for (const [stringName, locFileEntry] of Object.entries(locFile)) {\r\n locFileData[stringName] = locFileEntry.value;\r\n }\r\n\r\n return locFileData;\r\n }\r\n}\r\n"]}
{"version":3,"file":"LocalizationPlugin.js","sourceRoot":"","sources":["../src/LocalizationPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport { JsonFile, FileSystem, Terminal, NewlineKind } from '@rushstack/node-core-library';\r\nimport * as Webpack from 'webpack';\r\nimport * as path from 'path';\r\nimport * as Tapable from 'tapable';\r\n\r\nimport { Constants } from './utilities/Constants';\r\nimport {\r\n IWebpackConfigurationUpdaterOptions,\r\n WebpackConfigurationUpdater\r\n} from './WebpackConfigurationUpdater';\r\nimport {\r\n ILocalizationPluginOptions,\r\n ILocalizationStats,\r\n ILocaleFileData,\r\n ILocalizationFile,\r\n ILocaleElementMap,\r\n ILocalizedStrings,\r\n IResolvedMissingTranslations\r\n} from './interfaces';\r\nimport { ILocalizedWebpackChunk } from './webpackInterfaces';\r\nimport { LocFileTypingsGenerator } from './LocFileTypingsGenerator';\r\nimport { Pseudolocalization } from './Pseudolocalization';\r\nimport { EntityMarker } from './utilities/EntityMarker';\r\nimport { IAsset, IProcessAssetResult, AssetProcessor, PLACEHOLDER_REGEX } from './AssetProcessor';\r\nimport { LocFileParser } from './utilities/LocFileParser';\r\n\r\n/**\r\n * @internal\r\n */\r\nexport interface IStringPlaceholder {\r\n value: string;\r\n suffix: string;\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nexport interface IAddDefaultLocFileResult {\r\n /**\r\n * A list of paths to translation files that were loaded\r\n */\r\n additionalLoadedFilePaths: string[];\r\n\r\n errors: Error[];\r\n}\r\n\r\ninterface IExtendedMainTemplate {\r\n hooks: {\r\n assetPath: Tapable.SyncHook<string, IAssetPathOptions>;\r\n };\r\n}\r\n\r\ninterface IExtendedConfiguration extends Webpack.compilation.Compilation {\r\n options: Webpack.Configuration;\r\n}\r\n\r\ninterface IExtendedChunkGroup extends Webpack.compilation.ChunkGroup {\r\n getChildren(): Webpack.compilation.Chunk[];\r\n}\r\n\r\ninterface IExtendedChunk extends Webpack.compilation.Chunk {\r\n filenameTemplate: string;\r\n}\r\n\r\ninterface IAssetPathOptions {\r\n chunk: Webpack.compilation.Chunk;\r\n contentHashType: string;\r\n filename: string;\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nexport interface IStringSerialNumberData {\r\n values: ILocaleElementMap;\r\n locFilePath: string;\r\n stringName: string;\r\n}\r\n\r\nconst PLUGIN_NAME: string = 'localization';\r\n\r\n/**\r\n * This plugin facilitates localization in webpack.\r\n *\r\n * @public\r\n */\r\nexport class LocalizationPlugin implements Webpack.Plugin {\r\n /**\r\n * @internal\r\n */\r\n public stringKeys: Map<string, IStringPlaceholder> = new Map<string, IStringPlaceholder>();\r\n\r\n private _options: ILocalizationPluginOptions;\r\n private _resolvedTranslatedStringsFromOptions!: ILocalizedStrings;\r\n private _filesToIgnore: Set<string> = new Set<string>();\r\n private _stringPlaceholderCounter: number = 0;\r\n private _stringPlaceholderMap: Map<string, IStringSerialNumberData> = new Map<\r\n string,\r\n IStringSerialNumberData\r\n >();\r\n private _locales: Set<string> = new Set<string>();\r\n private _passthroughLocaleName!: string;\r\n private _defaultLocale!: string;\r\n private _noStringsLocaleName!: string;\r\n private _fillMissingTranslationStrings!: boolean;\r\n private _pseudolocalizers: Map<string, (str: string) => string> = new Map<\r\n string,\r\n (str: string) => string\r\n >();\r\n private _resxNewlineNormalization: NewlineKind | undefined;\r\n\r\n /**\r\n * The outermost map's keys are the locale names.\r\n * The middle map's keys are the resolved, file names.\r\n * The innermost map's keys are the string identifiers and its values are the string values.\r\n */\r\n private _resolvedLocalizedStrings: Map<string, Map<string, Map<string, string>>> = new Map<\r\n string,\r\n Map<string, Map<string, string>>\r\n >();\r\n\r\n public constructor(options: ILocalizationPluginOptions) {\r\n this._options = options;\r\n }\r\n\r\n public apply(compiler: Webpack.Compiler): void {\r\n const isWebpack4: boolean = !!compiler.hooks;\r\n\r\n if (!isWebpack4) {\r\n throw new Error(`The ${LocalizationPlugin.name} plugin requires Webpack 4`);\r\n }\r\n\r\n if (this._options.typingsOptions && compiler.context) {\r\n if (\r\n this._options.typingsOptions.generatedTsFolder &&\r\n !path.isAbsolute(this._options.typingsOptions.generatedTsFolder)\r\n ) {\r\n this._options.typingsOptions.generatedTsFolder = path.resolve(\r\n compiler.context,\r\n this._options.typingsOptions.generatedTsFolder\r\n );\r\n }\r\n\r\n if (\r\n this._options.typingsOptions.sourceRoot &&\r\n !path.isAbsolute(this._options.typingsOptions.sourceRoot)\r\n ) {\r\n this._options.typingsOptions.sourceRoot = path.resolve(\r\n compiler.context,\r\n this._options.typingsOptions.sourceRoot\r\n );\r\n }\r\n }\r\n\r\n // https://github.com/webpack/webpack-dev-server/pull/1929/files#diff-15fb51940da53816af13330d8ce69b4eR66\r\n const isWebpackDevServer: boolean = process.env.WEBPACK_DEV_SERVER === 'true';\r\n\r\n const { errors, warnings } = this._initializeAndValidateOptions(compiler.options, isWebpackDevServer);\r\n\r\n let typingsPreprocessor: LocFileTypingsGenerator | undefined;\r\n if (this._options.typingsOptions) {\r\n typingsPreprocessor = new LocFileTypingsGenerator({\r\n srcFolder: this._options.typingsOptions.sourceRoot || compiler.context,\r\n generatedTsFolder: this._options.typingsOptions.generatedTsFolder,\r\n exportAsDefault: this._options.typingsOptions.exportAsDefault,\r\n filesToIgnore: this._options.filesToIgnore\r\n });\r\n } else {\r\n typingsPreprocessor = undefined;\r\n }\r\n\r\n const webpackConfigurationUpdaterOptions: IWebpackConfigurationUpdaterOptions = {\r\n pluginInstance: this,\r\n configuration: compiler.options,\r\n filesToIgnore: this._filesToIgnore,\r\n localeNameOrPlaceholder: Constants.LOCALE_NAME_PLACEHOLDER,\r\n resxNewlineNormalization: this._resxNewlineNormalization\r\n };\r\n\r\n if (errors.length > 0 || warnings.length > 0) {\r\n compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation: Webpack.compilation.Compilation) => {\r\n compilation.errors.push(...errors);\r\n compilation.warnings.push(...warnings);\r\n });\r\n\r\n if (errors.length > 0) {\r\n // If there are any errors, just pass through the resources in source and don't do any\r\n // additional configuration\r\n WebpackConfigurationUpdater.amendWebpackConfigurationForInPlaceLocFiles(\r\n webpackConfigurationUpdaterOptions\r\n );\r\n return;\r\n }\r\n }\r\n\r\n if (isWebpackDevServer) {\r\n if (typingsPreprocessor) {\r\n compiler.hooks.afterEnvironment.tapPromise(\r\n PLUGIN_NAME,\r\n async () => await typingsPreprocessor!.runWatcherAsync()\r\n );\r\n\r\n if (!compiler.options.plugins) {\r\n compiler.options.plugins = [];\r\n }\r\n\r\n compiler.options.plugins.push(\r\n new Webpack.WatchIgnorePlugin([this._options.typingsOptions!.generatedTsFolder])\r\n );\r\n }\r\n\r\n WebpackConfigurationUpdater.amendWebpackConfigurationForInPlaceLocFiles(\r\n webpackConfigurationUpdaterOptions\r\n );\r\n } else {\r\n if (typingsPreprocessor) {\r\n compiler.hooks.beforeRun.tapPromise(\r\n PLUGIN_NAME,\r\n async () => await typingsPreprocessor!.generateTypingsAsync()\r\n );\r\n }\r\n\r\n WebpackConfigurationUpdater.amendWebpackConfigurationForMultiLocale(webpackConfigurationUpdaterOptions);\r\n\r\n if (errors.length === 0) {\r\n compiler.hooks.thisCompilation.tap(\r\n PLUGIN_NAME,\r\n (untypedCompilation: Webpack.compilation.Compilation) => {\r\n const compilation: IExtendedConfiguration = untypedCompilation as IExtendedConfiguration;\r\n ((compilation.mainTemplate as unknown) as IExtendedMainTemplate).hooks.assetPath.tap(\r\n PLUGIN_NAME,\r\n (assetPath: string, options: IAssetPathOptions) => {\r\n if (\r\n options.contentHashType === 'javascript' &&\r\n assetPath.match(Constants.LOCALE_FILENAME_TOKEN_REGEX)\r\n ) {\r\n // Does this look like an async chunk URL generator?\r\n if (typeof options.chunk.id === 'string' && options.chunk.id.match(/^\\\" \\+/)) {\r\n return assetPath.replace(\r\n Constants.LOCALE_FILENAME_TOKEN_REGEX,\r\n `\" + ${Constants.JSONP_PLACEHOLDER} + \"`\r\n );\r\n } else {\r\n return assetPath.replace(\r\n Constants.LOCALE_FILENAME_TOKEN_REGEX,\r\n Constants.LOCALE_NAME_PLACEHOLDER\r\n );\r\n }\r\n } else if (assetPath.match(Constants.NO_LOCALE_SOURCE_MAP_FILENAME_TOKEN_REGEX)) {\r\n // Replace the placeholder with the [locale] token for sourcemaps\r\n const deLocalizedFilename: string = options.filename.replace(\r\n PLACEHOLDER_REGEX,\r\n Constants.LOCALE_FILENAME_TOKEN\r\n );\r\n return assetPath.replace(\r\n Constants.NO_LOCALE_SOURCE_MAP_FILENAME_TOKEN_REGEX,\r\n deLocalizedFilename\r\n );\r\n } else {\r\n return assetPath;\r\n }\r\n }\r\n );\r\n\r\n compilation.hooks.optimizeChunks.tap(\r\n PLUGIN_NAME,\r\n (\r\n untypedChunks: Webpack.compilation.Chunk[],\r\n untypedChunkGroups: Webpack.compilation.ChunkGroup[]\r\n ) => {\r\n const chunks: IExtendedChunk[] = untypedChunks as IExtendedChunk[];\r\n const chunkGroups: IExtendedChunkGroup[] = untypedChunkGroups as IExtendedChunkGroup[];\r\n\r\n let chunksHaveAnyChildren: boolean = false;\r\n for (const chunkGroup of chunkGroups) {\r\n const children: Webpack.compilation.Chunk[] = chunkGroup.getChildren();\r\n if (children.length > 0) {\r\n chunksHaveAnyChildren = true;\r\n break;\r\n }\r\n }\r\n\r\n if (\r\n chunksHaveAnyChildren &&\r\n (!compilation.options.output ||\r\n !compilation.options.output.chunkFilename ||\r\n compilation.options.output.chunkFilename.indexOf(Constants.LOCALE_FILENAME_TOKEN) === -1)\r\n ) {\r\n compilation.errors.push(\r\n new Error(\r\n 'The configuration.output.chunkFilename property must be provided and must include ' +\r\n `the ${Constants.LOCALE_FILENAME_TOKEN} placeholder`\r\n )\r\n );\r\n\r\n return;\r\n }\r\n\r\n for (const chunk of chunks) {\r\n // See if the chunk contains any localized modules or loads any localized chunks\r\n const localizedChunk: boolean = this._chunkHasLocalizedModules(chunk);\r\n\r\n // Change the chunk's name to include either the locale name or the locale name for chunks without strings\r\n const replacementValue: string = localizedChunk\r\n ? Constants.LOCALE_NAME_PLACEHOLDER\r\n : this._noStringsLocaleName;\r\n if (chunk.hasRuntime()) {\r\n chunk.filenameTemplate = (compilation.options.output!.filename as string).replace(\r\n Constants.LOCALE_FILENAME_TOKEN_REGEX,\r\n replacementValue\r\n );\r\n } else {\r\n chunk.filenameTemplate = compilation.options.output!.chunkFilename!.replace(\r\n Constants.LOCALE_FILENAME_TOKEN_REGEX,\r\n replacementValue\r\n );\r\n }\r\n }\r\n }\r\n );\r\n }\r\n );\r\n\r\n compiler.hooks.emit.tap(PLUGIN_NAME, (compilation: Webpack.compilation.Compilation) => {\r\n const localizationStats: ILocalizationStats = {\r\n entrypoints: {},\r\n namedChunkGroups: {}\r\n };\r\n\r\n const alreadyProcessedAssets: Set<string> = new Set<string>();\r\n const hotUpdateRegex: RegExp = /\\.hot-update\\.js$/;\r\n\r\n for (const untypedChunk of compilation.chunks) {\r\n const chunk: ILocalizedWebpackChunk = untypedChunk;\r\n const chunkFilesSet: Set<string> = new Set(chunk.files);\r\n function processChunkJsFile(callback: (chunkFilename: string) => void): void {\r\n let alreadyProcessedAFileInThisChunk: boolean = false;\r\n for (const chunkFilename of chunk.files) {\r\n if (\r\n chunkFilename.endsWith('.js') && // Ensure this is a JS file\r\n !hotUpdateRegex.test(chunkFilename) && // Ensure this is not a webpack hot update\r\n !alreadyProcessedAssets.has(chunkFilename) // Ensure this isn't a vendor chunk we've already processed\r\n ) {\r\n if (alreadyProcessedAFileInThisChunk) {\r\n throw new Error(\r\n `Found more than one JS file in chunk \"${chunk.name}\". This is not expected.`\r\n );\r\n }\r\n\r\n alreadyProcessedAFileInThisChunk = true;\r\n alreadyProcessedAssets.add(chunkFilename);\r\n callback(chunkFilename);\r\n }\r\n }\r\n }\r\n\r\n if (this._chunkHasLocalizedModules(chunk)) {\r\n processChunkJsFile((chunkFilename) => {\r\n if (chunkFilename.indexOf(Constants.LOCALE_NAME_PLACEHOLDER) === -1) {\r\n throw new Error(\r\n `Asset ${chunkFilename} is expected to be localized, but is missing a locale placeholder`\r\n );\r\n }\r\n\r\n const asset: IAsset = compilation.assets[chunkFilename];\r\n\r\n const resultingAssets: Map<\r\n string,\r\n IProcessAssetResult\r\n > = AssetProcessor.processLocalizedAsset({\r\n plugin: this,\r\n compilation,\r\n assetName: chunkFilename,\r\n asset,\r\n chunk,\r\n chunkHasLocalizedModules: this._chunkHasLocalizedModules.bind(this),\r\n locales: this._locales,\r\n noStringsLocaleName: this._noStringsLocaleName,\r\n fillMissingTranslationStrings: this._fillMissingTranslationStrings,\r\n defaultLocale: this._defaultLocale\r\n });\r\n\r\n // Delete the existing asset because it's been renamed\r\n delete compilation.assets[chunkFilename];\r\n chunkFilesSet.delete(chunkFilename);\r\n\r\n const localizedChunkAssets: ILocaleElementMap = {};\r\n for (const [locale, newAsset] of resultingAssets) {\r\n compilation.assets[newAsset.filename] = newAsset.asset;\r\n localizedChunkAssets[locale] = newAsset.filename;\r\n chunkFilesSet.add(newAsset.filename);\r\n }\r\n\r\n if (chunk.hasRuntime()) {\r\n // This is an entrypoint\r\n localizationStats.entrypoints[chunk.name] = {\r\n localizedAssets: localizedChunkAssets\r\n };\r\n } else {\r\n // This is a secondary chunk\r\n if (chunk.name) {\r\n localizationStats.namedChunkGroups[chunk.name] = {\r\n localizedAssets: localizedChunkAssets\r\n };\r\n }\r\n }\r\n\r\n chunk.localizedFiles = localizedChunkAssets;\r\n });\r\n } else {\r\n processChunkJsFile((chunkFilename) => {\r\n const asset: IAsset = compilation.assets[chunkFilename];\r\n\r\n const resultingAsset: IProcessAssetResult = AssetProcessor.processNonLocalizedAsset({\r\n plugin: this,\r\n compilation,\r\n assetName: chunkFilename,\r\n asset,\r\n chunk,\r\n noStringsLocaleName: this._noStringsLocaleName,\r\n chunkHasLocalizedModules: this._chunkHasLocalizedModules.bind(this)\r\n });\r\n\r\n // Delete the existing asset because it's been renamed\r\n delete compilation.assets[chunkFilename];\r\n chunkFilesSet.delete(chunkFilename);\r\n\r\n compilation.assets[resultingAsset.filename] = resultingAsset.asset;\r\n chunkFilesSet.add(resultingAsset.filename);\r\n });\r\n }\r\n\r\n chunk.files = Array.from(chunkFilesSet);\r\n }\r\n\r\n if (this._options.localizationStats) {\r\n if (this._options.localizationStats.dropPath) {\r\n const resolvedLocalizationStatsDropPath: string = path.resolve(\r\n compiler.outputPath,\r\n this._options.localizationStats.dropPath\r\n );\r\n JsonFile.save(localizationStats, resolvedLocalizationStatsDropPath, {\r\n ensureFolderExists: true\r\n });\r\n }\r\n\r\n if (this._options.localizationStats.callback) {\r\n try {\r\n this._options.localizationStats.callback(localizationStats);\r\n } catch (e) {\r\n /* swallow errors from the callback */\r\n }\r\n }\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n *\r\n * @returns\r\n */\r\n public addDefaultLocFile(\r\n terminal: Terminal,\r\n localizedResourcePath: string,\r\n localizedResourceData: ILocalizationFile\r\n ): IAddDefaultLocFileResult {\r\n const additionalLoadedFilePaths: string[] = [];\r\n const errors: Error[] = [];\r\n\r\n const locFileData: ILocaleFileData = this._convertLocalizationFileToLocData(localizedResourceData);\r\n this._addLocFile(this._defaultLocale, localizedResourcePath, locFileData);\r\n\r\n const normalizeLocalizedData: (localizedData: ILocaleFileData | string) => ILocaleFileData = (\r\n localizedData\r\n ) => {\r\n if (typeof localizedData === 'string') {\r\n additionalLoadedFilePaths.push(localizedData);\r\n const localizationFile: ILocalizationFile = LocFileParser.parseLocFile({\r\n filePath: localizedData,\r\n content: FileSystem.readFile(localizedData),\r\n terminal: terminal,\r\n resxNewlineNormalization: this._resxNewlineNormalization\r\n });\r\n\r\n return this._convertLocalizationFileToLocData(localizationFile);\r\n } else {\r\n return localizedData;\r\n }\r\n };\r\n\r\n const missingLocales: string[] = [];\r\n for (const [translatedLocaleName, translatedStrings] of Object.entries(\r\n this._resolvedTranslatedStringsFromOptions\r\n )) {\r\n const translatedLocFileFromOptions: ILocaleFileData | string | undefined =\r\n translatedStrings[localizedResourcePath];\r\n if (!translatedLocFileFromOptions) {\r\n missingLocales.push(translatedLocaleName);\r\n } else {\r\n const translatedLocFileData: ILocaleFileData = normalizeLocalizedData(translatedLocFileFromOptions);\r\n this._addLocFile(translatedLocaleName, localizedResourcePath, translatedLocFileData);\r\n }\r\n }\r\n\r\n if (missingLocales.length > 0 && this._options.localizedData.resolveMissingTranslatedStrings) {\r\n let resolvedTranslatedData: IResolvedMissingTranslations | undefined = undefined;\r\n try {\r\n resolvedTranslatedData = this._options.localizedData.resolveMissingTranslatedStrings(\r\n missingLocales,\r\n localizedResourcePath\r\n );\r\n } catch (e) {\r\n errors.push(e);\r\n }\r\n\r\n if (resolvedTranslatedData) {\r\n for (const [resolvedLocaleName, resolvedLocaleData] of Object.entries(resolvedTranslatedData)) {\r\n if (resolvedLocaleData) {\r\n const translatedLocFileData: ILocaleFileData = normalizeLocalizedData(resolvedLocaleData);\r\n this._addLocFile(resolvedLocaleName, localizedResourcePath, translatedLocFileData);\r\n }\r\n }\r\n }\r\n }\r\n\r\n this._pseudolocalizers.forEach((pseudolocalizer: (str: string) => string, pseudolocaleName: string) => {\r\n const pseudolocFileData: ILocaleFileData = {};\r\n\r\n for (const [stringName, stringValue] of Object.entries(locFileData)) {\r\n pseudolocFileData[stringName] = pseudolocalizer(stringValue);\r\n }\r\n\r\n this._addLocFile(pseudolocaleName, localizedResourcePath, pseudolocFileData);\r\n });\r\n\r\n return { additionalLoadedFilePaths, errors };\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public getDataForSerialNumber(serialNumber: string): IStringSerialNumberData | undefined {\r\n return this._stringPlaceholderMap.get(serialNumber);\r\n }\r\n\r\n private _addLocFile(\r\n localeName: string,\r\n localizedFilePath: string,\r\n localizedFileData: ILocaleFileData\r\n ): void {\r\n const filesMap: Map<string, Map<string, string>> = this._resolvedLocalizedStrings.get(localeName)!;\r\n\r\n const stringsMap: Map<string, string> = new Map<string, string>();\r\n filesMap.set(localizedFilePath, stringsMap);\r\n\r\n for (const [stringName, stringValue] of Object.entries(localizedFileData)) {\r\n const stringKey: string = `${localizedFilePath}?${stringName}`;\r\n if (!this.stringKeys.has(stringKey)) {\r\n const placeholder: IStringPlaceholder = this._getPlaceholderString();\r\n this.stringKeys.set(stringKey, placeholder);\r\n }\r\n\r\n const placeholder: IStringPlaceholder = this.stringKeys.get(stringKey)!;\r\n if (!this._stringPlaceholderMap.has(placeholder.suffix)) {\r\n this._stringPlaceholderMap.set(placeholder.suffix, {\r\n values: {\r\n [this._passthroughLocaleName]: stringName\r\n },\r\n locFilePath: localizedFilePath,\r\n stringName: stringName\r\n });\r\n }\r\n\r\n this._stringPlaceholderMap.get(placeholder.suffix)!.values[localeName] = stringValue;\r\n\r\n stringsMap.set(stringName, stringValue);\r\n }\r\n }\r\n\r\n private _initializeAndValidateOptions(\r\n configuration: Webpack.Configuration,\r\n isWebpackDevServer: boolean\r\n ): { errors: Error[]; warnings: Error[] } {\r\n const errors: Error[] = [];\r\n const warnings: Error[] = [];\r\n\r\n function ensureValidLocaleName(localeName: string): boolean {\r\n const LOCALE_NAME_REGEX: RegExp = /[a-z-]/i;\r\n if (!localeName.match(LOCALE_NAME_REGEX)) {\r\n errors.push(\r\n new Error(`Invalid locale name: ${localeName}. Locale names may only contain letters and hyphens.`)\r\n );\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n }\r\n\r\n // START configuration\r\n if (\r\n !configuration.output ||\r\n !configuration.output.filename ||\r\n typeof configuration.output.filename !== 'string' ||\r\n configuration.output.filename.indexOf(Constants.LOCALE_FILENAME_TOKEN) === -1\r\n ) {\r\n errors.push(\r\n new Error(\r\n 'The configuration.output.filename property must be provided, must be a string, and must include ' +\r\n `the ${Constants.LOCALE_FILENAME_TOKEN} placeholder`\r\n )\r\n );\r\n }\r\n // END configuration\r\n\r\n // START options.filesToIgnore\r\n // eslint-disable-next-line no-lone-blocks\r\n {\r\n for (const filePath of this._options.filesToIgnore || []) {\r\n const normalizedFilePath: string = path.resolve(configuration.context!, filePath);\r\n this._filesToIgnore.add(normalizedFilePath);\r\n }\r\n }\r\n // END options.filesToIgnore\r\n\r\n // START options.localizedData\r\n if (this._options.localizedData) {\r\n // START options.localizedData.passthroughLocale\r\n if (this._options.localizedData.passthroughLocale) {\r\n const {\r\n usePassthroughLocale,\r\n passthroughLocaleName = 'passthrough'\r\n } = this._options.localizedData.passthroughLocale;\r\n if (usePassthroughLocale) {\r\n this._passthroughLocaleName = passthroughLocaleName;\r\n this._locales.add(passthroughLocaleName);\r\n }\r\n }\r\n // END options.localizedData.passthroughLocale\r\n\r\n // START options.localizedData.translatedStrings\r\n const { translatedStrings } = this._options.localizedData;\r\n this._resolvedTranslatedStringsFromOptions = {};\r\n if (translatedStrings) {\r\n for (const [localeName, locale] of Object.entries(translatedStrings)) {\r\n if (this._locales.has(localeName)) {\r\n errors.push(\r\n Error(\r\n `The locale \"${localeName}\" appears multiple times. ` +\r\n 'There may be multiple instances with different casing.'\r\n )\r\n );\r\n return { errors, warnings };\r\n }\r\n\r\n if (!ensureValidLocaleName(localeName)) {\r\n return { errors, warnings };\r\n }\r\n\r\n this._locales.add(localeName);\r\n this._resolvedLocalizedStrings.set(localeName, new Map<string, Map<string, string>>());\r\n this._resolvedTranslatedStringsFromOptions[localeName] = {};\r\n\r\n const locFilePathsInLocale: Set<string> = new Set<string>();\r\n\r\n for (const [locFilePath, locFileDataFromOptions] of Object.entries(locale)) {\r\n if (locale.hasOwnProperty(locFilePath)) {\r\n const normalizedLocFilePath: string = path.resolve(configuration.context!, locFilePath);\r\n\r\n if (locFilePathsInLocale.has(normalizedLocFilePath)) {\r\n errors.push(\r\n new Error(\r\n `The localization file path \"${locFilePath}\" appears multiple times in locale ${localeName}. ` +\r\n 'There may be multiple instances with different casing.'\r\n )\r\n );\r\n return { errors, warnings };\r\n }\r\n\r\n locFilePathsInLocale.add(normalizedLocFilePath);\r\n\r\n const normalizedLocFileDataFromOptions: string | ILocaleFileData =\r\n typeof locFileDataFromOptions === 'string'\r\n ? path.resolve(configuration.context!, locFileDataFromOptions)\r\n : locFileDataFromOptions;\r\n\r\n this._resolvedTranslatedStringsFromOptions[localeName][\r\n normalizedLocFilePath\r\n ] = normalizedLocFileDataFromOptions;\r\n }\r\n }\r\n }\r\n }\r\n // END options.localizedData.translatedStrings\r\n\r\n // START options.localizedData.defaultLocale\r\n if (this._options.localizedData.defaultLocale) {\r\n const { localeName, fillMissingTranslationStrings } = this._options.localizedData.defaultLocale;\r\n if (this._options.localizedData.defaultLocale.localeName) {\r\n if (this._locales.has(localeName)) {\r\n errors.push(new Error('The default locale is also specified in the translated strings.'));\r\n return { errors, warnings };\r\n } else if (!ensureValidLocaleName(localeName)) {\r\n return { errors, warnings };\r\n }\r\n\r\n this._locales.add(localeName);\r\n this._resolvedLocalizedStrings.set(localeName, new Map<string, Map<string, string>>());\r\n this._defaultLocale = localeName;\r\n this._fillMissingTranslationStrings = !!fillMissingTranslationStrings;\r\n } else {\r\n errors.push(new Error('Missing default locale name'));\r\n return { errors, warnings };\r\n }\r\n } else {\r\n errors.push(new Error('Missing default locale options.'));\r\n return { errors, warnings };\r\n }\r\n // END options.localizedData.defaultLocale\r\n\r\n // START options.localizedData.pseudoLocales\r\n if (this._options.localizedData.pseudolocales) {\r\n for (const [pseudolocaleName, pseudoLocaleOpts] of Object.entries(\r\n this._options.localizedData.pseudolocales\r\n )) {\r\n if (this._defaultLocale === pseudolocaleName) {\r\n errors.push(\r\n new Error(`A pseudolocale (${pseudolocaleName}) name is also the default locale name.`)\r\n );\r\n return { errors, warnings };\r\n }\r\n\r\n if (this._locales.has(pseudolocaleName)) {\r\n errors.push(\r\n new Error(\r\n `A pseudolocale (${pseudolocaleName}) name is also specified in the translated strings.`\r\n )\r\n );\r\n return { errors, warnings };\r\n }\r\n\r\n this._pseudolocalizers.set(\r\n pseudolocaleName,\r\n Pseudolocalization.getPseudolocalizer(pseudoLocaleOpts)\r\n );\r\n this._locales.add(pseudolocaleName);\r\n this._resolvedLocalizedStrings.set(pseudolocaleName, new Map<string, Map<string, string>>());\r\n }\r\n }\r\n // END options.localizedData.pseudoLocales\r\n\r\n // START options.localizedData.normalizeResxNewlines\r\n if (this._options.localizedData.normalizeResxNewlines) {\r\n switch (this._options.localizedData.normalizeResxNewlines) {\r\n case 'crlf': {\r\n this._resxNewlineNormalization = NewlineKind.CrLf;\r\n break;\r\n }\r\n\r\n case 'lf': {\r\n this._resxNewlineNormalization = NewlineKind.Lf;\r\n break;\r\n }\r\n\r\n default: {\r\n errors.push(\r\n new Error(\r\n `Unexpected value \"${this._options.localizedData.normalizeResxNewlines}\" for option ` +\r\n '\"localizedData.normalizeResxNewlines\"'\r\n )\r\n );\r\n break;\r\n }\r\n }\r\n }\r\n // END options.localizedData.normalizeResxNewlines\r\n } else if (!isWebpackDevServer) {\r\n throw new Error('Localized data must be provided unless webpack dev server is running.');\r\n }\r\n // END options.localizedData\r\n\r\n // START options.noStringsLocaleName\r\n if (\r\n this._options.noStringsLocaleName === undefined ||\r\n this._options.noStringsLocaleName === null ||\r\n !ensureValidLocaleName(this._options.noStringsLocaleName)\r\n ) {\r\n this._noStringsLocaleName = 'none';\r\n } else {\r\n this._noStringsLocaleName = this._options.noStringsLocaleName;\r\n }\r\n // END options.noStringsLocaleName\r\n\r\n return { errors, warnings };\r\n }\r\n\r\n private _getPlaceholderString(): IStringPlaceholder {\r\n const suffix: string = (this._stringPlaceholderCounter++).toString();\r\n return {\r\n value: `${Constants.STRING_PLACEHOLDER_PREFIX}_\\\\_${Constants.STRING_PLACEHOLDER_LABEL}_${suffix}`,\r\n suffix: suffix\r\n };\r\n }\r\n\r\n private _chunkHasLocalizedModules(chunk: Webpack.compilation.Chunk): boolean {\r\n let chunkHasAnyLocModules: boolean | undefined = EntityMarker.getMark(chunk);\r\n if (chunkHasAnyLocModules === undefined) {\r\n chunkHasAnyLocModules = false;\r\n for (const module of chunk.getModules()) {\r\n if (EntityMarker.getMark(module)) {\r\n chunkHasAnyLocModules = true;\r\n break;\r\n }\r\n }\r\n\r\n // If this chunk doesn't directly contain any localized resources, it still\r\n // needs to be localized if it's an entrypoint chunk (i.e. - it has a runtime)\r\n // and it loads localized async chunks.\r\n // In that case, the generated chunk URL generation code needs to contain\r\n // the locale name.\r\n if (!chunkHasAnyLocModules && chunk.hasRuntime()) {\r\n for (const asyncChunk of chunk.getAllAsyncChunks()) {\r\n if (this._chunkHasLocalizedModules(asyncChunk)) {\r\n chunkHasAnyLocModules = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n EntityMarker.markEntity(chunk, chunkHasAnyLocModules);\r\n }\r\n\r\n return chunkHasAnyLocModules;\r\n }\r\n\r\n private _convertLocalizationFileToLocData(locFile: ILocalizationFile): ILocaleFileData {\r\n const locFileData: ILocaleFileData = {};\r\n for (const [stringName, locFileEntry] of Object.entries(locFile)) {\r\n locFileData[stringName] = locFileEntry.value;\r\n }\r\n\r\n return locFileData;\r\n }\r\n}\r\n"]}

@@ -5,2 +5,3 @@ "use strict";

Object.defineProperty(exports, "__esModule", { value: true });
exports.LocFileTypingsGenerator = void 0;
const typings_generator_1 = require("@rushstack/typings-generator");

@@ -15,3 +16,3 @@ const LocFileParser_1 = require("./utilities/LocFileParser");

constructor(options) {
super(Object.assign({}, options, { fileExtensions: ['resx', 'loc.json'], parseAndGenerateTypings: (fileContents, filePath) => {
super(Object.assign(Object.assign({}, options), { fileExtensions: ['resx', 'loc.json'], parseAndGenerateTypings: (fileContents, filePath) => {
const locFileData = LocFileParser_1.LocFileParser.parseLocFile({

@@ -18,0 +19,0 @@ filePath: filePath,

@@ -1,1 +0,1 @@

{"version":3,"file":"LocFileTypingsGenerator.js","sourceRoot":"","sources":["../src/LocFileTypingsGenerator.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;AAE3D,oEAAgG;AAIhG,6DAA0D;AAc1D;;;;GAIG;AACH,MAAa,uBAAwB,SAAQ,gDAA4B;IACvE,YAAmB,OAAiC;QAClD,KAAK,mBACA,OAAO,IACV,cAAc,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,EACpC,uBAAuB,EAAE,CAAC,YAAoB,EAAE,QAAgB,EAAE,EAAE;gBAClE,MAAM,WAAW,GAAsB,6BAAa,CAAC,YAAY,CAAC;oBAChE,QAAQ,EAAE,QAAQ;oBAClB,OAAO,EAAE,YAAY;oBACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAS;oBACjC,wBAAwB,EAAE,OAAO,CAAC,wBAAwB;iBAC3D,CAAC,CAAC;gBAEH,MAAM,OAAO,GAAyB,EAAE,CAAC;gBAEzC,wCAAwC;gBACxC,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE;oBACpC,OAAO,CAAC,IAAI,CAAC;wBACX,UAAU,EAAE,UAAU;wBACtB,OAAO,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC,OAAO;qBACzC,CAAC,CAAC;iBACJ;gBAED,OAAO,EAAE,OAAO,EAAE,CAAC;YACrB,CAAC,IACD,CAAC;IACL,CAAC;CACF;AA3BD,0DA2BC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport { StringValuesTypingsGenerator, IStringValueTyping } from '@rushstack/typings-generator';\r\nimport { Terminal, NewlineKind } from '@rushstack/node-core-library';\r\n\r\nimport { ILocalizationFile } from './interfaces';\r\nimport { LocFileParser } from './utilities/LocFileParser';\r\n\r\n/**\r\n * @public\r\n */\r\nexport interface ITypingsGeneratorOptions {\r\n srcFolder: string;\r\n generatedTsFolder: string;\r\n terminal?: Terminal;\r\n exportAsDefault?: boolean;\r\n filesToIgnore?: string[];\r\n resxNewlineNormalization?: NewlineKind | undefined;\r\n}\r\n\r\n/**\r\n * This is a simple tool that generates .d.ts files for .loc.json and .resx files.\r\n *\r\n * @public\r\n */\r\nexport class LocFileTypingsGenerator extends StringValuesTypingsGenerator {\r\n public constructor(options: ITypingsGeneratorOptions) {\r\n super({\r\n ...options,\r\n fileExtensions: ['resx', 'loc.json'],\r\n parseAndGenerateTypings: (fileContents: string, filePath: string) => {\r\n const locFileData: ILocalizationFile = LocFileParser.parseLocFile({\r\n filePath: filePath,\r\n content: fileContents,\r\n terminal: this._options.terminal!,\r\n resxNewlineNormalization: options.resxNewlineNormalization\r\n });\r\n\r\n const typings: IStringValueTyping[] = [];\r\n\r\n // eslint-disable-next-line guard-for-in\r\n for (const stringName in locFileData) {\r\n typings.push({\r\n exportName: stringName,\r\n comment: locFileData[stringName].comment\r\n });\r\n }\r\n\r\n return { typings };\r\n }\r\n });\r\n }\r\n}\r\n"]}
{"version":3,"file":"LocFileTypingsGenerator.js","sourceRoot":"","sources":["../src/LocFileTypingsGenerator.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAE3D,oEAAgG;AAIhG,6DAA0D;AAc1D;;;;GAIG;AACH,MAAa,uBAAwB,SAAQ,gDAA4B;IACvE,YAAmB,OAAiC;QAClD,KAAK,iCACA,OAAO,KACV,cAAc,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,EACpC,uBAAuB,EAAE,CAAC,YAAoB,EAAE,QAAgB,EAAE,EAAE;gBAClE,MAAM,WAAW,GAAsB,6BAAa,CAAC,YAAY,CAAC;oBAChE,QAAQ,EAAE,QAAQ;oBAClB,OAAO,EAAE,YAAY;oBACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAS;oBACjC,wBAAwB,EAAE,OAAO,CAAC,wBAAwB;iBAC3D,CAAC,CAAC;gBAEH,MAAM,OAAO,GAAyB,EAAE,CAAC;gBAEzC,wCAAwC;gBACxC,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE;oBACpC,OAAO,CAAC,IAAI,CAAC;wBACX,UAAU,EAAE,UAAU;wBACtB,OAAO,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC,OAAO;qBACzC,CAAC,CAAC;iBACJ;gBAED,OAAO,EAAE,OAAO,EAAE,CAAC;YACrB,CAAC,IACD,CAAC;IACL,CAAC;CACF;AA3BD,0DA2BC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport { StringValuesTypingsGenerator, IStringValueTyping } from '@rushstack/typings-generator';\r\nimport { Terminal, NewlineKind } from '@rushstack/node-core-library';\r\n\r\nimport { ILocalizationFile } from './interfaces';\r\nimport { LocFileParser } from './utilities/LocFileParser';\r\n\r\n/**\r\n * @public\r\n */\r\nexport interface ITypingsGeneratorOptions {\r\n srcFolder: string;\r\n generatedTsFolder: string;\r\n terminal?: Terminal;\r\n exportAsDefault?: boolean;\r\n filesToIgnore?: string[];\r\n resxNewlineNormalization?: NewlineKind | undefined;\r\n}\r\n\r\n/**\r\n * This is a simple tool that generates .d.ts files for .loc.json and .resx files.\r\n *\r\n * @public\r\n */\r\nexport class LocFileTypingsGenerator extends StringValuesTypingsGenerator {\r\n public constructor(options: ITypingsGeneratorOptions) {\r\n super({\r\n ...options,\r\n fileExtensions: ['resx', 'loc.json'],\r\n parseAndGenerateTypings: (fileContents: string, filePath: string) => {\r\n const locFileData: ILocalizationFile = LocFileParser.parseLocFile({\r\n filePath: filePath,\r\n content: fileContents,\r\n terminal: this._options.terminal!,\r\n resxNewlineNormalization: options.resxNewlineNormalization\r\n });\r\n\r\n const typings: IStringValueTyping[] = [];\r\n\r\n // eslint-disable-next-line guard-for-in\r\n for (const stringName in locFileData) {\r\n typings.push({\r\n exportName: stringName,\r\n comment: locFileData[stringName].comment\r\n });\r\n }\r\n\r\n return { typings };\r\n }\r\n });\r\n }\r\n}\r\n"]}
"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const decache_1 = require("decache");
exports.Pseudolocalization = void 0;
const decache_1 = __importDefault(require("decache"));
class Pseudolocalization {

@@ -11,3 +15,3 @@ static getPseudolocalizer(options) {

const pseudolocale = require('pseudolocale'); // eslint-disable-line
pseudolocale.option = Object.assign({}, pseudolocale.option, options);
pseudolocale.option = Object.assign(Object.assign({}, pseudolocale.option), options);
return pseudolocale.str;

@@ -14,0 +18,0 @@ }

@@ -1,1 +0,1 @@

{"version":3,"file":"Pseudolocalization.js","sourceRoot":"","sources":["../src/Pseudolocalization.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;AAE3D,qCAA8B;AAI9B,MAAa,kBAAkB;IACtB,MAAM,CAAC,kBAAkB,CAAC,OAA6B;QAC5D,iFAAiF;QACjF,iBAAO,CAAC,cAAc,CAAC,CAAC;QACxB,MAAM,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,sBAAsB;QAEpE,YAAY,CAAC,MAAM,qBACd,YAAY,CAAC,MAAM,EACnB,OAAO,CACX,CAAC;QACF,OAAO,YAAY,CAAC,GAAG,CAAC;IAC1B,CAAC;CACF;AAZD,gDAYC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport decache from 'decache';\r\n\r\nimport { IPseudolocaleOptions } from './interfaces';\r\n\r\nexport class Pseudolocalization {\r\n public static getPseudolocalizer(options: IPseudolocaleOptions): (str: string) => string {\r\n // pseudolocale maintains static state, so we need to load it as isolated modules\r\n decache('pseudolocale');\r\n const pseudolocale = require('pseudolocale'); // eslint-disable-line\r\n\r\n pseudolocale.option = {\r\n ...pseudolocale.option,\r\n ...options\r\n };\r\n return pseudolocale.str;\r\n }\r\n}\r\n"]}
{"version":3,"file":"Pseudolocalization.js","sourceRoot":"","sources":["../src/Pseudolocalization.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;;;;AAE3D,sDAA8B;AAI9B,MAAa,kBAAkB;IACtB,MAAM,CAAC,kBAAkB,CAAC,OAA6B;QAC5D,iFAAiF;QACjF,iBAAO,CAAC,cAAc,CAAC,CAAC;QACxB,MAAM,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,sBAAsB;QAEpE,YAAY,CAAC,MAAM,mCACd,YAAY,CAAC,MAAM,GACnB,OAAO,CACX,CAAC;QACF,OAAO,YAAY,CAAC,GAAG,CAAC;IAC1B,CAAC;CACF;AAZD,gDAYC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport decache from 'decache';\r\n\r\nimport { IPseudolocaleOptions } from './interfaces';\r\n\r\nexport class Pseudolocalization {\r\n public static getPseudolocalizer(options: IPseudolocaleOptions): (str: string) => string {\r\n // pseudolocale maintains static state, so we need to load it as isolated modules\r\n decache('pseudolocale');\r\n const pseudolocale = require('pseudolocale'); // eslint-disable-line\r\n\r\n pseudolocale.option = {\r\n ...pseudolocale.option,\r\n ...options\r\n };\r\n return pseudolocale.str;\r\n }\r\n}\r\n"]}
"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const path = require("path");
exports.Constants = void 0;
const path = __importStar(require("path"));
const node_core_library_1 = require("@rushstack/node-core-library");
const lodash = require("lodash");
const lodash = __importStar(require("lodash"));
class Constants {
}
exports.Constants = Constants;
Constants.LOC_JSON_SCHEMA = node_core_library_1.JsonSchema.fromFile(path.resolve(__dirname, '..', 'schemas', 'locJson.schema.json'));

@@ -24,3 +45,2 @@ Constants.LOCALE_FILENAME_TOKEN = '[locale]';

Constants.JSONP_PLACEHOLDER = `${Constants.STRING_PLACEHOLDER_PREFIX}__${Constants.JSONP_PLACEHOLDER_LABEL}+chunkId+_0`;
exports.Constants = Constants;
//# sourceMappingURL=Constants.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"Constants.js","sourceRoot":"","sources":["../../src/utilities/Constants.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;AAE3D,6BAA6B;AAC7B,oEAA0D;AAC1D,iCAAiC;AAEjC,MAAa,SAAS;;AACN,yBAAe,GAAe,8BAAU,CAAC,QAAQ,CAC7D,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,qBAAqB,CAAC,CAChE,CAAC;AAEY,+BAAqB,GAAW,UAAU,CAAC;AAC3C,qCAA2B,GAAW,IAAI,MAAM,CAC5D,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,qBAAqB,CAAC,EACpD,IAAI,CACL,CAAC;AACY,6CAAmC,GAAW,kBAAkB,CAAC;AACjE,mDAAyC,GAAW,IAAI,MAAM,CAC1E,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,mCAAmC,CAAC,EAClE,IAAI,CACL,CAAC;AACY,mCAAyB,GAAW,wDAAwD,CAAC;AAE7F,oBAAU,GAAW,UAAU,CAAC;AAChC,wBAAc,GAAW,eAAe,CAAC;AACzC,gCAAsB,GAAW,sBAAsB,CAAC;AAExD,kCAAwB,GAAW,GAAG,CAAC;AACvC,uCAA6B,GAAW,GAAG,CAAC;AAC5C,iCAAuB,GAAW,GAAG,CAAC;AAEtC,iCAAuB,GAAW,GAAG,SAAS,CAAC,yBAAyB,KAAK,SAAS,CAAC,6BAA6B,IAAI,CAAC;AACzH,2BAAiB,GAAW,GAAG,SAAS,CAAC,yBAAyB,KAAK,SAAS,CAAC,uBAAuB,aAAa,CAAC;AA1BtI,8BA2BC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport * as path from 'path';\r\nimport { JsonSchema } from '@rushstack/node-core-library';\r\nimport * as lodash from 'lodash';\r\n\r\nexport class Constants {\r\n public static LOC_JSON_SCHEMA: JsonSchema = JsonSchema.fromFile(\r\n path.resolve(__dirname, '..', 'schemas', 'locJson.schema.json')\r\n );\r\n\r\n public static LOCALE_FILENAME_TOKEN: string = '[locale]';\r\n public static LOCALE_FILENAME_TOKEN_REGEX: RegExp = new RegExp(\r\n lodash.escapeRegExp(Constants.LOCALE_FILENAME_TOKEN),\r\n 'gi'\r\n );\r\n public static NO_LOCALE_SOURCE_MAP_FILENAME_TOKEN: string = '[no-locale-file]';\r\n public static NO_LOCALE_SOURCE_MAP_FILENAME_TOKEN_REGEX: RegExp = new RegExp(\r\n lodash.escapeRegExp(Constants.NO_LOCALE_SOURCE_MAP_FILENAME_TOKEN),\r\n 'gi'\r\n );\r\n public static STRING_PLACEHOLDER_PREFIX: string = '_LOCALIZED_STRING_f12dy0i7_n4bo_dqwj_39gf_sasqehjmihz9';\r\n\r\n public static RESX_REGEX: RegExp = /\\.resx$/i;\r\n public static LOC_JSON_REGEX: RegExp = /\\.loc\\.json$/i;\r\n public static RESX_OR_LOC_JSON_REGEX: RegExp = /\\.(resx|loc\\.json)$/i;\r\n\r\n public static STRING_PLACEHOLDER_LABEL: string = 'A';\r\n public static LOCALE_NAME_PLACEHOLDER_LABEL: string = 'B';\r\n public static JSONP_PLACEHOLDER_LABEL: string = 'C';\r\n\r\n public static LOCALE_NAME_PLACEHOLDER: string = `${Constants.STRING_PLACEHOLDER_PREFIX}__${Constants.LOCALE_NAME_PLACEHOLDER_LABEL}_0`;\r\n public static JSONP_PLACEHOLDER: string = `${Constants.STRING_PLACEHOLDER_PREFIX}__${Constants.JSONP_PLACEHOLDER_LABEL}+chunkId+_0`;\r\n}\r\n"]}
{"version":3,"file":"Constants.js","sourceRoot":"","sources":["../../src/utilities/Constants.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;;;;;;;;;;;;;;;;;;;;AAE3D,2CAA6B;AAC7B,oEAA0D;AAC1D,+CAAiC;AAEjC,MAAa,SAAS;;AAAtB,8BA2BC;AA1Be,yBAAe,GAAe,8BAAU,CAAC,QAAQ,CAC7D,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,qBAAqB,CAAC,CAChE,CAAC;AAEY,+BAAqB,GAAW,UAAU,CAAC;AAC3C,qCAA2B,GAAW,IAAI,MAAM,CAC5D,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,qBAAqB,CAAC,EACpD,IAAI,CACL,CAAC;AACY,6CAAmC,GAAW,kBAAkB,CAAC;AACjE,mDAAyC,GAAW,IAAI,MAAM,CAC1E,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,mCAAmC,CAAC,EAClE,IAAI,CACL,CAAC;AACY,mCAAyB,GAAW,wDAAwD,CAAC;AAE7F,oBAAU,GAAW,UAAU,CAAC;AAChC,wBAAc,GAAW,eAAe,CAAC;AACzC,gCAAsB,GAAW,sBAAsB,CAAC;AAExD,kCAAwB,GAAW,GAAG,CAAC;AACvC,uCAA6B,GAAW,GAAG,CAAC;AAC5C,iCAAuB,GAAW,GAAG,CAAC;AAEtC,iCAAuB,GAAW,GAAG,SAAS,CAAC,yBAAyB,KAAK,SAAS,CAAC,6BAA6B,IAAI,CAAC;AACzH,2BAAiB,GAAW,GAAG,SAAS,CAAC,yBAAyB,KAAK,SAAS,CAAC,uBAAuB,aAAa,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport * as path from 'path';\r\nimport { JsonSchema } from '@rushstack/node-core-library';\r\nimport * as lodash from 'lodash';\r\n\r\nexport class Constants {\r\n public static LOC_JSON_SCHEMA: JsonSchema = JsonSchema.fromFile(\r\n path.resolve(__dirname, '..', 'schemas', 'locJson.schema.json')\r\n );\r\n\r\n public static LOCALE_FILENAME_TOKEN: string = '[locale]';\r\n public static LOCALE_FILENAME_TOKEN_REGEX: RegExp = new RegExp(\r\n lodash.escapeRegExp(Constants.LOCALE_FILENAME_TOKEN),\r\n 'gi'\r\n );\r\n public static NO_LOCALE_SOURCE_MAP_FILENAME_TOKEN: string = '[no-locale-file]';\r\n public static NO_LOCALE_SOURCE_MAP_FILENAME_TOKEN_REGEX: RegExp = new RegExp(\r\n lodash.escapeRegExp(Constants.NO_LOCALE_SOURCE_MAP_FILENAME_TOKEN),\r\n 'gi'\r\n );\r\n public static STRING_PLACEHOLDER_PREFIX: string = '_LOCALIZED_STRING_f12dy0i7_n4bo_dqwj_39gf_sasqehjmihz9';\r\n\r\n public static RESX_REGEX: RegExp = /\\.resx$/i;\r\n public static LOC_JSON_REGEX: RegExp = /\\.loc\\.json$/i;\r\n public static RESX_OR_LOC_JSON_REGEX: RegExp = /\\.(resx|loc\\.json)$/i;\r\n\r\n public static STRING_PLACEHOLDER_LABEL: string = 'A';\r\n public static LOCALE_NAME_PLACEHOLDER_LABEL: string = 'B';\r\n public static JSONP_PLACEHOLDER_LABEL: string = 'C';\r\n\r\n public static LOCALE_NAME_PLACEHOLDER: string = `${Constants.STRING_PLACEHOLDER_PREFIX}__${Constants.LOCALE_NAME_PLACEHOLDER_LABEL}_0`;\r\n public static JSONP_PLACEHOLDER: string = `${Constants.STRING_PLACEHOLDER_PREFIX}__${Constants.JSONP_PLACEHOLDER_LABEL}+chunkId+_0`;\r\n}\r\n"]}

@@ -0,1 +1,5 @@

declare const LABEL: unique symbol;
export interface IMarkable {
[LABEL]: boolean;
}
/**

@@ -8,2 +12,3 @@ * Use the functions on this class to mark webpack entities that contain localized resources.

}
export {};
//# sourceMappingURL=EntityMarker.d.ts.map

@@ -1,1 +0,1 @@

{"version":3,"file":"EntityMarker.d.ts","sourceRoot":"","sources":["../../src/utilities/EntityMarker.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,qBAAa,YAAY;WACT,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;WAI1D,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS;CAGrE"}
{"version":3,"file":"EntityMarker.d.ts","sourceRoot":"","sources":["../../src/utilities/EntityMarker.ts"],"names":[],"mappings":"AAGA,QAAA,MAAM,KAAK,EAAE,OAAO,MAAoC,CAAC;AAEzD,MAAM,WAAW,SAAS;IACxB,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,YAAY;WACT,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;WAI1D,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS;CAGrE"}

@@ -5,2 +5,3 @@ "use strict";

Object.defineProperty(exports, "__esModule", { value: true });
exports.EntityMarker = void 0;
const LABEL = Symbol('loc-plugin-marked');

@@ -7,0 +8,0 @@ /**

@@ -1,1 +0,1 @@

{"version":3,"file":"EntityMarker.js","sourceRoot":"","sources":["../../src/utilities/EntityMarker.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;AAE3D,MAAM,KAAK,GAAkB,MAAM,CAAC,mBAAmB,CAAC,CAAC;AAEzD;;GAEG;AACH,MAAa,YAAY;IAChB,MAAM,CAAC,UAAU,CAAU,MAAe,EAAE,KAAc;QAC/D,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;IACxB,CAAC;IAEM,MAAM,CAAC,OAAO,CAAU,MAAe;QAC5C,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;CACF;AARD,oCAQC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nconst LABEL: unique symbol = Symbol('loc-plugin-marked');\r\n\r\n/**\r\n * Use the functions on this class to mark webpack entities that contain localized resources.\r\n */\r\nexport class EntityMarker {\r\n public static markEntity<TModule>(module: TModule, value: boolean): void {\r\n module[LABEL] = value;\r\n }\r\n\r\n public static getMark<TModule>(module: TModule): boolean | undefined {\r\n return module[LABEL];\r\n }\r\n}\r\n"]}
{"version":3,"file":"EntityMarker.js","sourceRoot":"","sources":["../../src/utilities/EntityMarker.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAE3D,MAAM,KAAK,GAAkB,MAAM,CAAC,mBAAmB,CAAC,CAAC;AAMzD;;GAEG;AACH,MAAa,YAAY;IAChB,MAAM,CAAC,UAAU,CAAU,MAAe,EAAE,KAAc;QAC7D,MAAgC,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;IACpD,CAAC;IAEM,MAAM,CAAC,OAAO,CAAU,MAAe;QAC5C,OAAS,MAAgC,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC;CACF;AARD,oCAQC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nconst LABEL: unique symbol = Symbol('loc-plugin-marked');\r\n\r\nexport interface IMarkable {\r\n [LABEL]: boolean;\r\n}\r\n\r\n/**\r\n * Use the functions on this class to mark webpack entities that contain localized resources.\r\n */\r\nexport class EntityMarker {\r\n public static markEntity<TModule>(module: TModule, value: boolean): void {\r\n ((module as unknown) as IMarkable)[LABEL] = value;\r\n }\r\n\r\n public static getMark<TModule>(module: TModule): boolean | undefined {\r\n return ((module as unknown) as IMarkable)[LABEL];\r\n }\r\n}\r\n"]}

@@ -5,2 +5,3 @@ "use strict";

Object.defineProperty(exports, "__esModule", { value: true });
exports.LoaderTerminalProvider = void 0;
const node_core_library_1 = require("@rushstack/node-core-library");

@@ -7,0 +8,0 @@ class LoaderTerminalProvider {

@@ -1,1 +0,1 @@

{"version":3,"file":"LoaderTerminalProvider.js","sourceRoot":"","sources":["../../src/utilities/LoaderTerminalProvider.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;AAG3D,oEAA2F;AAE3F,MAAa,sBAAsB;IAC1B,MAAM,CAAC,4BAA4B,CAAC,aAA2C;QACpF,OAAO;YACL,aAAa,EAAE,KAAK;YACpB,YAAY,EAAE,IAAI;YAClB,KAAK,EAAE,CAAC,IAAY,EAAE,QAAkC,EAAE,EAAE;gBAC1D,QAAQ,QAAQ,EAAE;oBAChB,KAAK,4CAAwB,CAAC,KAAK,CAAC,CAAC;wBACnC,aAAa,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;wBACzC,MAAM;qBACP;oBAED,KAAK,4CAAwB,CAAC,OAAO,CAAC,CAAC;wBACrC,aAAa,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;wBAC3C,MAAM;qBACP;iBACF;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF;AApBD,wDAoBC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport * as webpack from 'webpack';\r\nimport { ITerminalProvider, TerminalProviderSeverity } from '@rushstack/node-core-library';\r\n\r\nexport class LoaderTerminalProvider {\r\n public static getTerminalProviderForLoader(loaderContext: webpack.loader.LoaderContext): ITerminalProvider {\r\n return {\r\n supportsColor: false,\r\n eolCharacter: '\\n',\r\n write: (data: string, severity: TerminalProviderSeverity) => {\r\n switch (severity) {\r\n case TerminalProviderSeverity.error: {\r\n loaderContext.emitError(new Error(data));\r\n break;\r\n }\r\n\r\n case TerminalProviderSeverity.warning: {\r\n loaderContext.emitWarning(new Error(data));\r\n break;\r\n }\r\n }\r\n }\r\n };\r\n }\r\n}\r\n"]}
{"version":3,"file":"LoaderTerminalProvider.js","sourceRoot":"","sources":["../../src/utilities/LoaderTerminalProvider.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAG3D,oEAA2F;AAE3F,MAAa,sBAAsB;IAC1B,MAAM,CAAC,4BAA4B,CAAC,aAA2C;QACpF,OAAO;YACL,aAAa,EAAE,KAAK;YACpB,YAAY,EAAE,IAAI;YAClB,KAAK,EAAE,CAAC,IAAY,EAAE,QAAkC,EAAE,EAAE;gBAC1D,QAAQ,QAAQ,EAAE;oBAChB,KAAK,4CAAwB,CAAC,KAAK,CAAC,CAAC;wBACnC,aAAa,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;wBACzC,MAAM;qBACP;oBAED,KAAK,4CAAwB,CAAC,OAAO,CAAC,CAAC;wBACrC,aAAa,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;wBAC3C,MAAM;qBACP;iBACF;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF;AApBD,wDAoBC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport * as webpack from 'webpack';\r\nimport { ITerminalProvider, TerminalProviderSeverity } from '@rushstack/node-core-library';\r\n\r\nexport class LoaderTerminalProvider {\r\n public static getTerminalProviderForLoader(loaderContext: webpack.loader.LoaderContext): ITerminalProvider {\r\n return {\r\n supportsColor: false,\r\n eolCharacter: '\\n',\r\n write: (data: string, severity: TerminalProviderSeverity) => {\r\n switch (severity) {\r\n case TerminalProviderSeverity.error: {\r\n loaderContext.emitError(new Error(data));\r\n break;\r\n }\r\n\r\n case TerminalProviderSeverity.warning: {\r\n loaderContext.emitWarning(new Error(data));\r\n break;\r\n }\r\n }\r\n }\r\n };\r\n }\r\n}\r\n"]}

@@ -5,2 +5,3 @@ "use strict";

Object.defineProperty(exports, "__esModule", { value: true });
exports.LocFileParser = void 0;
const node_core_library_1 = require("@rushstack/node-core-library");

@@ -7,0 +8,0 @@ const ResxReader_1 = require("./ResxReader");

@@ -1,1 +0,1 @@

{"version":3,"file":"LocFileParser.js","sourceRoot":"","sources":["../../src/utilities/LocFileParser.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;AAE3D,oEAA+E;AAG/E,6CAA0C;AAC1C,2CAAwC;AAiBxC,MAAM,UAAU,GAAkC,IAAI,GAAG,EAA4B,CAAC;AAEtF;;GAEG;AACH,MAAa,aAAa;IACjB,MAAM,CAAC,YAAY,CAAC,OAA6B;QACtD,MAAM,YAAY,GAAW,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,wBAAwB,IAAI,MAAM,EAAE,CAAC;QACjG,IAAI,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE;YAChC,MAAM,KAAK,GAAqB,UAAU,CAAC,GAAG,CAAC,YAAY,CAAE,CAAC;YAC9D,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,EAAE;gBACrC,OAAO,KAAK,CAAC,UAAU,CAAC;aACzB;SACF;QAED,IAAI,UAA6B,CAAC;QAClC,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;YACrC,UAAU,GAAG,uBAAU,CAAC,iBAAiB,CAAC,OAAO,CAAC,OAAO,EAAE;gBACzD,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,YAAY,EAAE,OAAO,CAAC,QAAQ;gBAC9B,oBAAoB,EAAE,OAAO,CAAC,wBAAwB;aACvD,CAAC,CAAC;SACJ;aAAM;YACL,UAAU,GAAG,4BAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACnD,IAAI;gBACF,qBAAS,CAAC,eAAe,CAAC,cAAc,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;aACxE;YAAC,OAAO,CAAC,EAAE;gBACV,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,mCAAmC,CAAC,EAAE,CAAC,CAAC;aACrE;SACF;QAED,UAAU,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QACvE,OAAO,UAAU,CAAC;IACpB,CAAC;CACF;AA7BD,sCA6BC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport { Terminal, NewlineKind, JsonFile } from '@rushstack/node-core-library';\r\n\r\nimport { ILocalizationFile } from '../interfaces';\r\nimport { ResxReader } from './ResxReader';\r\nimport { Constants } from './Constants';\r\n\r\n/**\r\n * @internal\r\n */\r\nexport interface IParseLocFileOptions {\r\n terminal: Terminal;\r\n filePath: string;\r\n content: string;\r\n resxNewlineNormalization: NewlineKind | undefined;\r\n}\r\n\r\ninterface IParseCacheEntry {\r\n content: string;\r\n parsedFile: ILocalizationFile;\r\n}\r\n\r\nconst parseCache: Map<string, IParseCacheEntry> = new Map<string, IParseCacheEntry>();\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class LocFileParser {\r\n public static parseLocFile(options: IParseLocFileOptions): ILocalizationFile {\r\n const fileCacheKey: string = `${options.filePath}?${options.resxNewlineNormalization || 'none'}`;\r\n if (parseCache.has(fileCacheKey)) {\r\n const entry: IParseCacheEntry = parseCache.get(fileCacheKey)!;\r\n if (entry.content === options.content) {\r\n return entry.parsedFile;\r\n }\r\n }\r\n\r\n let parsedFile: ILocalizationFile;\r\n if (/\\.resx$/i.test(options.filePath)) {\r\n parsedFile = ResxReader.readResxAsLocFile(options.content, {\r\n terminal: options.terminal,\r\n resxFilePath: options.filePath,\r\n newlineNormalization: options.resxNewlineNormalization\r\n });\r\n } else {\r\n parsedFile = JsonFile.parseString(options.content);\r\n try {\r\n Constants.LOC_JSON_SCHEMA.validateObject(parsedFile, options.filePath);\r\n } catch (e) {\r\n options.terminal.writeError(`The loc file is invalid. Error: ${e}`);\r\n }\r\n }\r\n\r\n parseCache.set(fileCacheKey, { content: options.content, parsedFile });\r\n return parsedFile;\r\n }\r\n}\r\n"]}
{"version":3,"file":"LocFileParser.js","sourceRoot":"","sources":["../../src/utilities/LocFileParser.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAE3D,oEAA+E;AAG/E,6CAA0C;AAC1C,2CAAwC;AAiBxC,MAAM,UAAU,GAAkC,IAAI,GAAG,EAA4B,CAAC;AAEtF;;GAEG;AACH,MAAa,aAAa;IACjB,MAAM,CAAC,YAAY,CAAC,OAA6B;QACtD,MAAM,YAAY,GAAW,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,wBAAwB,IAAI,MAAM,EAAE,CAAC;QACjG,IAAI,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE;YAChC,MAAM,KAAK,GAAqB,UAAU,CAAC,GAAG,CAAC,YAAY,CAAE,CAAC;YAC9D,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,EAAE;gBACrC,OAAO,KAAK,CAAC,UAAU,CAAC;aACzB;SACF;QAED,IAAI,UAA6B,CAAC;QAClC,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;YACrC,UAAU,GAAG,uBAAU,CAAC,iBAAiB,CAAC,OAAO,CAAC,OAAO,EAAE;gBACzD,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,YAAY,EAAE,OAAO,CAAC,QAAQ;gBAC9B,oBAAoB,EAAE,OAAO,CAAC,wBAAwB;aACvD,CAAC,CAAC;SACJ;aAAM;YACL,UAAU,GAAG,4BAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACnD,IAAI;gBACF,qBAAS,CAAC,eAAe,CAAC,cAAc,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;aACxE;YAAC,OAAO,CAAC,EAAE;gBACV,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,mCAAmC,CAAC,EAAE,CAAC,CAAC;aACrE;SACF;QAED,UAAU,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QACvE,OAAO,UAAU,CAAC;IACpB,CAAC;CACF;AA7BD,sCA6BC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport { Terminal, NewlineKind, JsonFile } from '@rushstack/node-core-library';\r\n\r\nimport { ILocalizationFile } from '../interfaces';\r\nimport { ResxReader } from './ResxReader';\r\nimport { Constants } from './Constants';\r\n\r\n/**\r\n * @internal\r\n */\r\nexport interface IParseLocFileOptions {\r\n terminal: Terminal;\r\n filePath: string;\r\n content: string;\r\n resxNewlineNormalization: NewlineKind | undefined;\r\n}\r\n\r\ninterface IParseCacheEntry {\r\n content: string;\r\n parsedFile: ILocalizationFile;\r\n}\r\n\r\nconst parseCache: Map<string, IParseCacheEntry> = new Map<string, IParseCacheEntry>();\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class LocFileParser {\r\n public static parseLocFile(options: IParseLocFileOptions): ILocalizationFile {\r\n const fileCacheKey: string = `${options.filePath}?${options.resxNewlineNormalization || 'none'}`;\r\n if (parseCache.has(fileCacheKey)) {\r\n const entry: IParseCacheEntry = parseCache.get(fileCacheKey)!;\r\n if (entry.content === options.content) {\r\n return entry.parsedFile;\r\n }\r\n }\r\n\r\n let parsedFile: ILocalizationFile;\r\n if (/\\.resx$/i.test(options.filePath)) {\r\n parsedFile = ResxReader.readResxAsLocFile(options.content, {\r\n terminal: options.terminal,\r\n resxFilePath: options.filePath,\r\n newlineNormalization: options.resxNewlineNormalization\r\n });\r\n } else {\r\n parsedFile = JsonFile.parseString(options.content);\r\n try {\r\n Constants.LOC_JSON_SCHEMA.validateObject(parsedFile, options.filePath);\r\n } catch (e) {\r\n options.terminal.writeError(`The loc file is invalid. Error: ${e}`);\r\n }\r\n }\r\n\r\n parseCache.set(fileCacheKey, { content: options.content, parsedFile });\r\n return parsedFile;\r\n }\r\n}\r\n"]}

@@ -5,2 +5,3 @@ "use strict";

Object.defineProperty(exports, "__esModule", { value: true });
exports.ResxReader = void 0;
const node_core_library_1 = require("@rushstack/node-core-library");

@@ -7,0 +8,0 @@ const xmldoc_1 = require("xmldoc");

@@ -1,1 +0,1 @@

{"version":3,"file":"ResxReader.js","sourceRoot":"","sources":["../../src/utilities/ResxReader.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport { FileSystem, Terminal, Text, NewlineKind } from '@rushstack/node-core-library';\r\nimport { XmlDocument, XmlElement } from 'xmldoc';\r\n\r\nimport { ILocalizedString, ILocalizationFile } from '../interfaces';\r\n\r\nconst STRING_NAME_RESX: RegExp = /^[A-z_$][A-z0-9_$]*$/;\r\n\r\nexport interface IResxReaderOptions {\r\n resxFilePath: string;\r\n terminal: Terminal;\r\n newlineNormalization: NewlineKind | undefined;\r\n}\r\n\r\ninterface ILoggingFunctions {\r\n logError: (message: string) => void;\r\n logWarning: (message: string) => void;\r\n logFileError: (message: string, filePath: string, line?: number, position?: number) => void;\r\n logFileWarning: (message: string, filePath: string, line?: number, position?: number) => void;\r\n}\r\n\r\ninterface IResxReaderOptionsInternal {\r\n resxFilePath: string;\r\n resxContents: string;\r\n loggingFunctions: ILoggingFunctions;\r\n newlineNormalization: NewlineKind | undefined;\r\n}\r\n\r\nexport class ResxReader {\r\n public static readResxFileAsLocFile(options: IResxReaderOptions): ILocalizationFile {\r\n const resxContents: string = FileSystem.readFile(options.resxFilePath);\r\n return ResxReader.readResxAsLocFile(resxContents, options);\r\n }\r\n\r\n public static readResxAsLocFile(resxContents: string, options: IResxReaderOptions): ILocalizationFile {\r\n const writeError: (message: string) => void = options.terminal.writeErrorLine.bind(options.terminal);\r\n const writeWarning: (message: string) => void = options.terminal.writeWarningLine.bind(options.terminal);\r\n const loggingFunctions: ILoggingFunctions = {\r\n logError: (message: string) => writeError(message),\r\n logWarning: (message: string) => writeWarning(message),\r\n logFileError: (message: string, filePath: string, line?: number, position?: number) => {\r\n ResxReader._logWithLocation(writeError, message, filePath, line, position);\r\n },\r\n logFileWarning: (message: string, filePath: string, line?: number, position?: number) => {\r\n ResxReader._logWithLocation(writeWarning, message, filePath, line, position);\r\n }\r\n };\r\n\r\n return this._readResxAsLocFileInternal({\r\n resxFilePath: options.resxFilePath,\r\n resxContents,\r\n loggingFunctions,\r\n newlineNormalization: options.newlineNormalization\r\n });\r\n }\r\n\r\n private static _readResxAsLocFileInternal(options: IResxReaderOptionsInternal): ILocalizationFile {\r\n const xmlDocument: XmlDocument = new XmlDocument(options.resxContents);\r\n\r\n if (xmlDocument.name !== 'root') {\r\n ResxReader._logErrorWithLocation(\r\n options,\r\n `Expected RESX to have a \"root\" element, found \"${xmlDocument.name}\"`,\r\n xmlDocument\r\n );\r\n }\r\n\r\n const locFile: ILocalizationFile = {};\r\n\r\n for (const childNode of xmlDocument.children) {\r\n switch (childNode.type) {\r\n case 'element': {\r\n switch (childNode.name) {\r\n case 'data': {\r\n const stringName: string = childNode.attr.name;\r\n if (!stringName) {\r\n ResxReader._logErrorWithLocation(\r\n options,\r\n 'Unexpected missing or empty string name',\r\n childNode\r\n );\r\n } else if (!STRING_NAME_RESX.test(stringName)) {\r\n ResxReader._logErrorWithLocation(options, `Invalid string name \"${stringName}\"`, childNode);\r\n } else {\r\n if (locFile.hasOwnProperty(stringName)) {\r\n ResxReader._logErrorWithLocation(\r\n options,\r\n `Duplicate string value \"${stringName}\"`,\r\n childNode\r\n );\r\n }\r\n\r\n const locString: ILocalizedString | undefined = ResxReader._readDataElement(\r\n options,\r\n childNode\r\n );\r\n\r\n if (locString) {\r\n locFile[stringName] = locString;\r\n }\r\n }\r\n\r\n break;\r\n }\r\n\r\n // Other allowed elements\r\n case 'xsd:schema':\r\n case 'resheader':\r\n break;\r\n\r\n default:\r\n ResxReader._logErrorWithLocation(\r\n options,\r\n `Unexpected RESX element ${childNode.name}`,\r\n childNode\r\n );\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'text': {\r\n if (childNode.text.trim() !== '') {\r\n ResxReader._logErrorWithLocation(options, 'Found unexpected non-empty text node in RESX');\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'comment':\r\n break;\r\n\r\n default:\r\n ResxReader._logErrorWithLocation(options, `Unexpected ${childNode.type} child in RESX`);\r\n break;\r\n }\r\n }\r\n\r\n return locFile;\r\n }\r\n\r\n private static _readDataElement(\r\n options: IResxReaderOptionsInternal,\r\n dataElement: XmlElement\r\n ): ILocalizedString | undefined {\r\n let foundCommentElement: boolean = false;\r\n let foundValueElement: boolean = false;\r\n let comment: string | undefined = undefined;\r\n let value: string | undefined = undefined;\r\n\r\n for (const childNode of dataElement.children) {\r\n switch (childNode.type) {\r\n case 'element': {\r\n switch (childNode.name) {\r\n case 'value': {\r\n if (foundValueElement) {\r\n ResxReader._logErrorWithLocation(options, 'Duplicate <value> element found', childNode);\r\n } else {\r\n foundValueElement = true;\r\n value = ResxReader._readTextElement(options, childNode);\r\n if (value && options.newlineNormalization) {\r\n value = Text.convertTo(value, options.newlineNormalization);\r\n }\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'comment': {\r\n if (foundCommentElement) {\r\n ResxReader._logErrorWithLocation(options, 'Duplicate <comment> element found', childNode);\r\n } else {\r\n foundCommentElement = true;\r\n comment = ResxReader._readTextElement(options, childNode);\r\n }\r\n\r\n break;\r\n }\r\n\r\n default:\r\n ResxReader._logErrorWithLocation(\r\n options,\r\n `Unexpected RESX element ${childNode.name}`,\r\n childNode\r\n );\r\n break;\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'text': {\r\n if (childNode.text.trim() !== '') {\r\n ResxReader._logErrorWithLocation(\r\n options,\r\n 'Found unexpected non-empty text node in RESX <data> element',\r\n dataElement\r\n );\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'comment':\r\n break;\r\n\r\n default:\r\n ResxReader._logErrorWithLocation(\r\n options,\r\n `Unexpected ${childNode.type} child in RESX <data> element`,\r\n dataElement\r\n );\r\n }\r\n }\r\n\r\n if (!foundValueElement) {\r\n ResxReader._logErrorWithLocation(options, 'Missing string value in <data> element', dataElement);\r\n } else {\r\n if (comment === undefined) {\r\n ResxReader._logWarningWithLocation(options, 'Missing string comment in <data> element', dataElement);\r\n }\r\n\r\n return {\r\n value: value || '',\r\n comment\r\n };\r\n }\r\n }\r\n\r\n private static _readTextElement(\r\n options: IResxReaderOptionsInternal,\r\n element: XmlElement\r\n ): string | undefined {\r\n let foundText: string | undefined = undefined;\r\n\r\n for (const childNode of element.children) {\r\n switch (childNode.type) {\r\n case 'cdata':\r\n case 'text': {\r\n if (foundText !== undefined) {\r\n ResxReader._logErrorWithLocation(\r\n options,\r\n 'More than one child node found containing text content',\r\n element\r\n );\r\n break;\r\n }\r\n\r\n foundText = childNode.type === 'text' ? childNode.text : childNode.cdata;\r\n break;\r\n }\r\n\r\n case 'comment':\r\n break;\r\n\r\n case 'element':\r\n ResxReader._logErrorWithLocation(options, `Unexpected element`, childNode);\r\n break;\r\n\r\n default:\r\n ResxReader._logErrorWithLocation(options, `Unexpected ${element.type} child`, element);\r\n break;\r\n }\r\n }\r\n\r\n return foundText;\r\n }\r\n\r\n private static _logErrorWithLocation(\r\n options: IResxReaderOptionsInternal,\r\n message: string,\r\n element?: XmlElement | XmlDocument\r\n ): void {\r\n if (element) {\r\n options.loggingFunctions.logFileError(\r\n message,\r\n options.resxFilePath,\r\n element.line + 1,\r\n element.column + 1\r\n );\r\n } else {\r\n options.loggingFunctions.logFileError(message, options.resxFilePath);\r\n }\r\n }\r\n\r\n private static _logWarningWithLocation(\r\n options: IResxReaderOptionsInternal,\r\n message: string,\r\n element?: XmlElement | XmlDocument\r\n ): void {\r\n if (element) {\r\n options.loggingFunctions.logFileWarning(\r\n message,\r\n options.resxFilePath,\r\n element.line + 1,\r\n element.column + 1\r\n );\r\n } else {\r\n options.loggingFunctions.logFileWarning(message, options.resxFilePath);\r\n }\r\n }\r\n\r\n private static _logWithLocation(\r\n loggingFn: (message: string) => void,\r\n message: string,\r\n filePath: string,\r\n line?: number,\r\n position?: number\r\n ): void {\r\n let location: string;\r\n if (position !== undefined) {\r\n location = `${filePath}(${line},${position})`;\r\n } else if (line !== undefined) {\r\n location = `${filePath}(${line})`;\r\n } else {\r\n location = filePath;\r\n }\r\n\r\n loggingFn(`${location}: ${message}`);\r\n }\r\n}\r\n"]}
{"version":3,"file":"ResxReader.js","sourceRoot":"","sources":["../../src/utilities/ResxReader.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport { FileSystem, Terminal, Text, NewlineKind } from '@rushstack/node-core-library';\r\nimport { XmlDocument, XmlElement } from 'xmldoc';\r\n\r\nimport { ILocalizedString, ILocalizationFile } from '../interfaces';\r\n\r\nconst STRING_NAME_RESX: RegExp = /^[A-z_$][A-z0-9_$]*$/;\r\n\r\nexport interface IResxReaderOptions {\r\n resxFilePath: string;\r\n terminal: Terminal;\r\n newlineNormalization: NewlineKind | undefined;\r\n}\r\n\r\ninterface ILoggingFunctions {\r\n logError: (message: string) => void;\r\n logWarning: (message: string) => void;\r\n logFileError: (message: string, filePath: string, line?: number, position?: number) => void;\r\n logFileWarning: (message: string, filePath: string, line?: number, position?: number) => void;\r\n}\r\n\r\ninterface IResxReaderOptionsInternal {\r\n resxFilePath: string;\r\n resxContents: string;\r\n loggingFunctions: ILoggingFunctions;\r\n newlineNormalization: NewlineKind | undefined;\r\n}\r\n\r\nexport class ResxReader {\r\n public static readResxFileAsLocFile(options: IResxReaderOptions): ILocalizationFile {\r\n const resxContents: string = FileSystem.readFile(options.resxFilePath);\r\n return ResxReader.readResxAsLocFile(resxContents, options);\r\n }\r\n\r\n public static readResxAsLocFile(resxContents: string, options: IResxReaderOptions): ILocalizationFile {\r\n const writeError: (message: string) => void = options.terminal.writeErrorLine.bind(options.terminal);\r\n const writeWarning: (message: string) => void = options.terminal.writeWarningLine.bind(options.terminal);\r\n const loggingFunctions: ILoggingFunctions = {\r\n logError: (message: string) => writeError(message),\r\n logWarning: (message: string) => writeWarning(message),\r\n logFileError: (message: string, filePath: string, line?: number, position?: number) => {\r\n ResxReader._logWithLocation(writeError, message, filePath, line, position);\r\n },\r\n logFileWarning: (message: string, filePath: string, line?: number, position?: number) => {\r\n ResxReader._logWithLocation(writeWarning, message, filePath, line, position);\r\n }\r\n };\r\n\r\n return this._readResxAsLocFileInternal({\r\n resxFilePath: options.resxFilePath,\r\n resxContents,\r\n loggingFunctions,\r\n newlineNormalization: options.newlineNormalization\r\n });\r\n }\r\n\r\n private static _readResxAsLocFileInternal(options: IResxReaderOptionsInternal): ILocalizationFile {\r\n const xmlDocument: XmlDocument = new XmlDocument(options.resxContents);\r\n\r\n if (xmlDocument.name !== 'root') {\r\n ResxReader._logErrorWithLocation(\r\n options,\r\n `Expected RESX to have a \"root\" element, found \"${xmlDocument.name}\"`,\r\n xmlDocument\r\n );\r\n }\r\n\r\n const locFile: ILocalizationFile = {};\r\n\r\n for (const childNode of xmlDocument.children) {\r\n switch (childNode.type) {\r\n case 'element': {\r\n switch (childNode.name) {\r\n case 'data': {\r\n const stringName: string = childNode.attr.name;\r\n if (!stringName) {\r\n ResxReader._logErrorWithLocation(\r\n options,\r\n 'Unexpected missing or empty string name',\r\n childNode\r\n );\r\n } else if (!STRING_NAME_RESX.test(stringName)) {\r\n ResxReader._logErrorWithLocation(options, `Invalid string name \"${stringName}\"`, childNode);\r\n } else {\r\n if (locFile.hasOwnProperty(stringName)) {\r\n ResxReader._logErrorWithLocation(\r\n options,\r\n `Duplicate string value \"${stringName}\"`,\r\n childNode\r\n );\r\n }\r\n\r\n const locString: ILocalizedString | undefined = ResxReader._readDataElement(\r\n options,\r\n childNode\r\n );\r\n\r\n if (locString) {\r\n locFile[stringName] = locString;\r\n }\r\n }\r\n\r\n break;\r\n }\r\n\r\n // Other allowed elements\r\n case 'xsd:schema':\r\n case 'resheader':\r\n break;\r\n\r\n default:\r\n ResxReader._logErrorWithLocation(\r\n options,\r\n `Unexpected RESX element ${childNode.name}`,\r\n childNode\r\n );\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'text': {\r\n if (childNode.text.trim() !== '') {\r\n ResxReader._logErrorWithLocation(options, 'Found unexpected non-empty text node in RESX');\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'comment':\r\n break;\r\n\r\n default:\r\n ResxReader._logErrorWithLocation(options, `Unexpected ${childNode.type} child in RESX`);\r\n break;\r\n }\r\n }\r\n\r\n return locFile;\r\n }\r\n\r\n private static _readDataElement(\r\n options: IResxReaderOptionsInternal,\r\n dataElement: XmlElement\r\n ): ILocalizedString | undefined {\r\n let foundCommentElement: boolean = false;\r\n let foundValueElement: boolean = false;\r\n let comment: string | undefined = undefined;\r\n let value: string | undefined = undefined;\r\n\r\n for (const childNode of dataElement.children) {\r\n switch (childNode.type) {\r\n case 'element': {\r\n switch (childNode.name) {\r\n case 'value': {\r\n if (foundValueElement) {\r\n ResxReader._logErrorWithLocation(options, 'Duplicate <value> element found', childNode);\r\n } else {\r\n foundValueElement = true;\r\n value = ResxReader._readTextElement(options, childNode);\r\n if (value && options.newlineNormalization) {\r\n value = Text.convertTo(value, options.newlineNormalization);\r\n }\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'comment': {\r\n if (foundCommentElement) {\r\n ResxReader._logErrorWithLocation(options, 'Duplicate <comment> element found', childNode);\r\n } else {\r\n foundCommentElement = true;\r\n comment = ResxReader._readTextElement(options, childNode);\r\n }\r\n\r\n break;\r\n }\r\n\r\n default:\r\n ResxReader._logErrorWithLocation(\r\n options,\r\n `Unexpected RESX element ${childNode.name}`,\r\n childNode\r\n );\r\n break;\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'text': {\r\n if (childNode.text.trim() !== '') {\r\n ResxReader._logErrorWithLocation(\r\n options,\r\n 'Found unexpected non-empty text node in RESX <data> element',\r\n dataElement\r\n );\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'comment':\r\n break;\r\n\r\n default:\r\n ResxReader._logErrorWithLocation(\r\n options,\r\n `Unexpected ${childNode.type} child in RESX <data> element`,\r\n dataElement\r\n );\r\n }\r\n }\r\n\r\n if (!foundValueElement) {\r\n ResxReader._logErrorWithLocation(options, 'Missing string value in <data> element', dataElement);\r\n } else {\r\n if (comment === undefined) {\r\n ResxReader._logWarningWithLocation(options, 'Missing string comment in <data> element', dataElement);\r\n }\r\n\r\n return {\r\n value: value || '',\r\n comment\r\n };\r\n }\r\n }\r\n\r\n private static _readTextElement(\r\n options: IResxReaderOptionsInternal,\r\n element: XmlElement\r\n ): string | undefined {\r\n let foundText: string | undefined = undefined;\r\n\r\n for (const childNode of element.children) {\r\n switch (childNode.type) {\r\n case 'cdata':\r\n case 'text': {\r\n if (foundText !== undefined) {\r\n ResxReader._logErrorWithLocation(\r\n options,\r\n 'More than one child node found containing text content',\r\n element\r\n );\r\n break;\r\n }\r\n\r\n foundText = childNode.type === 'text' ? childNode.text : childNode.cdata;\r\n break;\r\n }\r\n\r\n case 'comment':\r\n break;\r\n\r\n case 'element':\r\n ResxReader._logErrorWithLocation(options, `Unexpected element`, childNode);\r\n break;\r\n\r\n default:\r\n ResxReader._logErrorWithLocation(options, `Unexpected ${element.type} child`, element);\r\n break;\r\n }\r\n }\r\n\r\n return foundText;\r\n }\r\n\r\n private static _logErrorWithLocation(\r\n options: IResxReaderOptionsInternal,\r\n message: string,\r\n element?: XmlElement | XmlDocument\r\n ): void {\r\n if (element) {\r\n options.loggingFunctions.logFileError(\r\n message,\r\n options.resxFilePath,\r\n element.line + 1,\r\n element.column + 1\r\n );\r\n } else {\r\n options.loggingFunctions.logFileError(message, options.resxFilePath);\r\n }\r\n }\r\n\r\n private static _logWarningWithLocation(\r\n options: IResxReaderOptionsInternal,\r\n message: string,\r\n element?: XmlElement | XmlDocument\r\n ): void {\r\n if (element) {\r\n options.loggingFunctions.logFileWarning(\r\n message,\r\n options.resxFilePath,\r\n element.line + 1,\r\n element.column + 1\r\n );\r\n } else {\r\n options.loggingFunctions.logFileWarning(message, options.resxFilePath);\r\n }\r\n }\r\n\r\n private static _logWithLocation(\r\n loggingFn: (message: string) => void,\r\n message: string,\r\n filePath: string,\r\n line?: number,\r\n position?: number\r\n ): void {\r\n let location: string;\r\n if (position !== undefined) {\r\n location = `${filePath}(${line},${position})`;\r\n } else if (line !== undefined) {\r\n location = `${filePath}(${line})`;\r\n } else {\r\n location = filePath;\r\n }\r\n\r\n loggingFn(`${location}: ${message}`);\r\n }\r\n}\r\n"]}
"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const path = require("path");
const lodash = require("lodash");
exports.WebpackConfigurationUpdater = void 0;
const path = __importStar(require("path"));
const lodash = __importStar(require("lodash"));
const Constants_1 = require("./utilities/Constants");

@@ -8,0 +28,0 @@ const FILE_TOKEN_REGEX = new RegExp(lodash.escapeRegExp('[file]'));

@@ -1,1 +0,1 @@

{"version":3,"file":"WebpackConfigurationUpdater.js","sourceRoot":"","sources":["../src/WebpackConfigurationUpdater.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport * as path from 'path';\r\nimport * as Webpack from 'webpack';\r\nimport * as SetPublicPathPluginPackageType from '@rushstack/set-webpack-public-path-plugin';\r\nimport { NewlineKind } from '@rushstack/node-core-library';\r\nimport * as lodash from 'lodash';\r\n\r\nimport { Constants } from './utilities/Constants';\r\nimport { LocalizationPlugin } from './LocalizationPlugin';\r\nimport { ILocLoaderOptions } from './loaders/LocLoader';\r\nimport { IBaseLoaderOptions } from './loaders/LoaderFactory';\r\n\r\nexport interface IWebpackConfigurationUpdaterOptions {\r\n pluginInstance: LocalizationPlugin;\r\n configuration: Webpack.Configuration;\r\n filesToIgnore: Set<string>;\r\n localeNameOrPlaceholder: string;\r\n resxNewlineNormalization: NewlineKind | undefined;\r\n}\r\n\r\nconst FILE_TOKEN_REGEX: RegExp = new RegExp(lodash.escapeRegExp('[file]'));\r\n\r\nexport class WebpackConfigurationUpdater {\r\n public static amendWebpackConfigurationForMultiLocale(options: IWebpackConfigurationUpdaterOptions): void {\r\n const loader: string = path.resolve(__dirname, 'loaders', 'LocLoader.js');\r\n const loaderOptions: ILocLoaderOptions = {\r\n pluginInstance: options.pluginInstance,\r\n resxNewlineNormalization: options.resxNewlineNormalization\r\n };\r\n\r\n WebpackConfigurationUpdater._addLoadersForLocFiles(options, loader, loaderOptions);\r\n\r\n WebpackConfigurationUpdater._tryUpdateLocaleTokenInPublicPathPlugin(options);\r\n\r\n WebpackConfigurationUpdater._tryUpdateSourceMapFilename(options.configuration);\r\n }\r\n\r\n public static amendWebpackConfigurationForInPlaceLocFiles(\r\n options: IWebpackConfigurationUpdaterOptions\r\n ): void {\r\n const loader: string = path.resolve(__dirname, 'loaders', 'InPlaceLocFileLoader.js');\r\n const loaderOptions: IBaseLoaderOptions = {\r\n resxNewlineNormalization: options.resxNewlineNormalization\r\n };\r\n\r\n WebpackConfigurationUpdater._addRulesToConfiguration(options.configuration, [\r\n {\r\n test: Constants.LOC_JSON_REGEX,\r\n use: [\r\n {\r\n loader: loader,\r\n options: loaderOptions\r\n }\r\n ]\r\n },\r\n {\r\n test: Constants.RESX_REGEX,\r\n use: [\r\n {\r\n loader: loader,\r\n options: loaderOptions\r\n }\r\n ],\r\n type: 'json'\r\n }\r\n ]);\r\n }\r\n\r\n private static _tryUpdateLocaleTokenInPublicPathPlugin(options: IWebpackConfigurationUpdaterOptions): void {\r\n let setPublicPathPlugin: typeof SetPublicPathPluginPackageType.SetPublicPathPlugin | undefined;\r\n try {\r\n const pluginPackage: typeof SetPublicPathPluginPackageType = require('@rushstack/set-webpack-public-path-plugin');\r\n setPublicPathPlugin = pluginPackage.SetPublicPathPlugin;\r\n } catch (e) {\r\n // public path plugin isn't present - ignore\r\n }\r\n\r\n if (setPublicPathPlugin && options.configuration.plugins) {\r\n for (const plugin of options.configuration.plugins) {\r\n if (plugin instanceof setPublicPathPlugin) {\r\n if (\r\n plugin.options &&\r\n plugin.options.scriptName &&\r\n plugin.options.scriptName.isTokenized &&\r\n plugin.options.scriptName.name\r\n ) {\r\n plugin.options.scriptName.name = plugin.options.scriptName.name.replace(\r\n /\\[locale\\]/g,\r\n options.localeNameOrPlaceholder\r\n );\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n private static _addLoadersForLocFiles(\r\n options: IWebpackConfigurationUpdaterOptions,\r\n loader: string,\r\n loaderOptions: IBaseLoaderOptions\r\n ): void {\r\n WebpackConfigurationUpdater._addRulesToConfiguration(options.configuration, [\r\n {\r\n test: {\r\n and: [(filePath: string) => !options.filesToIgnore.has(filePath), Constants.LOC_JSON_REGEX]\r\n },\r\n use: [\r\n {\r\n loader: loader,\r\n options: loaderOptions\r\n }\r\n ]\r\n },\r\n {\r\n test: {\r\n and: [(filePath: string) => !options.filesToIgnore.has(filePath), Constants.RESX_REGEX]\r\n },\r\n use: [\r\n {\r\n loader: loader,\r\n options: loaderOptions\r\n }\r\n ],\r\n type: 'json'\r\n }\r\n ]);\r\n }\r\n\r\n private static _addRulesToConfiguration(\r\n configuration: Webpack.Configuration,\r\n rules: Webpack.RuleSetRule[]\r\n ): void {\r\n if (!configuration.module) {\r\n configuration.module = {\r\n rules: []\r\n };\r\n }\r\n\r\n if (!configuration.module.rules) {\r\n configuration.module.rules = [];\r\n }\r\n\r\n configuration.module.rules.push(...rules);\r\n }\r\n\r\n private static _tryUpdateSourceMapFilename(configuration: Webpack.Configuration): void {\r\n if (!configuration.output) {\r\n configuration.output = {}; // This should never happen\r\n }\r\n\r\n if (configuration.output.sourceMapFilename !== undefined) {\r\n configuration.output.sourceMapFilename = configuration.output.sourceMapFilename.replace(\r\n FILE_TOKEN_REGEX,\r\n Constants.NO_LOCALE_SOURCE_MAP_FILENAME_TOKEN\r\n );\r\n }\r\n }\r\n}\r\n"]}
{"version":3,"file":"WebpackConfigurationUpdater.js","sourceRoot":"","sources":["../src/WebpackConfigurationUpdater.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport * as path from 'path';\r\nimport * as Webpack from 'webpack';\r\nimport * as SetPublicPathPluginPackageType from '@rushstack/set-webpack-public-path-plugin';\r\nimport { NewlineKind } from '@rushstack/node-core-library';\r\nimport * as lodash from 'lodash';\r\n\r\nimport { Constants } from './utilities/Constants';\r\nimport { LocalizationPlugin } from './LocalizationPlugin';\r\nimport { ILocLoaderOptions } from './loaders/LocLoader';\r\nimport { IBaseLoaderOptions } from './loaders/LoaderFactory';\r\n\r\nexport interface IWebpackConfigurationUpdaterOptions {\r\n pluginInstance: LocalizationPlugin;\r\n configuration: Webpack.Configuration;\r\n filesToIgnore: Set<string>;\r\n localeNameOrPlaceholder: string;\r\n resxNewlineNormalization: NewlineKind | undefined;\r\n}\r\n\r\nconst FILE_TOKEN_REGEX: RegExp = new RegExp(lodash.escapeRegExp('[file]'));\r\n\r\nexport class WebpackConfigurationUpdater {\r\n public static amendWebpackConfigurationForMultiLocale(options: IWebpackConfigurationUpdaterOptions): void {\r\n const loader: string = path.resolve(__dirname, 'loaders', 'LocLoader.js');\r\n const loaderOptions: ILocLoaderOptions = {\r\n pluginInstance: options.pluginInstance,\r\n resxNewlineNormalization: options.resxNewlineNormalization\r\n };\r\n\r\n WebpackConfigurationUpdater._addLoadersForLocFiles(options, loader, loaderOptions);\r\n\r\n WebpackConfigurationUpdater._tryUpdateLocaleTokenInPublicPathPlugin(options);\r\n\r\n WebpackConfigurationUpdater._tryUpdateSourceMapFilename(options.configuration);\r\n }\r\n\r\n public static amendWebpackConfigurationForInPlaceLocFiles(\r\n options: IWebpackConfigurationUpdaterOptions\r\n ): void {\r\n const loader: string = path.resolve(__dirname, 'loaders', 'InPlaceLocFileLoader.js');\r\n const loaderOptions: IBaseLoaderOptions = {\r\n resxNewlineNormalization: options.resxNewlineNormalization\r\n };\r\n\r\n WebpackConfigurationUpdater._addRulesToConfiguration(options.configuration, [\r\n {\r\n test: Constants.LOC_JSON_REGEX,\r\n use: [\r\n {\r\n loader: loader,\r\n options: loaderOptions\r\n }\r\n ]\r\n },\r\n {\r\n test: Constants.RESX_REGEX,\r\n use: [\r\n {\r\n loader: loader,\r\n options: loaderOptions\r\n }\r\n ],\r\n type: 'json'\r\n }\r\n ]);\r\n }\r\n\r\n private static _tryUpdateLocaleTokenInPublicPathPlugin(options: IWebpackConfigurationUpdaterOptions): void {\r\n let setPublicPathPlugin: typeof SetPublicPathPluginPackageType.SetPublicPathPlugin | undefined;\r\n try {\r\n const pluginPackage: typeof SetPublicPathPluginPackageType = require('@rushstack/set-webpack-public-path-plugin');\r\n setPublicPathPlugin = pluginPackage.SetPublicPathPlugin;\r\n } catch (e) {\r\n // public path plugin isn't present - ignore\r\n }\r\n\r\n if (setPublicPathPlugin && options.configuration.plugins) {\r\n for (const plugin of options.configuration.plugins) {\r\n if (plugin instanceof setPublicPathPlugin) {\r\n if (\r\n plugin.options &&\r\n plugin.options.scriptName &&\r\n plugin.options.scriptName.isTokenized &&\r\n plugin.options.scriptName.name\r\n ) {\r\n plugin.options.scriptName.name = plugin.options.scriptName.name.replace(\r\n /\\[locale\\]/g,\r\n options.localeNameOrPlaceholder\r\n );\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n private static _addLoadersForLocFiles(\r\n options: IWebpackConfigurationUpdaterOptions,\r\n loader: string,\r\n loaderOptions: IBaseLoaderOptions\r\n ): void {\r\n WebpackConfigurationUpdater._addRulesToConfiguration(options.configuration, [\r\n {\r\n test: {\r\n and: [(filePath: string) => !options.filesToIgnore.has(filePath), Constants.LOC_JSON_REGEX]\r\n },\r\n use: [\r\n {\r\n loader: loader,\r\n options: loaderOptions\r\n }\r\n ]\r\n },\r\n {\r\n test: {\r\n and: [(filePath: string) => !options.filesToIgnore.has(filePath), Constants.RESX_REGEX]\r\n },\r\n use: [\r\n {\r\n loader: loader,\r\n options: loaderOptions\r\n }\r\n ],\r\n type: 'json'\r\n }\r\n ]);\r\n }\r\n\r\n private static _addRulesToConfiguration(\r\n configuration: Webpack.Configuration,\r\n rules: Webpack.RuleSetRule[]\r\n ): void {\r\n if (!configuration.module) {\r\n configuration.module = {\r\n rules: []\r\n };\r\n }\r\n\r\n if (!configuration.module.rules) {\r\n configuration.module.rules = [];\r\n }\r\n\r\n configuration.module.rules.push(...rules);\r\n }\r\n\r\n private static _tryUpdateSourceMapFilename(configuration: Webpack.Configuration): void {\r\n if (!configuration.output) {\r\n configuration.output = {}; // This should never happen\r\n }\r\n\r\n if (configuration.output.sourceMapFilename !== undefined) {\r\n configuration.output.sourceMapFilename = configuration.output.sourceMapFilename.replace(\r\n FILE_TOKEN_REGEX,\r\n Constants.NO_LOCALE_SOURCE_MAP_FILENAME_TOKEN\r\n );\r\n }\r\n }\r\n}\r\n"]}
{
"name": "@rushstack/localization-plugin",
"version": "0.3.66",
"version": "0.3.67",
"description": "This plugin facilitates localization with Webpack.",

@@ -17,3 +17,3 @@ "main": "lib/index.js",

"webpack": "^4.31.0",
"@rushstack/set-webpack-public-path-plugin": "^2.4.65",
"@rushstack/set-webpack-public-path-plugin": "^3.0.0",
"@types/webpack": "^4.39.0"

@@ -30,20 +30,20 @@ },

"dependencies": {
"@rushstack/node-core-library": "3.34.0",
"@rushstack/typings-generator": "0.2.11",
"@types/node": "10.17.13",
"@types/tapable": "1.0.5",
"@rushstack/node-core-library": "3.33.6",
"@rushstack/typings-generator": "0.2.10",
"decache": "~4.5.1",
"loader-utils": "~1.1.0",
"lodash": "~4.17.15",
"xmldoc": "~1.1.2",
"pseudolocale": "~1.1.0",
"decache": "~4.5.1"
"xmldoc": "~1.1.2"
},
"devDependencies": {
"@types/webpack": "4.39.8",
"@microsoft/rush-stack-compiler-3.5": "0.8.21",
"@rushstack/set-webpack-public-path-plugin": "2.4.65",
"@rushstack/eslint-config": "2.1.1",
"@rushstack/heft": "0.13.9",
"@rushstack/eslint-config": "2.1.2",
"@rushstack/heft": "0.14.0",
"@rushstack/heft-node-rig": "0.1.0",
"@rushstack/set-webpack-public-path-plugin": "3.0.0",
"@types/loader-utils": "1.1.3",
"@types/lodash": "4.14.116",
"@types/webpack": "4.39.8",
"@types/xmldoc": "1.1.4",

@@ -50,0 +50,0 @@ "webpack": "~4.31.0"

@@ -1,2 +0,2 @@

# Localization Plugin for Webpack
# @rushstack/localization-plugin

@@ -9,3 +9,3 @@ ## Installation

This plugin produces webpack bundles that have multiple locales' variants of strings embedded. It also
This Webpack plugin produces bundles that have multiple locales' variants of strings embedded. It also
has out-of-box support for RESX files in addition to JSON strings files (with the extension `.loc.json`), including

@@ -277,1 +277,10 @@ support for generating typings.

syntax. This option is not recommended.
## Links
- [CHANGELOG.md](
https://github.com/microsoft/rushstack/blob/master/webpack/localization-plugin/CHANGELOG.md) - Find
out what's new in the latest version
`@rushstack/localization-plugin` is part of the [Rush Stack](https://rushstack.io/) family of projects.