@rushstack/webpack5-localization-plugin 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,7 +5,7 @@
5
5
  "toolPackages": [
6
6
  {
7
7
  "packageName": "@microsoft/api-extractor",
8
- "packageVersion": "7.40.1"
8
+ "packageVersion": "7.40.2"
9
9
  }
10
10
  ]
11
11
  }
@@ -1 +1 @@
1
- {"version":3,"file":"LocalizationPlugin.d.ts","sourceRoot":"","sources":["../src/LocalizationPlugin.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAKV,QAAQ,EACR,aAAa,EAIb,qBAAqB,EACtB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAsB,KAAK,iBAAiB,EAAgB,MAAM,mCAAmC,CAAC;AAG7G,OAAO,KAAK,EACV,0BAA0B,EAK3B,MAAM,cAAc,CAAC;AAMtB;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB;AAMD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,SAAS,GAAG,kBAAkB,CAMpF;AAED;;;;GAIG;AACH,qBAAa,kBAAmB,YAAW,qBAAqB;IAC9D,SAAgB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAa;IAExE;;OAEG;IACH,SAAgB,QAAQ,EAAE,0BAA0B,CAAC;IACrD,OAAO,CAAC,QAAQ,CAAC,qCAAqC,CAGxC;IACd,OAAO,CAAC,yBAAyB,CAAa;IAC9C,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAA8C;IACpF,OAAO,CAAC,sBAAsB,CAAU;IACxC,OAAO,CAAC,cAAc,CAAU;IAChC,OAAO,CAAC,oBAAoB,CAAU;IACtC,OAAO,CAAC,8BAA8B,CAAW;IACjD,OAAO,CAAC,wBAAwB,CAA2B;IAC3D,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAmD;IAErF;;;;OAIG;IACH,OAAO,CAAC,yBAAyB,CAA4D;gBAE1E,OAAO,EAAE,0BAA0B;IAItD;;OAEG;IACI,KAAK,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAmTtC;;;;OAIG;IACU,sBAAsB,CACjC,OAAO,EAAE,aAAa,CAAC,EAAE,CAAC,EAC1B,gBAAgB,EAAE,MAAM,EACxB,qBAAqB,EAAE,iBAAiB,GACvC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAsElC;;OAEG;IACI,cAAc,CAAC,gBAAgB,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAKnG;;OAEG;IACI,sBAAsB,CAAC,YAAY,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAInF,OAAO,CAAC,6BAA6B;IA0CrC,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,6BAA6B;CAmLtC"}
1
+ {"version":3,"file":"LocalizationPlugin.d.ts","sourceRoot":"","sources":["../src/LocalizationPlugin.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAKV,QAAQ,EACR,aAAa,EAIb,qBAAqB,EACtB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAsB,KAAK,iBAAiB,EAAgB,MAAM,mCAAmC,CAAC;AAG7G,OAAO,KAAK,EACV,0BAA0B,EAK3B,MAAM,cAAc,CAAC;AAOtB;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB;AAMD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,SAAS,GAAG,kBAAkB,CAMpF;AAED;;;;GAIG;AACH,qBAAa,kBAAmB,YAAW,qBAAqB;IAC9D,SAAgB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAa;IAExE;;OAEG;IACH,SAAgB,QAAQ,EAAE,0BAA0B,CAAC;IACrD,OAAO,CAAC,QAAQ,CAAC,qCAAqC,CAGxC;IACd,OAAO,CAAC,yBAAyB,CAAa;IAC9C,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAA8C;IACpF,OAAO,CAAC,sBAAsB,CAAU;IACxC,OAAO,CAAC,cAAc,CAAU;IAChC,OAAO,CAAC,oBAAoB,CAAU;IACtC,OAAO,CAAC,8BAA8B,CAAW;IACjD,OAAO,CAAC,wBAAwB,CAA2B;IAC3D,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAmD;IAErF;;;;OAIG;IACH,OAAO,CAAC,yBAAyB,CAA4D;gBAE1E,OAAO,EAAE,0BAA0B;IAItD;;OAEG;IACI,KAAK,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAuTtC;;;;OAIG;IACU,sBAAsB,CACjC,OAAO,EAAE,aAAa,CAAC,EAAE,CAAC,EAC1B,gBAAgB,EAAE,MAAM,EACxB,qBAAqB,EAAE,iBAAiB,GACvC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAsElC;;OAEG;IACI,cAAc,CAAC,gBAAgB,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAKnG;;OAEG;IACI,sBAAsB,CAAC,YAAY,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAInF,OAAO,CAAC,6BAA6B;IA0CrC,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,6BAA6B;CAmLtC"}
@@ -32,6 +32,7 @@ const Constants = __importStar(require("./utilities/Constants"));
32
32
  const EntityMarker_1 = require("./utilities/EntityMarker");
33
33
  const AssetProcessor_1 = require("./AssetProcessor");
34
34
  const trueHashes_1 = require("./trueHashes");
35
+ const chunkUtilities_1 = require("./utilities/chunkUtilities");
35
36
  const PLUGIN_NAME = 'localization';
36
37
  const pluginForCompiler = new WeakMap();
37
38
  /**
@@ -210,6 +211,9 @@ class LocalizationPlugin {
210
211
  const localizedEntryPointNames = [];
211
212
  const localizedChunkNames = [];
212
213
  for (const chunk of chunks) {
214
+ if (!(0, chunkUtilities_1.chunkIsJs)(chunk, chunkGraph)) {
215
+ continue;
216
+ }
213
217
  const isLocalized = _chunkHasLocalizedModules(chunkGraph, chunk, runtimeLocaleExpression);
214
218
  const template = chunk.filenameTemplate ||
215
219
  (chunk.hasRuntime() ? outputOptions.filename : outputOptions.chunkFilename);
@@ -1 +1 @@
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.\n// See LICENSE in the project root for license information.\n\nimport * as path from 'path';\n\nimport type {\n Asset,\n Chunk,\n ChunkGraph,\n Compilation,\n Compiler,\n LoaderContext,\n Module,\n runtime,\n WebpackError,\n WebpackPluginInstance\n} from 'webpack';\n\nimport { getPseudolocalizer, type ILocalizationFile, parseResJson } from '@rushstack/localization-utilities';\n\nimport * as Constants from './utilities/Constants';\nimport type {\n ILocalizationPluginOptions,\n ILocalizationStats,\n ILocaleFileData,\n ILocaleFileObject,\n IResolvedMissingTranslations\n} from './interfaces';\nimport type { IAssetPathOptions } from './webpackInterfaces';\nimport { markEntity, getMark } from './utilities/EntityMarker';\nimport { processLocalizedAsset, processNonLocalizedAsset } from './AssetProcessor';\nimport { getHashFunction, type HashFn, updateAssetHashes } from './trueHashes';\n\n/**\n * @public\n */\nexport interface IStringPlaceholder {\n /**\n * The literal string that will be injected for later replacement.\n */\n value: string;\n /**\n * The identifier for this particular placeholder, for lookup.\n */\n suffix: string;\n /**\n * The values of this string in each output locale.\n */\n valuesByLocale: Map<string, string>;\n /**\n * The key used to identify the source file containing the string.\n */\n locFilePath: string;\n /**\n * The identifier of the string within its original source file.\n */\n stringName: string;\n}\n\nconst PLUGIN_NAME: 'localization' = 'localization';\n\nconst pluginForCompiler: WeakMap<Compiler, LocalizationPlugin> = new WeakMap();\n\n/**\n * Gets the instance of the LocalizationPlugin bound to the specified webpack compiler.\n * Used by loaders.\n */\nexport function getPluginInstance(compiler: Compiler | undefined): LocalizationPlugin {\n const instance: LocalizationPlugin | undefined = compiler && pluginForCompiler.get(compiler);\n if (!instance) {\n throw new Error(`Could not find a LocalizationPlugin instance for the current webpack compiler!`);\n }\n return instance;\n}\n\n/**\n * This plugin facilitates localization in webpack.\n *\n * @public\n */\nexport class LocalizationPlugin implements WebpackPluginInstance {\n public readonly stringKeys: Map<string, IStringPlaceholder> = new Map();\n\n /**\n * @internal\n */\n public readonly _options: ILocalizationPluginOptions;\n private readonly _resolvedTranslatedStringsFromOptions: Map<\n string,\n Map<string, ILocaleFileObject | string | ReadonlyMap<string, string>>\n > = new Map();\n private _stringPlaceholderCounter: number = 0;\n private readonly _stringPlaceholderMap: Map<string, IStringPlaceholder> = new Map();\n private _passthroughLocaleName!: string;\n private _defaultLocale!: string;\n private _noStringsLocaleName!: string;\n private _fillMissingTranslationStrings!: boolean;\n private _formatLocaleForFilename!: (loc: string) => string;\n private readonly _pseudolocalizers: Map<string, (str: string) => string> = new Map();\n\n /**\n * The outermost map's keys are the locale names.\n * The middle map's keys are the resolved, file names.\n * The innermost map's keys are the string identifiers and its values are the string values.\n */\n private _resolvedLocalizedStrings: Map<string, Map<string, Map<string, string>>> = new Map();\n\n public constructor(options: ILocalizationPluginOptions) {\n this._options = options;\n }\n\n /**\n * Apply this plugin to the specified webpack compiler.\n */\n public apply(compiler: Compiler): void {\n pluginForCompiler.set(compiler, this);\n\n // https://github.com/webpack/webpack-dev-server/pull/1929/files#diff-15fb51940da53816af13330d8ce69b4eR66\n const isWebpackDevServer: boolean = process.env.WEBPACK_DEV_SERVER === 'true';\n\n const { errors, warnings } = this._initializeAndValidateOptions(compiler, isWebpackDevServer);\n\n if (errors.length > 0 || warnings.length > 0) {\n compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation: Compilation) => {\n compilation.errors.push(...errors);\n compilation.warnings.push(...warnings);\n });\n\n if (errors.length > 0) {\n // If there are any errors, just pass through the resources in source and don't do any\n // additional configuration\n return;\n }\n }\n\n const { webpack: thisWebpack } = compiler;\n const {\n WebpackError,\n runtime: { GetChunkFilenameRuntimeModule }\n } = thisWebpack;\n\n // Side-channel for async chunk URL generator chunk, since the actual chunk is completely inaccessible\n // from the assetPath hook below when invoked to build the async URL generator\n let chunkWithAsyncURLGenerator: Chunk | undefined;\n\n const originalGenerate: typeof GetChunkFilenameRuntimeModule.prototype.generate =\n GetChunkFilenameRuntimeModule.prototype.generate;\n GetChunkFilenameRuntimeModule.prototype.generate = function (\n this: runtime.GetChunkFilenameRuntimeModule\n ) {\n // `originalGenerate` will invoke `getAssetPath` to produce the async URL generator\n // Need to know the identity of the containing chunk to correctly produce the asset path expression\n chunkWithAsyncURLGenerator = this.chunk;\n const result: string = originalGenerate.call(this);\n // Unset after the call finishes because we are no longer generating async URL generators\n chunkWithAsyncURLGenerator = undefined;\n return result;\n };\n\n const asyncGeneratorTest: RegExp = /^\\\" \\+/;\n\n const { runtimeLocaleExpression } = this._options;\n\n compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation: Compilation) => {\n let hashFn: HashFn | undefined;\n if (this._options.realContentHash) {\n if (runtimeLocaleExpression) {\n compilation.errors.push(\n new WebpackError(\n `The \"realContentHash\" option cannot be used in conjunction with \"runtimeLocaleExpression\".`\n )\n );\n } else {\n hashFn = getHashFunction({ thisWebpack, compilation });\n }\n } else if (compiler.options.optimization?.realContentHash) {\n compilation.errors.push(\n new thisWebpack.WebpackError(\n `The \\`optimization.realContentHash\\` option is set and the ${LocalizationPlugin.name}'s ` +\n '`realContentHash` option is not set. This will likely produce invalid results. Consider setting the ' +\n `\\`realContentHash\\` option in the ${LocalizationPlugin.name} plugin.`\n )\n );\n }\n\n compilation.hooks.assetPath.tap(\n PLUGIN_NAME,\n (assetPath: string, options: IAssetPathOptions): string => {\n const { chunkGraph } = compilation;\n\n if (\n options.contentHashType === 'javascript' &&\n assetPath.match(Constants.LOCALE_FILENAME_TOKEN_REGEX)\n ) {\n // Does this look like an async chunk URL generator?\n if (typeof options.chunk?.id === 'string' && options.chunk.id.match(asyncGeneratorTest)) {\n const chunkIdsWithStrings: Set<number | string> = new Set<number | string>();\n const chunkIdsWithoutStrings: Set<number | string> = new Set<number | string>();\n\n if (!chunkWithAsyncURLGenerator) {\n compilation.errors.push(\n new WebpackError(`No active chunk while constructing async chunk URL generator!`)\n );\n return assetPath;\n }\n\n const asyncChunks: Set<Chunk> = chunkWithAsyncURLGenerator!.getAllAsyncChunks();\n for (const asyncChunk of asyncChunks) {\n const chunkId: number | string | null = asyncChunk.id;\n\n if (chunkId === null || chunkId === undefined) {\n throw new Error(`Chunk \"${asyncChunk.name}\"'s ID is null or undefined.`);\n }\n\n if (_chunkHasLocalizedModules(chunkGraph, asyncChunk, runtimeLocaleExpression)) {\n chunkIdsWithStrings.add(chunkId);\n } else {\n chunkIdsWithoutStrings.add(chunkId);\n }\n }\n\n return assetPath.replace(Constants.LOCALE_FILENAME_TOKEN_REGEX, () => {\n // Use a replacer function so that we don't need to escape anything in the return value\n\n // If the runtime chunk is itself localized, forcibly match the locale of the runtime chunk\n // Otherwise prefer the runtime expression if specified\n const localeExpression: string =\n (!_chunkHasLocalizedModules(\n chunkGraph,\n chunkWithAsyncURLGenerator!,\n runtimeLocaleExpression\n ) &&\n runtimeLocaleExpression) ||\n Constants.JSONP_PLACEHOLDER;\n\n if (chunkIdsWithStrings.size === 0) {\n return this._formatLocaleForFilename(this._noStringsLocaleName);\n } else if (chunkIdsWithoutStrings.size === 0) {\n return `\" + ${localeExpression} + \"`;\n } else {\n // Generate an object that is used to select between <locale> and <nostrings locale> for each chunk ID\n // Method: pick the smaller set of (localized, non-localized) and map that to 1 (a truthy value)\n // All other IDs map to `undefined` (a falsy value), so we then use the ternary operator to select\n // the appropriate token\n //\n // This can be improved in the future. We can maybe sort the chunks such that the chunks below a certain ID\n // number are localized and the those above are not.\n const chunkMapping: { [chunkId: string]: 1 } = {};\n // Use the map with the fewest values to shorten the expression\n const isLocalizedSmaller: boolean = chunkIdsWithStrings.size <= chunkIdsWithoutStrings.size;\n // These are the ids for which the expression should evaluate to a truthy value\n const smallerSet: Set<number | string> = isLocalizedSmaller\n ? chunkIdsWithStrings\n : chunkIdsWithoutStrings;\n for (const id of smallerSet) {\n chunkMapping[id] = 1;\n }\n\n const noLocaleExpression: string = JSON.stringify(\n this._formatLocaleForFilename(this._noStringsLocaleName)\n );\n\n return `\" + (${JSON.stringify(chunkMapping)}[chunkId]?${\n isLocalizedSmaller ? localeExpression : noLocaleExpression\n }:${isLocalizedSmaller ? noLocaleExpression : localeExpression}) + \"`;\n }\n });\n } else {\n let locale: string | undefined = options.locale;\n if (!locale) {\n const isLocalized: boolean = _chunkHasLocalizedModules(\n chunkGraph,\n options.chunk as Chunk,\n runtimeLocaleExpression\n );\n // Ensure that the initial name maps to a file that should exist in the final output\n locale = isLocalized ? this._defaultLocale : this._noStringsLocaleName;\n }\n return assetPath.replace(\n Constants.LOCALE_FILENAME_TOKEN_REGEX,\n this._formatLocaleForFilename(locale)\n );\n }\n } else {\n return assetPath;\n }\n }\n );\n\n const { outputOptions } = compilation;\n\n // For compatibility with minifiers, need to generate the additional assets after the optimize process runs\n compilation.hooks.processAssets.tapPromise(\n {\n name: PLUGIN_NAME,\n // Generating derived assets, but explicitly want to create them *after* asset optimization\n stage: compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_SUMMARIZE - 1\n },\n async (): Promise<void> => {\n const locales: Set<string> = new Set(this._resolvedLocalizedStrings.keys());\n\n const { chunkGraph, chunks } = compilation;\n const { localizationStats: statsOptions } = this._options;\n\n const filesByChunkName: Map<string, Record<string, string>> | undefined = statsOptions\n ? new Map()\n : undefined;\n const localizedEntryPointNames: string[] = [];\n const localizedChunkNames: string[] = [];\n\n for (const chunk of chunks) {\n const isLocalized: boolean = _chunkHasLocalizedModules(\n chunkGraph,\n chunk,\n runtimeLocaleExpression\n );\n\n const template: Parameters<typeof Compilation.prototype.getAssetPath>[0] =\n chunk.filenameTemplate ||\n (chunk.hasRuntime() ? outputOptions.filename : outputOptions.chunkFilename)!;\n\n const defaultAssetName: string = compilation.getPath(template, {\n chunk,\n contentHashType: 'javascript'\n // Without locale this should return the name of the default asset\n });\n\n const asset: Asset | undefined = compilation.getAsset(defaultAssetName);\n if (!asset) {\n compilation.errors.push(new WebpackError(`Missing expected chunk asset ${defaultAssetName}`));\n continue;\n }\n\n if (isLocalized) {\n const localizedAssets: Record<string, string> = processLocalizedAsset({\n // Global values\n plugin: this,\n compilation,\n locales,\n defaultLocale: this._defaultLocale,\n fillMissingTranslationStrings: this._fillMissingTranslationStrings,\n formatLocaleForFilenameFn: this._formatLocaleForFilename,\n // Chunk-specific values\n chunk,\n asset,\n filenameTemplate: template\n });\n\n if (filesByChunkName && chunk.name) {\n filesByChunkName.set(chunk.name, localizedAssets);\n (chunk.hasRuntime() ? localizedEntryPointNames : localizedChunkNames).push(chunk.name);\n }\n } else {\n processNonLocalizedAsset({\n // Global values\n plugin: this,\n compilation,\n noStringsLocaleName: this._noStringsLocaleName,\n formatLocaleForFilenameFn: this._formatLocaleForFilename,\n // Chunk-specific values\n chunk,\n asset,\n fileName: defaultAssetName\n });\n }\n }\n\n if (hashFn) {\n updateAssetHashes({\n thisWebpack,\n compilation,\n hashFn,\n filesByChunkName\n });\n }\n\n // Since the stats generation doesn't depend on content, do it immediately\n if (statsOptions && filesByChunkName) {\n const localizationStats: ILocalizationStats = {\n entrypoints: {},\n namedChunkGroups: {}\n };\n\n // Sort in lexicographic order to ensure stable output\n localizedChunkNames.sort();\n for (const chunkName of localizedChunkNames) {\n localizationStats.namedChunkGroups[chunkName] = {\n localizedAssets: filesByChunkName.get(chunkName)!\n };\n }\n\n // Sort in lexicographic order to ensure stable output\n localizedEntryPointNames.sort();\n for (const chunkName of localizedEntryPointNames) {\n localizationStats.entrypoints[chunkName] = {\n localizedAssets: filesByChunkName.get(chunkName)!\n };\n }\n\n const { dropPath, callback } = statsOptions;\n\n if (dropPath) {\n compilation.emitAsset(\n dropPath,\n new compiler.webpack.sources.RawSource(JSON.stringify(localizationStats))\n );\n }\n\n if (callback) {\n try {\n callback(localizationStats);\n } catch (e) {\n /* swallow errors from the callback */\n }\n }\n }\n }\n );\n });\n }\n\n /**\n * @public\n *\n * @returns An object mapping the string keys to placeholders\n */\n public async addDefaultLocFileAsync(\n context: LoaderContext<{}>,\n localizedFileKey: string,\n localizedResourceData: ILocalizationFile\n ): Promise<Record<string, string>> {\n const locFileData: ReadonlyMap<string, string> = convertLocalizationFileToLocData(localizedResourceData);\n const resultObject: Record<string, string> = this._addLocFileAndGetPlaceholders(\n this._defaultLocale,\n localizedFileKey,\n locFileData\n );\n\n const missingLocales: string[] = [];\n for (const [translatedLocaleName, translatedStrings] of this._resolvedTranslatedStringsFromOptions) {\n const translatedLocFileFromOptions: ILocaleFileData | undefined =\n translatedStrings.get(localizedFileKey);\n\n if (!translatedLocFileFromOptions) {\n missingLocales.push(translatedLocaleName);\n } else {\n const translatedLocFileData: ReadonlyMap<string, string> = await normalizeLocalizedData(\n context,\n translatedLocFileFromOptions\n );\n this._addTranslations(translatedLocaleName, localizedFileKey, translatedLocFileData);\n }\n }\n\n const { resolveMissingTranslatedStrings } = this._options.localizedData;\n\n if (missingLocales.length > 0 && resolveMissingTranslatedStrings) {\n let resolvedTranslatedData: IResolvedMissingTranslations | undefined = undefined;\n try {\n resolvedTranslatedData = await resolveMissingTranslatedStrings(\n missingLocales,\n localizedFileKey,\n context\n );\n } catch (e) {\n context.emitError(e);\n }\n\n if (resolvedTranslatedData) {\n const iterable: Iterable<[string, ILocaleFileData]> =\n resolvedTranslatedData instanceof Map\n ? resolvedTranslatedData.entries()\n : Object.entries(resolvedTranslatedData);\n for (const [resolvedLocaleName, resolvedLocaleData] of iterable) {\n if (resolvedLocaleData) {\n const translatedLocFileData: ReadonlyMap<string, string> = await normalizeLocalizedData(\n context,\n resolvedLocaleData\n );\n this._addTranslations(resolvedLocaleName, localizedFileKey, translatedLocFileData);\n }\n }\n }\n }\n\n for (const [pseudolocaleName, pseudolocalizer] of this._pseudolocalizers) {\n const pseudolocFileData: Map<string, string> = new Map();\n\n for (const [stringName, stringValue] of locFileData) {\n pseudolocFileData.set(stringName, pseudolocalizer(stringValue));\n }\n\n this._addTranslations(pseudolocaleName, localizedFileKey, pseudolocFileData);\n }\n\n markEntity(context._module!, true);\n\n return resultObject;\n }\n\n /**\n * @public\n */\n public getPlaceholder(localizedFileKey: string, stringName: string): IStringPlaceholder | undefined {\n const stringKey: string = `${localizedFileKey}?${stringName}`;\n return this.stringKeys.get(stringKey);\n }\n\n /**\n * @internal\n */\n public getDataForSerialNumber(serialNumber: string): IStringPlaceholder | undefined {\n return this._stringPlaceholderMap.get(serialNumber);\n }\n\n private _addLocFileAndGetPlaceholders(\n localeName: string,\n localizedFileKey: string,\n localizedFileData: ReadonlyMap<string, string>\n ): Record<string, string> {\n const filesMap: Map<string, ReadonlyMap<string, string>> = this._resolvedLocalizedStrings.get(\n localeName\n )!;\n\n filesMap.set(localizedFileKey, localizedFileData);\n\n const resultObject: Record<string, string> = {};\n for (const [stringName, stringValue] of localizedFileData) {\n const stringKey: string = `${localizedFileKey}?${stringName}`;\n let placeholder: IStringPlaceholder | undefined = this.stringKeys.get(stringKey);\n if (!placeholder) {\n // TODO: This may need to be a deterministic identifier to support watch / incremental compilation\n const suffix: string = `${this._stringPlaceholderCounter++}`;\n\n const values: Map<string, string> = new Map();\n values.set(this._passthroughLocaleName, stringName);\n\n placeholder = {\n value: `${Constants.STRING_PLACEHOLDER_PREFIX}_\\\\_${Constants.STRING_PLACEHOLDER_LABEL}_${suffix}`,\n suffix,\n valuesByLocale: values,\n locFilePath: localizedFileKey,\n stringName\n };\n\n this.stringKeys.set(stringKey, placeholder);\n this._stringPlaceholderMap.set(suffix, placeholder);\n }\n\n resultObject[stringName] = placeholder.value;\n\n placeholder.valuesByLocale.set(localeName, stringValue);\n }\n\n return resultObject;\n }\n\n private _addTranslations(\n localeName: string,\n localizedFileKey: string,\n localizedFileData: ReadonlyMap<string, string>\n ): void {\n for (const [stringName, stringValue] of localizedFileData) {\n const stringKey: string = `${localizedFileKey}?${stringName}`;\n const placeholder: IStringPlaceholder | undefined = this.stringKeys.get(stringKey);\n if (placeholder) {\n placeholder.valuesByLocale.set(localeName, stringValue);\n }\n }\n }\n\n private _initializeAndValidateOptions(\n compiler: Compiler,\n isWebpackDevServer: boolean\n ): { errors: WebpackError[]; warnings: WebpackError[] } {\n const errors: WebpackError[] = [];\n const warnings: WebpackError[] = [];\n\n const { WebpackError } = compiler.webpack;\n const { options: configuration } = compiler;\n\n const LOCALE_NAME_REGEX: RegExp = /[a-z-]/i;\n function ensureValidLocaleName(localeName: string): boolean {\n if (!localeName.match(LOCALE_NAME_REGEX)) {\n errors.push(\n new WebpackError(\n `Invalid locale name: ${localeName}. Locale names may only contain letters and hyphens.`\n )\n );\n return false;\n } else {\n return true;\n }\n }\n\n // START configuration\n if (\n !configuration.output ||\n !configuration.output.filename ||\n typeof configuration.output.filename !== 'string' ||\n configuration.output.filename.indexOf(Constants.LOCALE_FILENAME_TOKEN) === -1\n ) {\n errors.push(\n new WebpackError(\n 'The configuration.output.filename property must be provided, must be a string, and must include ' +\n `the ${Constants.LOCALE_FILENAME_TOKEN} placeholder`\n )\n );\n }\n // END configuration\n\n // START misc options\n // START options.localizedData\n const { localizedData } = this._options;\n if (localizedData) {\n // START options.localizedData.passthroughLocale\n const { passthroughLocale } = localizedData;\n if (passthroughLocale) {\n const { usePassthroughLocale, passthroughLocaleName = 'passthrough' } = passthroughLocale;\n if (usePassthroughLocale) {\n this._passthroughLocaleName = passthroughLocaleName;\n this._resolvedLocalizedStrings.set(passthroughLocaleName, new Map());\n }\n }\n // END options.localizedData.passthroughLocale\n\n // START options.localizedData.translatedStrings\n const resolveRelativeToContext: (relative: string) => string = (\n configuration.context?.startsWith('/') ? path.posix.resolve : path.resolve\n ).bind(0, configuration.context!);\n const { translatedStrings } = localizedData;\n this._resolvedTranslatedStringsFromOptions.clear();\n if (translatedStrings) {\n for (const [localeName, locale] of Object.entries(translatedStrings)) {\n if (this._resolvedLocalizedStrings.has(localeName)) {\n errors.push(\n new WebpackError(\n `The locale \"${localeName}\" appears multiple times. ` +\n 'There may be multiple instances with different casing.'\n )\n );\n return { errors, warnings };\n }\n\n if (!ensureValidLocaleName(localeName)) {\n return { errors, warnings };\n }\n\n this._resolvedLocalizedStrings.set(localeName, new Map());\n const resolvedFromOptionsForLocale: Map<string, ILocaleFileData> = new Map();\n this._resolvedTranslatedStringsFromOptions.set(localeName, resolvedFromOptionsForLocale);\n\n for (const [locFilePath, locFileDataFromOptions] of Object.entries(locale)) {\n const normalizedLocFilePath: string = resolveRelativeToContext(locFilePath);\n\n if (resolvedFromOptionsForLocale.has(normalizedLocFilePath)) {\n errors.push(\n new WebpackError(\n `The localization file path \"${locFilePath}\" appears multiple times in locale ${localeName}. ` +\n 'There may be multiple instances with different casing.'\n )\n );\n return { errors, warnings };\n }\n\n const normalizedLocFileDataFromOptions: ILocaleFileData =\n typeof locFileDataFromOptions === 'string'\n ? resolveRelativeToContext(locFileDataFromOptions)\n : locFileDataFromOptions;\n\n resolvedFromOptionsForLocale.set(normalizedLocFilePath, normalizedLocFileDataFromOptions);\n }\n }\n }\n // END options.localizedData.translatedStrings\n\n // START options.localizedData.defaultLocale\n const { defaultLocale } = localizedData;\n if (defaultLocale) {\n const { localeName, fillMissingTranslationStrings } = defaultLocale;\n if (localeName) {\n if (this._resolvedLocalizedStrings.has(localeName)) {\n errors.push(new WebpackError('The default locale is also specified in the translated strings.'));\n return { errors, warnings };\n } else if (!ensureValidLocaleName(localeName)) {\n return { errors, warnings };\n }\n\n this._resolvedLocalizedStrings.set(localeName, new Map());\n this._defaultLocale = localeName;\n this._fillMissingTranslationStrings = !!fillMissingTranslationStrings;\n } else {\n errors.push(new WebpackError('Missing default locale name'));\n return { errors, warnings };\n }\n } else {\n errors.push(new WebpackError('Missing default locale options.'));\n return { errors, warnings };\n }\n // END options.localizedData.defaultLocale\n\n // START options.localizedData.pseudoLocales\n const { pseudolocales } = localizedData;\n if (pseudolocales) {\n for (const [pseudolocaleName, pseudoLocaleOpts] of Object.entries(pseudolocales)) {\n if (this._defaultLocale === pseudolocaleName) {\n errors.push(\n new WebpackError(`A pseudolocale (${pseudolocaleName}) name is also the default locale name.`)\n );\n return { errors, warnings };\n }\n\n if (this._resolvedLocalizedStrings.has(pseudolocaleName)) {\n errors.push(\n new WebpackError(\n `A pseudolocale (${pseudolocaleName}) name is also specified in the translated strings.`\n )\n );\n return { errors, warnings };\n }\n\n this._pseudolocalizers.set(pseudolocaleName, getPseudolocalizer(pseudoLocaleOpts));\n this._resolvedLocalizedStrings.set(pseudolocaleName, new Map<string, Map<string, string>>());\n }\n }\n // END options.localizedData.pseudoLocales\n } else if (!isWebpackDevServer) {\n throw new Error('Localized data must be provided unless webpack dev server is running.');\n }\n // END options.localizedData\n\n // START options.noStringsLocaleName\n const { noStringsLocaleName } = this._options;\n if (\n noStringsLocaleName === undefined ||\n noStringsLocaleName === null ||\n !ensureValidLocaleName(noStringsLocaleName)\n ) {\n this._noStringsLocaleName = 'none';\n } else {\n this._noStringsLocaleName = noStringsLocaleName;\n }\n // END options.noStringsLocaleName\n\n // START options.formatLocaleForFilename\n const { formatLocaleForFilename = (localeName: string) => localeName } = this._options;\n this._formatLocaleForFilename = formatLocaleForFilename;\n // END options.formatLocaleForFilename\n return { errors, warnings };\n }\n}\n\nfunction _chunkHasLocalizedModules(\n chunkGraph: ChunkGraph,\n chunk: Chunk,\n runtimeLocaleExpression: string | undefined\n): boolean {\n let chunkHasAnyLocModules: boolean | undefined = getMark(chunk);\n if (chunkHasAnyLocModules === undefined) {\n chunkHasAnyLocModules = false;\n const candidateModules: Iterable<Module> | undefined = chunkGraph.getChunkModulesIterableBySourceType(\n chunk,\n 'javascript'\n );\n if (candidateModules) {\n outer: for (const module of candidateModules) {\n const moduleMark: boolean | undefined = getMark(module);\n if (moduleMark) {\n chunkHasAnyLocModules = true;\n break;\n } else if (moduleMark === false) {\n continue;\n }\n\n // Is this a concatenated module?\n const { _modules: modules } = module as { _modules?: Iterable<Module> };\n if (modules) {\n for (const nestedModule of modules) {\n if (getMark(nestedModule)) {\n markEntity(module, true);\n chunkHasAnyLocModules = true;\n break outer;\n }\n }\n markEntity(module, false);\n }\n }\n }\n\n // If this chunk doesn't directly contain any localized resources, it still\n // needs to be localized if it's an entrypoint chunk (i.e. - it has a runtime)\n // and it loads localized async chunks.\n // In that case, the generated chunk URL generation code needs to contain\n // the locale name.\n if (!chunkHasAnyLocModules && !runtimeLocaleExpression && chunk.hasRuntime()) {\n for (const asyncChunk of chunk.getAllAsyncChunks()) {\n if (_chunkHasLocalizedModules(chunkGraph, asyncChunk, runtimeLocaleExpression)) {\n chunkHasAnyLocModules = true;\n break;\n }\n }\n }\n\n markEntity(chunk, chunkHasAnyLocModules);\n }\n\n return chunkHasAnyLocModules;\n}\n\nfunction convertLocalizationFileToLocData(locFile: ILocalizationFile): ReadonlyMap<string, string> {\n const locFileData: Map<string, string> = new Map();\n for (const [stringName, locFileEntry] of Object.entries(locFile)) {\n locFileData.set(stringName, locFileEntry.value);\n }\n\n return locFileData;\n}\n\nasync function normalizeLocalizedData(\n context: LoaderContext<{}>,\n localizedData: ILocaleFileData\n): Promise<ReadonlyMap<string, string>> {\n if (typeof localizedData === 'string') {\n // The value is the path to a file. Add it as a file dependency\n context.addDependency(localizedData);\n const content: string = await new Promise((resolve, reject) => {\n // Use context.fs so that the plugin is compatible with overriding compiler.inputFileSystem\n context.fs.readFile(localizedData, (err, data) => {\n if (err) {\n return reject(err);\n } else if (!data) {\n return reject(new Error(`No data in ${localizedData}`));\n }\n resolve(data.toString());\n });\n });\n\n const localizationFile: ILocalizationFile = parseResJson({\n filePath: localizedData,\n content\n });\n\n return convertLocalizationFileToLocData(localizationFile);\n } else {\n return localizedData instanceof Map ? localizedData : new Map(Object.entries(localizedData));\n }\n}\n"]}
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.\n// See LICENSE in the project root for license information.\n\nimport * as path from 'path';\n\nimport type {\n Asset,\n Chunk,\n ChunkGraph,\n Compilation,\n Compiler,\n LoaderContext,\n Module,\n runtime,\n WebpackError,\n WebpackPluginInstance\n} from 'webpack';\n\nimport { getPseudolocalizer, type ILocalizationFile, parseResJson } from '@rushstack/localization-utilities';\n\nimport * as Constants from './utilities/Constants';\nimport type {\n ILocalizationPluginOptions,\n ILocalizationStats,\n ILocaleFileData,\n ILocaleFileObject,\n IResolvedMissingTranslations\n} from './interfaces';\nimport type { IAssetPathOptions } from './webpackInterfaces';\nimport { markEntity, getMark } from './utilities/EntityMarker';\nimport { processLocalizedAsset, processNonLocalizedAsset } from './AssetProcessor';\nimport { getHashFunction, type HashFn, updateAssetHashes } from './trueHashes';\nimport { chunkIsJs } from './utilities/chunkUtilities';\n\n/**\n * @public\n */\nexport interface IStringPlaceholder {\n /**\n * The literal string that will be injected for later replacement.\n */\n value: string;\n /**\n * The identifier for this particular placeholder, for lookup.\n */\n suffix: string;\n /**\n * The values of this string in each output locale.\n */\n valuesByLocale: Map<string, string>;\n /**\n * The key used to identify the source file containing the string.\n */\n locFilePath: string;\n /**\n * The identifier of the string within its original source file.\n */\n stringName: string;\n}\n\nconst PLUGIN_NAME: 'localization' = 'localization';\n\nconst pluginForCompiler: WeakMap<Compiler, LocalizationPlugin> = new WeakMap();\n\n/**\n * Gets the instance of the LocalizationPlugin bound to the specified webpack compiler.\n * Used by loaders.\n */\nexport function getPluginInstance(compiler: Compiler | undefined): LocalizationPlugin {\n const instance: LocalizationPlugin | undefined = compiler && pluginForCompiler.get(compiler);\n if (!instance) {\n throw new Error(`Could not find a LocalizationPlugin instance for the current webpack compiler!`);\n }\n return instance;\n}\n\n/**\n * This plugin facilitates localization in webpack.\n *\n * @public\n */\nexport class LocalizationPlugin implements WebpackPluginInstance {\n public readonly stringKeys: Map<string, IStringPlaceholder> = new Map();\n\n /**\n * @internal\n */\n public readonly _options: ILocalizationPluginOptions;\n private readonly _resolvedTranslatedStringsFromOptions: Map<\n string,\n Map<string, ILocaleFileObject | string | ReadonlyMap<string, string>>\n > = new Map();\n private _stringPlaceholderCounter: number = 0;\n private readonly _stringPlaceholderMap: Map<string, IStringPlaceholder> = new Map();\n private _passthroughLocaleName!: string;\n private _defaultLocale!: string;\n private _noStringsLocaleName!: string;\n private _fillMissingTranslationStrings!: boolean;\n private _formatLocaleForFilename!: (loc: string) => string;\n private readonly _pseudolocalizers: Map<string, (str: string) => string> = new Map();\n\n /**\n * The outermost map's keys are the locale names.\n * The middle map's keys are the resolved, file names.\n * The innermost map's keys are the string identifiers and its values are the string values.\n */\n private _resolvedLocalizedStrings: Map<string, Map<string, Map<string, string>>> = new Map();\n\n public constructor(options: ILocalizationPluginOptions) {\n this._options = options;\n }\n\n /**\n * Apply this plugin to the specified webpack compiler.\n */\n public apply(compiler: Compiler): void {\n pluginForCompiler.set(compiler, this);\n\n // https://github.com/webpack/webpack-dev-server/pull/1929/files#diff-15fb51940da53816af13330d8ce69b4eR66\n const isWebpackDevServer: boolean = process.env.WEBPACK_DEV_SERVER === 'true';\n\n const { errors, warnings } = this._initializeAndValidateOptions(compiler, isWebpackDevServer);\n\n if (errors.length > 0 || warnings.length > 0) {\n compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation: Compilation) => {\n compilation.errors.push(...errors);\n compilation.warnings.push(...warnings);\n });\n\n if (errors.length > 0) {\n // If there are any errors, just pass through the resources in source and don't do any\n // additional configuration\n return;\n }\n }\n\n const { webpack: thisWebpack } = compiler;\n const {\n WebpackError,\n runtime: { GetChunkFilenameRuntimeModule }\n } = thisWebpack;\n\n // Side-channel for async chunk URL generator chunk, since the actual chunk is completely inaccessible\n // from the assetPath hook below when invoked to build the async URL generator\n let chunkWithAsyncURLGenerator: Chunk | undefined;\n\n const originalGenerate: typeof GetChunkFilenameRuntimeModule.prototype.generate =\n GetChunkFilenameRuntimeModule.prototype.generate;\n GetChunkFilenameRuntimeModule.prototype.generate = function (\n this: runtime.GetChunkFilenameRuntimeModule\n ) {\n // `originalGenerate` will invoke `getAssetPath` to produce the async URL generator\n // Need to know the identity of the containing chunk to correctly produce the asset path expression\n chunkWithAsyncURLGenerator = this.chunk;\n const result: string = originalGenerate.call(this);\n // Unset after the call finishes because we are no longer generating async URL generators\n chunkWithAsyncURLGenerator = undefined;\n return result;\n };\n\n const asyncGeneratorTest: RegExp = /^\\\" \\+/;\n\n const { runtimeLocaleExpression } = this._options;\n\n compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation: Compilation) => {\n let hashFn: HashFn | undefined;\n if (this._options.realContentHash) {\n if (runtimeLocaleExpression) {\n compilation.errors.push(\n new WebpackError(\n `The \"realContentHash\" option cannot be used in conjunction with \"runtimeLocaleExpression\".`\n )\n );\n } else {\n hashFn = getHashFunction({ thisWebpack, compilation });\n }\n } else if (compiler.options.optimization?.realContentHash) {\n compilation.errors.push(\n new thisWebpack.WebpackError(\n `The \\`optimization.realContentHash\\` option is set and the ${LocalizationPlugin.name}'s ` +\n '`realContentHash` option is not set. This will likely produce invalid results. Consider setting the ' +\n `\\`realContentHash\\` option in the ${LocalizationPlugin.name} plugin.`\n )\n );\n }\n\n compilation.hooks.assetPath.tap(\n PLUGIN_NAME,\n (assetPath: string, options: IAssetPathOptions): string => {\n const { chunkGraph } = compilation;\n\n if (\n options.contentHashType === 'javascript' &&\n assetPath.match(Constants.LOCALE_FILENAME_TOKEN_REGEX)\n ) {\n // Does this look like an async chunk URL generator?\n if (typeof options.chunk?.id === 'string' && options.chunk.id.match(asyncGeneratorTest)) {\n const chunkIdsWithStrings: Set<number | string> = new Set<number | string>();\n const chunkIdsWithoutStrings: Set<number | string> = new Set<number | string>();\n\n if (!chunkWithAsyncURLGenerator) {\n compilation.errors.push(\n new WebpackError(`No active chunk while constructing async chunk URL generator!`)\n );\n return assetPath;\n }\n\n const asyncChunks: Set<Chunk> = chunkWithAsyncURLGenerator!.getAllAsyncChunks();\n for (const asyncChunk of asyncChunks) {\n const chunkId: number | string | null = asyncChunk.id;\n\n if (chunkId === null || chunkId === undefined) {\n throw new Error(`Chunk \"${asyncChunk.name}\"'s ID is null or undefined.`);\n }\n\n if (_chunkHasLocalizedModules(chunkGraph, asyncChunk, runtimeLocaleExpression)) {\n chunkIdsWithStrings.add(chunkId);\n } else {\n chunkIdsWithoutStrings.add(chunkId);\n }\n }\n\n return assetPath.replace(Constants.LOCALE_FILENAME_TOKEN_REGEX, () => {\n // Use a replacer function so that we don't need to escape anything in the return value\n\n // If the runtime chunk is itself localized, forcibly match the locale of the runtime chunk\n // Otherwise prefer the runtime expression if specified\n const localeExpression: string =\n (!_chunkHasLocalizedModules(\n chunkGraph,\n chunkWithAsyncURLGenerator!,\n runtimeLocaleExpression\n ) &&\n runtimeLocaleExpression) ||\n Constants.JSONP_PLACEHOLDER;\n\n if (chunkIdsWithStrings.size === 0) {\n return this._formatLocaleForFilename(this._noStringsLocaleName);\n } else if (chunkIdsWithoutStrings.size === 0) {\n return `\" + ${localeExpression} + \"`;\n } else {\n // Generate an object that is used to select between <locale> and <nostrings locale> for each chunk ID\n // Method: pick the smaller set of (localized, non-localized) and map that to 1 (a truthy value)\n // All other IDs map to `undefined` (a falsy value), so we then use the ternary operator to select\n // the appropriate token\n //\n // This can be improved in the future. We can maybe sort the chunks such that the chunks below a certain ID\n // number are localized and the those above are not.\n const chunkMapping: { [chunkId: string]: 1 } = {};\n // Use the map with the fewest values to shorten the expression\n const isLocalizedSmaller: boolean = chunkIdsWithStrings.size <= chunkIdsWithoutStrings.size;\n // These are the ids for which the expression should evaluate to a truthy value\n const smallerSet: Set<number | string> = isLocalizedSmaller\n ? chunkIdsWithStrings\n : chunkIdsWithoutStrings;\n for (const id of smallerSet) {\n chunkMapping[id] = 1;\n }\n\n const noLocaleExpression: string = JSON.stringify(\n this._formatLocaleForFilename(this._noStringsLocaleName)\n );\n\n return `\" + (${JSON.stringify(chunkMapping)}[chunkId]?${\n isLocalizedSmaller ? localeExpression : noLocaleExpression\n }:${isLocalizedSmaller ? noLocaleExpression : localeExpression}) + \"`;\n }\n });\n } else {\n let locale: string | undefined = options.locale;\n if (!locale) {\n const isLocalized: boolean = _chunkHasLocalizedModules(\n chunkGraph,\n options.chunk as Chunk,\n runtimeLocaleExpression\n );\n // Ensure that the initial name maps to a file that should exist in the final output\n locale = isLocalized ? this._defaultLocale : this._noStringsLocaleName;\n }\n return assetPath.replace(\n Constants.LOCALE_FILENAME_TOKEN_REGEX,\n this._formatLocaleForFilename(locale)\n );\n }\n } else {\n return assetPath;\n }\n }\n );\n\n const { outputOptions } = compilation;\n\n // For compatibility with minifiers, need to generate the additional assets after the optimize process runs\n compilation.hooks.processAssets.tapPromise(\n {\n name: PLUGIN_NAME,\n // Generating derived assets, but explicitly want to create them *after* asset optimization\n stage: compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_SUMMARIZE - 1\n },\n async (): Promise<void> => {\n const locales: Set<string> = new Set(this._resolvedLocalizedStrings.keys());\n\n const { chunkGraph, chunks } = compilation;\n const { localizationStats: statsOptions } = this._options;\n\n const filesByChunkName: Map<string, Record<string, string>> | undefined = statsOptions\n ? new Map()\n : undefined;\n const localizedEntryPointNames: string[] = [];\n const localizedChunkNames: string[] = [];\n\n for (const chunk of chunks) {\n if (!chunkIsJs(chunk, chunkGraph)) {\n continue;\n }\n\n const isLocalized: boolean = _chunkHasLocalizedModules(\n chunkGraph,\n chunk,\n runtimeLocaleExpression\n );\n\n const template: Parameters<typeof Compilation.prototype.getAssetPath>[0] =\n chunk.filenameTemplate ||\n (chunk.hasRuntime() ? outputOptions.filename : outputOptions.chunkFilename)!;\n\n const defaultAssetName: string = compilation.getPath(template, {\n chunk,\n contentHashType: 'javascript'\n // Without locale this should return the name of the default asset\n });\n\n const asset: Asset | undefined = compilation.getAsset(defaultAssetName);\n if (!asset) {\n compilation.errors.push(new WebpackError(`Missing expected chunk asset ${defaultAssetName}`));\n continue;\n }\n\n if (isLocalized) {\n const localizedAssets: Record<string, string> = processLocalizedAsset({\n // Global values\n plugin: this,\n compilation,\n locales,\n defaultLocale: this._defaultLocale,\n fillMissingTranslationStrings: this._fillMissingTranslationStrings,\n formatLocaleForFilenameFn: this._formatLocaleForFilename,\n // Chunk-specific values\n chunk,\n asset,\n filenameTemplate: template\n });\n\n if (filesByChunkName && chunk.name) {\n filesByChunkName.set(chunk.name, localizedAssets);\n (chunk.hasRuntime() ? localizedEntryPointNames : localizedChunkNames).push(chunk.name);\n }\n } else {\n processNonLocalizedAsset({\n // Global values\n plugin: this,\n compilation,\n noStringsLocaleName: this._noStringsLocaleName,\n formatLocaleForFilenameFn: this._formatLocaleForFilename,\n // Chunk-specific values\n chunk,\n asset,\n fileName: defaultAssetName\n });\n }\n }\n\n if (hashFn) {\n updateAssetHashes({\n thisWebpack,\n compilation,\n hashFn,\n filesByChunkName\n });\n }\n\n // Since the stats generation doesn't depend on content, do it immediately\n if (statsOptions && filesByChunkName) {\n const localizationStats: ILocalizationStats = {\n entrypoints: {},\n namedChunkGroups: {}\n };\n\n // Sort in lexicographic order to ensure stable output\n localizedChunkNames.sort();\n for (const chunkName of localizedChunkNames) {\n localizationStats.namedChunkGroups[chunkName] = {\n localizedAssets: filesByChunkName.get(chunkName)!\n };\n }\n\n // Sort in lexicographic order to ensure stable output\n localizedEntryPointNames.sort();\n for (const chunkName of localizedEntryPointNames) {\n localizationStats.entrypoints[chunkName] = {\n localizedAssets: filesByChunkName.get(chunkName)!\n };\n }\n\n const { dropPath, callback } = statsOptions;\n\n if (dropPath) {\n compilation.emitAsset(\n dropPath,\n new compiler.webpack.sources.RawSource(JSON.stringify(localizationStats))\n );\n }\n\n if (callback) {\n try {\n callback(localizationStats);\n } catch (e) {\n /* swallow errors from the callback */\n }\n }\n }\n }\n );\n });\n }\n\n /**\n * @public\n *\n * @returns An object mapping the string keys to placeholders\n */\n public async addDefaultLocFileAsync(\n context: LoaderContext<{}>,\n localizedFileKey: string,\n localizedResourceData: ILocalizationFile\n ): Promise<Record<string, string>> {\n const locFileData: ReadonlyMap<string, string> = convertLocalizationFileToLocData(localizedResourceData);\n const resultObject: Record<string, string> = this._addLocFileAndGetPlaceholders(\n this._defaultLocale,\n localizedFileKey,\n locFileData\n );\n\n const missingLocales: string[] = [];\n for (const [translatedLocaleName, translatedStrings] of this._resolvedTranslatedStringsFromOptions) {\n const translatedLocFileFromOptions: ILocaleFileData | undefined =\n translatedStrings.get(localizedFileKey);\n\n if (!translatedLocFileFromOptions) {\n missingLocales.push(translatedLocaleName);\n } else {\n const translatedLocFileData: ReadonlyMap<string, string> = await normalizeLocalizedData(\n context,\n translatedLocFileFromOptions\n );\n this._addTranslations(translatedLocaleName, localizedFileKey, translatedLocFileData);\n }\n }\n\n const { resolveMissingTranslatedStrings } = this._options.localizedData;\n\n if (missingLocales.length > 0 && resolveMissingTranslatedStrings) {\n let resolvedTranslatedData: IResolvedMissingTranslations | undefined = undefined;\n try {\n resolvedTranslatedData = await resolveMissingTranslatedStrings(\n missingLocales,\n localizedFileKey,\n context\n );\n } catch (e) {\n context.emitError(e);\n }\n\n if (resolvedTranslatedData) {\n const iterable: Iterable<[string, ILocaleFileData]> =\n resolvedTranslatedData instanceof Map\n ? resolvedTranslatedData.entries()\n : Object.entries(resolvedTranslatedData);\n for (const [resolvedLocaleName, resolvedLocaleData] of iterable) {\n if (resolvedLocaleData) {\n const translatedLocFileData: ReadonlyMap<string, string> = await normalizeLocalizedData(\n context,\n resolvedLocaleData\n );\n this._addTranslations(resolvedLocaleName, localizedFileKey, translatedLocFileData);\n }\n }\n }\n }\n\n for (const [pseudolocaleName, pseudolocalizer] of this._pseudolocalizers) {\n const pseudolocFileData: Map<string, string> = new Map();\n\n for (const [stringName, stringValue] of locFileData) {\n pseudolocFileData.set(stringName, pseudolocalizer(stringValue));\n }\n\n this._addTranslations(pseudolocaleName, localizedFileKey, pseudolocFileData);\n }\n\n markEntity(context._module!, true);\n\n return resultObject;\n }\n\n /**\n * @public\n */\n public getPlaceholder(localizedFileKey: string, stringName: string): IStringPlaceholder | undefined {\n const stringKey: string = `${localizedFileKey}?${stringName}`;\n return this.stringKeys.get(stringKey);\n }\n\n /**\n * @internal\n */\n public getDataForSerialNumber(serialNumber: string): IStringPlaceholder | undefined {\n return this._stringPlaceholderMap.get(serialNumber);\n }\n\n private _addLocFileAndGetPlaceholders(\n localeName: string,\n localizedFileKey: string,\n localizedFileData: ReadonlyMap<string, string>\n ): Record<string, string> {\n const filesMap: Map<string, ReadonlyMap<string, string>> = this._resolvedLocalizedStrings.get(\n localeName\n )!;\n\n filesMap.set(localizedFileKey, localizedFileData);\n\n const resultObject: Record<string, string> = {};\n for (const [stringName, stringValue] of localizedFileData) {\n const stringKey: string = `${localizedFileKey}?${stringName}`;\n let placeholder: IStringPlaceholder | undefined = this.stringKeys.get(stringKey);\n if (!placeholder) {\n // TODO: This may need to be a deterministic identifier to support watch / incremental compilation\n const suffix: string = `${this._stringPlaceholderCounter++}`;\n\n const values: Map<string, string> = new Map();\n values.set(this._passthroughLocaleName, stringName);\n\n placeholder = {\n value: `${Constants.STRING_PLACEHOLDER_PREFIX}_\\\\_${Constants.STRING_PLACEHOLDER_LABEL}_${suffix}`,\n suffix,\n valuesByLocale: values,\n locFilePath: localizedFileKey,\n stringName\n };\n\n this.stringKeys.set(stringKey, placeholder);\n this._stringPlaceholderMap.set(suffix, placeholder);\n }\n\n resultObject[stringName] = placeholder.value;\n\n placeholder.valuesByLocale.set(localeName, stringValue);\n }\n\n return resultObject;\n }\n\n private _addTranslations(\n localeName: string,\n localizedFileKey: string,\n localizedFileData: ReadonlyMap<string, string>\n ): void {\n for (const [stringName, stringValue] of localizedFileData) {\n const stringKey: string = `${localizedFileKey}?${stringName}`;\n const placeholder: IStringPlaceholder | undefined = this.stringKeys.get(stringKey);\n if (placeholder) {\n placeholder.valuesByLocale.set(localeName, stringValue);\n }\n }\n }\n\n private _initializeAndValidateOptions(\n compiler: Compiler,\n isWebpackDevServer: boolean\n ): { errors: WebpackError[]; warnings: WebpackError[] } {\n const errors: WebpackError[] = [];\n const warnings: WebpackError[] = [];\n\n const { WebpackError } = compiler.webpack;\n const { options: configuration } = compiler;\n\n const LOCALE_NAME_REGEX: RegExp = /[a-z-]/i;\n function ensureValidLocaleName(localeName: string): boolean {\n if (!localeName.match(LOCALE_NAME_REGEX)) {\n errors.push(\n new WebpackError(\n `Invalid locale name: ${localeName}. Locale names may only contain letters and hyphens.`\n )\n );\n return false;\n } else {\n return true;\n }\n }\n\n // START configuration\n if (\n !configuration.output ||\n !configuration.output.filename ||\n typeof configuration.output.filename !== 'string' ||\n configuration.output.filename.indexOf(Constants.LOCALE_FILENAME_TOKEN) === -1\n ) {\n errors.push(\n new WebpackError(\n 'The configuration.output.filename property must be provided, must be a string, and must include ' +\n `the ${Constants.LOCALE_FILENAME_TOKEN} placeholder`\n )\n );\n }\n // END configuration\n\n // START misc options\n // START options.localizedData\n const { localizedData } = this._options;\n if (localizedData) {\n // START options.localizedData.passthroughLocale\n const { passthroughLocale } = localizedData;\n if (passthroughLocale) {\n const { usePassthroughLocale, passthroughLocaleName = 'passthrough' } = passthroughLocale;\n if (usePassthroughLocale) {\n this._passthroughLocaleName = passthroughLocaleName;\n this._resolvedLocalizedStrings.set(passthroughLocaleName, new Map());\n }\n }\n // END options.localizedData.passthroughLocale\n\n // START options.localizedData.translatedStrings\n const resolveRelativeToContext: (relative: string) => string = (\n configuration.context?.startsWith('/') ? path.posix.resolve : path.resolve\n ).bind(0, configuration.context!);\n const { translatedStrings } = localizedData;\n this._resolvedTranslatedStringsFromOptions.clear();\n if (translatedStrings) {\n for (const [localeName, locale] of Object.entries(translatedStrings)) {\n if (this._resolvedLocalizedStrings.has(localeName)) {\n errors.push(\n new WebpackError(\n `The locale \"${localeName}\" appears multiple times. ` +\n 'There may be multiple instances with different casing.'\n )\n );\n return { errors, warnings };\n }\n\n if (!ensureValidLocaleName(localeName)) {\n return { errors, warnings };\n }\n\n this._resolvedLocalizedStrings.set(localeName, new Map());\n const resolvedFromOptionsForLocale: Map<string, ILocaleFileData> = new Map();\n this._resolvedTranslatedStringsFromOptions.set(localeName, resolvedFromOptionsForLocale);\n\n for (const [locFilePath, locFileDataFromOptions] of Object.entries(locale)) {\n const normalizedLocFilePath: string = resolveRelativeToContext(locFilePath);\n\n if (resolvedFromOptionsForLocale.has(normalizedLocFilePath)) {\n errors.push(\n new WebpackError(\n `The localization file path \"${locFilePath}\" appears multiple times in locale ${localeName}. ` +\n 'There may be multiple instances with different casing.'\n )\n );\n return { errors, warnings };\n }\n\n const normalizedLocFileDataFromOptions: ILocaleFileData =\n typeof locFileDataFromOptions === 'string'\n ? resolveRelativeToContext(locFileDataFromOptions)\n : locFileDataFromOptions;\n\n resolvedFromOptionsForLocale.set(normalizedLocFilePath, normalizedLocFileDataFromOptions);\n }\n }\n }\n // END options.localizedData.translatedStrings\n\n // START options.localizedData.defaultLocale\n const { defaultLocale } = localizedData;\n if (defaultLocale) {\n const { localeName, fillMissingTranslationStrings } = defaultLocale;\n if (localeName) {\n if (this._resolvedLocalizedStrings.has(localeName)) {\n errors.push(new WebpackError('The default locale is also specified in the translated strings.'));\n return { errors, warnings };\n } else if (!ensureValidLocaleName(localeName)) {\n return { errors, warnings };\n }\n\n this._resolvedLocalizedStrings.set(localeName, new Map());\n this._defaultLocale = localeName;\n this._fillMissingTranslationStrings = !!fillMissingTranslationStrings;\n } else {\n errors.push(new WebpackError('Missing default locale name'));\n return { errors, warnings };\n }\n } else {\n errors.push(new WebpackError('Missing default locale options.'));\n return { errors, warnings };\n }\n // END options.localizedData.defaultLocale\n\n // START options.localizedData.pseudoLocales\n const { pseudolocales } = localizedData;\n if (pseudolocales) {\n for (const [pseudolocaleName, pseudoLocaleOpts] of Object.entries(pseudolocales)) {\n if (this._defaultLocale === pseudolocaleName) {\n errors.push(\n new WebpackError(`A pseudolocale (${pseudolocaleName}) name is also the default locale name.`)\n );\n return { errors, warnings };\n }\n\n if (this._resolvedLocalizedStrings.has(pseudolocaleName)) {\n errors.push(\n new WebpackError(\n `A pseudolocale (${pseudolocaleName}) name is also specified in the translated strings.`\n )\n );\n return { errors, warnings };\n }\n\n this._pseudolocalizers.set(pseudolocaleName, getPseudolocalizer(pseudoLocaleOpts));\n this._resolvedLocalizedStrings.set(pseudolocaleName, new Map<string, Map<string, string>>());\n }\n }\n // END options.localizedData.pseudoLocales\n } else if (!isWebpackDevServer) {\n throw new Error('Localized data must be provided unless webpack dev server is running.');\n }\n // END options.localizedData\n\n // START options.noStringsLocaleName\n const { noStringsLocaleName } = this._options;\n if (\n noStringsLocaleName === undefined ||\n noStringsLocaleName === null ||\n !ensureValidLocaleName(noStringsLocaleName)\n ) {\n this._noStringsLocaleName = 'none';\n } else {\n this._noStringsLocaleName = noStringsLocaleName;\n }\n // END options.noStringsLocaleName\n\n // START options.formatLocaleForFilename\n const { formatLocaleForFilename = (localeName: string) => localeName } = this._options;\n this._formatLocaleForFilename = formatLocaleForFilename;\n // END options.formatLocaleForFilename\n return { errors, warnings };\n }\n}\n\nfunction _chunkHasLocalizedModules(\n chunkGraph: ChunkGraph,\n chunk: Chunk,\n runtimeLocaleExpression: string | undefined\n): boolean {\n let chunkHasAnyLocModules: boolean | undefined = getMark(chunk);\n if (chunkHasAnyLocModules === undefined) {\n chunkHasAnyLocModules = false;\n const candidateModules: Iterable<Module> | undefined = chunkGraph.getChunkModulesIterableBySourceType(\n chunk,\n 'javascript'\n );\n if (candidateModules) {\n outer: for (const module of candidateModules) {\n const moduleMark: boolean | undefined = getMark(module);\n if (moduleMark) {\n chunkHasAnyLocModules = true;\n break;\n } else if (moduleMark === false) {\n continue;\n }\n\n // Is this a concatenated module?\n const { _modules: modules } = module as { _modules?: Iterable<Module> };\n if (modules) {\n for (const nestedModule of modules) {\n if (getMark(nestedModule)) {\n markEntity(module, true);\n chunkHasAnyLocModules = true;\n break outer;\n }\n }\n markEntity(module, false);\n }\n }\n }\n\n // If this chunk doesn't directly contain any localized resources, it still\n // needs to be localized if it's an entrypoint chunk (i.e. - it has a runtime)\n // and it loads localized async chunks.\n // In that case, the generated chunk URL generation code needs to contain\n // the locale name.\n if (!chunkHasAnyLocModules && !runtimeLocaleExpression && chunk.hasRuntime()) {\n for (const asyncChunk of chunk.getAllAsyncChunks()) {\n if (_chunkHasLocalizedModules(chunkGraph, asyncChunk, runtimeLocaleExpression)) {\n chunkHasAnyLocModules = true;\n break;\n }\n }\n }\n\n markEntity(chunk, chunkHasAnyLocModules);\n }\n\n return chunkHasAnyLocModules;\n}\n\nfunction convertLocalizationFileToLocData(locFile: ILocalizationFile): ReadonlyMap<string, string> {\n const locFileData: Map<string, string> = new Map();\n for (const [stringName, locFileEntry] of Object.entries(locFile)) {\n locFileData.set(stringName, locFileEntry.value);\n }\n\n return locFileData;\n}\n\nasync function normalizeLocalizedData(\n context: LoaderContext<{}>,\n localizedData: ILocaleFileData\n): Promise<ReadonlyMap<string, string>> {\n if (typeof localizedData === 'string') {\n // The value is the path to a file. Add it as a file dependency\n context.addDependency(localizedData);\n const content: string = await new Promise((resolve, reject) => {\n // Use context.fs so that the plugin is compatible with overriding compiler.inputFileSystem\n context.fs.readFile(localizedData, (err, data) => {\n if (err) {\n return reject(err);\n } else if (!data) {\n return reject(new Error(`No data in ${localizedData}`));\n }\n resolve(data.toString());\n });\n });\n\n const localizationFile: ILocalizationFile = parseResJson({\n filePath: localizedData,\n content\n });\n\n return convertLocalizationFileToLocData(localizationFile);\n } else {\n return localizedData instanceof Map ? localizedData : new Map(Object.entries(localizedData));\n }\n}\n"]}
@@ -2,7 +2,7 @@
2
2
  // Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
3
3
  // See LICENSE in the project root for license information.
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
5
- const node_core_library_1 = require("@rushstack/node-core-library");
5
+ const terminal_1 = require("@rushstack/terminal");
6
6
  const localization_utilities_1 = require("@rushstack/localization-utilities");
7
7
  const LoaderTerminalProvider_1 = require("../utilities/LoaderTerminalProvider");
8
8
  /**
@@ -15,7 +15,7 @@ const loader = function (content) {
15
15
  ...options,
16
16
  content,
17
17
  filePath: this.resourcePath,
18
- terminal: new node_core_library_1.Terminal(LoaderTerminalProvider_1.LoaderTerminalProvider.getTerminalProviderForLoader(this))
18
+ terminal: new terminal_1.Terminal(LoaderTerminalProvider_1.LoaderTerminalProvider.getTerminalProviderForLoader(this))
19
19
  });
20
20
  const resultObject = {};
21
21
  for (const [stringName, stringValue] of Object.entries(locFileData)) {
@@ -1 +1 @@
1
- {"version":3,"file":"default-locale-loader.js","sourceRoot":"","sources":["../../src/loaders/default-locale-loader.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;AAG3D,oEAAwD;AACxD,8EAAyF;AAGzF,gFAA6E;AAE7E;;GAEG;AACH,sCAAsC;AACtC,MAAM,MAAM,GAAiD,UAE3D,OAAe;IAEf,MAAM,OAAO,GAAuB,IAAI,CAAC,UAAU,EAAE,CAAC;IAEtD,MAAM,WAAW,GAAsB,IAAA,qCAAY,EAAC;QAClD,GAAG,OAAO;QACV,OAAO;QACP,QAAQ,EAAE,IAAI,CAAC,YAAY;QAC3B,QAAQ,EAAE,IAAI,4BAAQ,CAAC,+CAAsB,CAAC,4BAA4B,CAAC,IAAI,CAAC,CAAC;KAClF,CAAC,CAAC;IAEH,MAAM,YAAY,GAAqC,EAAE,CAAC;IAC1D,KAAK,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QACpE,YAAY,CAAC,UAAU,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC;IAC/C,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;AACtC,CAAC,CAAC;AAEF,kBAAe,MAAM,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport type { LoaderContext, LoaderDefinitionFunction } from 'webpack';\nimport { Terminal } from '@rushstack/node-core-library';\nimport { type ILocalizationFile, parseLocFile } from '@rushstack/localization-utilities';\n\nimport type { IResxLoaderOptions } from './IResxLoaderOptions';\nimport { LoaderTerminalProvider } from '../utilities/LoaderTerminalProvider';\n\n/**\n * This loader passes through the raw untranslated strings and may be used without a LocalizationPlugin instance.\n */\n// eslint-disable-next-line func-style\nconst loader: LoaderDefinitionFunction<IResxLoaderOptions> = function (\n this: LoaderContext<IResxLoaderOptions>,\n content: string\n): string {\n const options: IResxLoaderOptions = this.getOptions();\n\n const locFileData: ILocalizationFile = parseLocFile({\n ...options,\n content,\n filePath: this.resourcePath,\n terminal: new Terminal(LoaderTerminalProvider.getTerminalProviderForLoader(this))\n });\n\n const resultObject: { [stringName: string]: string } = {};\n for (const [stringName, stringValue] of Object.entries(locFileData)) {\n resultObject[stringName] = stringValue.value;\n }\n\n return JSON.stringify(resultObject);\n};\n\nexport default loader;\n"]}
1
+ {"version":3,"file":"default-locale-loader.js","sourceRoot":"","sources":["../../src/loaders/default-locale-loader.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;AAG3D,kDAA+C;AAC/C,8EAAyF;AAGzF,gFAA6E;AAE7E;;GAEG;AACH,sCAAsC;AACtC,MAAM,MAAM,GAAiD,UAE3D,OAAe;IAEf,MAAM,OAAO,GAAuB,IAAI,CAAC,UAAU,EAAE,CAAC;IAEtD,MAAM,WAAW,GAAsB,IAAA,qCAAY,EAAC;QAClD,GAAG,OAAO;QACV,OAAO;QACP,QAAQ,EAAE,IAAI,CAAC,YAAY;QAC3B,QAAQ,EAAE,IAAI,mBAAQ,CAAC,+CAAsB,CAAC,4BAA4B,CAAC,IAAI,CAAC,CAAC;KAClF,CAAC,CAAC;IAEH,MAAM,YAAY,GAAqC,EAAE,CAAC;IAC1D,KAAK,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QACpE,YAAY,CAAC,UAAU,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC;IAC/C,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;AACtC,CAAC,CAAC;AAEF,kBAAe,MAAM,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport type { LoaderContext, LoaderDefinitionFunction } from 'webpack';\nimport { Terminal } from '@rushstack/terminal';\nimport { type ILocalizationFile, parseLocFile } from '@rushstack/localization-utilities';\n\nimport type { IResxLoaderOptions } from './IResxLoaderOptions';\nimport { LoaderTerminalProvider } from '../utilities/LoaderTerminalProvider';\n\n/**\n * This loader passes through the raw untranslated strings and may be used without a LocalizationPlugin instance.\n */\n// eslint-disable-next-line func-style\nconst loader: LoaderDefinitionFunction<IResxLoaderOptions> = function (\n this: LoaderContext<IResxLoaderOptions>,\n content: string\n): string {\n const options: IResxLoaderOptions = this.getOptions();\n\n const locFileData: ILocalizationFile = parseLocFile({\n ...options,\n content,\n filePath: this.resourcePath,\n terminal: new Terminal(LoaderTerminalProvider.getTerminalProviderForLoader(this))\n });\n\n const resultObject: { [stringName: string]: string } = {};\n for (const [stringName, stringValue] of Object.entries(locFileData)) {\n resultObject[stringName] = stringValue.value;\n }\n\n return JSON.stringify(resultObject);\n};\n\nexport default loader;\n"]}
@@ -1,5 +1,5 @@
1
1
  import type { LoaderDefinitionFunction } from 'webpack';
2
- import { type NewlineKind } from '@rushstack/node-core-library';
2
+ import type { NewlineKind } from '@rushstack/node-core-library';
3
3
  import type { LocalizationPlugin } from '../LocalizationPlugin';
4
4
  import { type IBaseLocLoaderOptions } from './LoaderFactory';
5
5
  export interface ILocLoaderOptions extends IBaseLocLoaderOptions {
@@ -1 +1 @@
1
- {"version":3,"file":"loc-loader.d.ts","sourceRoot":"","sources":["../../src/loaders/loc-loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAiB,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAEvE,OAAO,EAAY,KAAK,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAG1E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAgB,KAAK,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAG3E,MAAM,WAAW,iBAAkB,SAAQ,qBAAqB;IAC9D,cAAc,EAAE,kBAAkB,CAAC;IACnC,wBAAwB,EAAE,WAAW,GAAG,SAAS,CAAC;IAClD,yBAAyB,EAAE,OAAO,GAAG,SAAS,CAAC;CAChD;AAED;;GAEG;AACH,QAAA,MAAM,MAAM,EAAE,wBAAwB,CAAC,iBAAiB,CAYvD,CAAC;AAEF,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"loc-loader.d.ts","sourceRoot":"","sources":["../../src/loaders/loc-loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAiB,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAEvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAIhE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAgB,KAAK,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAG3E,MAAM,WAAW,iBAAkB,SAAQ,qBAAqB;IAC9D,cAAc,EAAE,kBAAkB,CAAC;IACnC,wBAAwB,EAAE,WAAW,GAAG,SAAS,CAAC;IAClD,yBAAyB,EAAE,OAAO,GAAG,SAAS,CAAC;CAChD;AAED;;GAEG;AACH,QAAA,MAAM,MAAM,EAAE,wBAAwB,CAAC,iBAAiB,CAYvD,CAAC;AAEF,eAAe,MAAM,CAAC"}
@@ -2,7 +2,7 @@
2
2
  // Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
3
3
  // See LICENSE in the project root for license information.
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
5
- const node_core_library_1 = require("@rushstack/node-core-library");
5
+ const terminal_1 = require("@rushstack/terminal");
6
6
  const localization_utilities_1 = require("@rushstack/localization-utilities");
7
7
  const LoaderFactory_1 = require("./LoaderFactory");
8
8
  const LoaderTerminalProvider_1 = require("../utilities/LoaderTerminalProvider");
@@ -11,7 +11,7 @@ const LoaderTerminalProvider_1 = require("../utilities/LoaderTerminalProvider");
11
11
  */
12
12
  const loader = (0, LoaderFactory_1.createLoader)((content, filePath, context) => {
13
13
  const options = context.getOptions();
14
- const terminal = new node_core_library_1.Terminal(LoaderTerminalProvider_1.LoaderTerminalProvider.getTerminalProviderForLoader(context));
14
+ const terminal = new terminal_1.Terminal(LoaderTerminalProvider_1.LoaderTerminalProvider.getTerminalProviderForLoader(context));
15
15
  return (0, localization_utilities_1.parseLocFile)({
16
16
  ...options,
17
17
  terminal,
@@ -1 +1 @@
1
- {"version":3,"file":"loc-loader.js","sourceRoot":"","sources":["../../src/loaders/loc-loader.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;AAI3D,oEAA0E;AAC1E,8EAAiE;AAGjE,mDAA2E;AAC3E,gFAA6E;AAQ7E;;GAEG;AACH,MAAM,MAAM,GAAgD,IAAA,4BAAY,EACtE,CAAC,OAAe,EAAE,QAAgB,EAAE,OAAyC,EAAE,EAAE;IAC/E,MAAM,OAAO,GAAsB,OAAO,CAAC,UAAU,EAAE,CAAC;IACxD,MAAM,QAAQ,GAAa,IAAI,4BAAQ,CAAC,+CAAsB,CAAC,4BAA4B,CAAC,OAAO,CAAC,CAAC,CAAC;IAEtG,OAAO,IAAA,qCAAY,EAAC;QAClB,GAAG,OAAO;QACV,QAAQ;QACR,OAAO;QACP,QAAQ;KACT,CAAC,CAAC;AACL,CAAC,CACF,CAAC;AAEF,kBAAe,MAAM,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport type { LoaderContext, LoaderDefinitionFunction } from 'webpack';\n\nimport { Terminal, type NewlineKind } from '@rushstack/node-core-library';\nimport { parseLocFile } from '@rushstack/localization-utilities';\n\nimport type { LocalizationPlugin } from '../LocalizationPlugin';\nimport { createLoader, type IBaseLocLoaderOptions } from './LoaderFactory';\nimport { LoaderTerminalProvider } from '../utilities/LoaderTerminalProvider';\n\nexport interface ILocLoaderOptions extends IBaseLocLoaderOptions {\n pluginInstance: LocalizationPlugin;\n resxNewlineNormalization: NewlineKind | undefined;\n ignoreMissingResxComments: boolean | undefined;\n}\n\n/**\n * General purpose loader that dispatches based on file extension.\n */\nconst loader: LoaderDefinitionFunction<ILocLoaderOptions> = createLoader(\n (content: string, filePath: string, context: LoaderContext<ILocLoaderOptions>) => {\n const options: ILocLoaderOptions = context.getOptions();\n const terminal: Terminal = new Terminal(LoaderTerminalProvider.getTerminalProviderForLoader(context));\n\n return parseLocFile({\n ...options,\n terminal,\n content,\n filePath\n });\n }\n);\n\nexport default loader;\n"]}
1
+ {"version":3,"file":"loc-loader.js","sourceRoot":"","sources":["../../src/loaders/loc-loader.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;AAK3D,kDAA+C;AAC/C,8EAAiE;AAGjE,mDAA2E;AAC3E,gFAA6E;AAQ7E;;GAEG;AACH,MAAM,MAAM,GAAgD,IAAA,4BAAY,EACtE,CAAC,OAAe,EAAE,QAAgB,EAAE,OAAyC,EAAE,EAAE;IAC/E,MAAM,OAAO,GAAsB,OAAO,CAAC,UAAU,EAAE,CAAC;IACxD,MAAM,QAAQ,GAAa,IAAI,mBAAQ,CAAC,+CAAsB,CAAC,4BAA4B,CAAC,OAAO,CAAC,CAAC,CAAC;IAEtG,OAAO,IAAA,qCAAY,EAAC;QAClB,GAAG,OAAO;QACV,QAAQ;QACR,OAAO;QACP,QAAQ;KACT,CAAC,CAAC;AACL,CAAC,CACF,CAAC;AAEF,kBAAe,MAAM,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport type { LoaderContext, LoaderDefinitionFunction } from 'webpack';\n\nimport type { NewlineKind } from '@rushstack/node-core-library';\nimport { Terminal } from '@rushstack/terminal';\nimport { parseLocFile } from '@rushstack/localization-utilities';\n\nimport type { LocalizationPlugin } from '../LocalizationPlugin';\nimport { createLoader, type IBaseLocLoaderOptions } from './LoaderFactory';\nimport { LoaderTerminalProvider } from '../utilities/LoaderTerminalProvider';\n\nexport interface ILocLoaderOptions extends IBaseLocLoaderOptions {\n pluginInstance: LocalizationPlugin;\n resxNewlineNormalization: NewlineKind | undefined;\n ignoreMissingResxComments: boolean | undefined;\n}\n\n/**\n * General purpose loader that dispatches based on file extension.\n */\nconst loader: LoaderDefinitionFunction<ILocLoaderOptions> = createLoader(\n (content: string, filePath: string, context: LoaderContext<ILocLoaderOptions>) => {\n const options: ILocLoaderOptions = context.getOptions();\n const terminal: Terminal = new Terminal(LoaderTerminalProvider.getTerminalProviderForLoader(context));\n\n return parseLocFile({\n ...options,\n terminal,\n content,\n filePath\n });\n }\n);\n\nexport default loader;\n"]}
@@ -2,13 +2,13 @@
2
2
  // Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
3
3
  // See LICENSE in the project root for license information.
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
5
- const node_core_library_1 = require("@rushstack/node-core-library");
5
+ const terminal_1 = require("@rushstack/terminal");
6
6
  const localization_utilities_1 = require("@rushstack/localization-utilities");
7
7
  const LoaderFactory_1 = require("./LoaderFactory");
8
8
  const LoaderTerminalProvider_1 = require("../utilities/LoaderTerminalProvider");
9
9
  const loader = (0, LoaderFactory_1.createLoader)((content, filePath, context) => {
10
10
  const options = context.getOptions();
11
- const terminal = new node_core_library_1.Terminal(LoaderTerminalProvider_1.LoaderTerminalProvider.getTerminalProviderForLoader(context));
11
+ const terminal = new terminal_1.Terminal(LoaderTerminalProvider_1.LoaderTerminalProvider.getTerminalProviderForLoader(context));
12
12
  return (0, localization_utilities_1.parseResx)({
13
13
  content,
14
14
  filePath,
@@ -1 +1 @@
1
- {"version":3,"file":"resx-loader.js","sourceRoot":"","sources":["../../src/loaders/resx-loader.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;AAG3D,oEAAwD;AACxD,8EAA8D;AAG9D,mDAA+C;AAC/C,gFAA6E;AAE7E,MAAM,MAAM,GAAoD,IAAA,4BAAY,EAC1E,CAAC,OAAe,EAAE,QAAgB,EAAE,OAA6C,EAAE,EAAE;IACnF,MAAM,OAAO,GAA0B,OAAO,CAAC,UAAU,EAAE,CAAC;IAC5D,MAAM,QAAQ,GAAa,IAAI,4BAAQ,CAAC,+CAAsB,CAAC,4BAA4B,CAAC,OAAO,CAAC,CAAC,CAAC;IAEtG,OAAO,IAAA,kCAAS,EAAC;QACf,OAAO;QACP,QAAQ;QACR,QAAQ;QACR,wBAAwB,EAAE,OAAO,CAAC,wBAAwB;QAC1D,yBAAyB,EAAE,CAAC,OAAO,CAAC,yBAAyB;KAC9D,CAAC,CAAC;AACL,CAAC,CACF,CAAC;AAEF,kBAAe,MAAM,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport type { LoaderContext, LoaderDefinitionFunction } from 'webpack';\nimport { Terminal } from '@rushstack/node-core-library';\nimport { parseResx } from '@rushstack/localization-utilities';\nimport type { IResxLocLoaderOptions } from './IResxLoaderOptions';\n\nimport { createLoader } from './LoaderFactory';\nimport { LoaderTerminalProvider } from '../utilities/LoaderTerminalProvider';\n\nconst loader: LoaderDefinitionFunction<IResxLocLoaderOptions> = createLoader(\n (content: string, filePath: string, context: LoaderContext<IResxLocLoaderOptions>) => {\n const options: IResxLocLoaderOptions = context.getOptions();\n const terminal: Terminal = new Terminal(LoaderTerminalProvider.getTerminalProviderForLoader(context));\n\n return parseResx({\n content,\n filePath,\n terminal,\n resxNewlineNormalization: options.resxNewlineNormalization,\n ignoreMissingResxComments: !options.ignoreMissingResxComments\n });\n }\n);\n\nexport default loader;\n"]}
1
+ {"version":3,"file":"resx-loader.js","sourceRoot":"","sources":["../../src/loaders/resx-loader.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;AAG3D,kDAA+C;AAC/C,8EAA8D;AAG9D,mDAA+C;AAC/C,gFAA6E;AAE7E,MAAM,MAAM,GAAoD,IAAA,4BAAY,EAC1E,CAAC,OAAe,EAAE,QAAgB,EAAE,OAA6C,EAAE,EAAE;IACnF,MAAM,OAAO,GAA0B,OAAO,CAAC,UAAU,EAAE,CAAC;IAC5D,MAAM,QAAQ,GAAa,IAAI,mBAAQ,CAAC,+CAAsB,CAAC,4BAA4B,CAAC,OAAO,CAAC,CAAC,CAAC;IAEtG,OAAO,IAAA,kCAAS,EAAC;QACf,OAAO;QACP,QAAQ;QACR,QAAQ;QACR,wBAAwB,EAAE,OAAO,CAAC,wBAAwB;QAC1D,yBAAyB,EAAE,CAAC,OAAO,CAAC,yBAAyB;KAC9D,CAAC,CAAC;AACL,CAAC,CACF,CAAC;AAEF,kBAAe,MAAM,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport type { LoaderContext, LoaderDefinitionFunction } from 'webpack';\nimport { Terminal } from '@rushstack/terminal';\nimport { parseResx } from '@rushstack/localization-utilities';\nimport type { IResxLocLoaderOptions } from './IResxLoaderOptions';\n\nimport { createLoader } from './LoaderFactory';\nimport { LoaderTerminalProvider } from '../utilities/LoaderTerminalProvider';\n\nconst loader: LoaderDefinitionFunction<IResxLocLoaderOptions> = createLoader(\n (content: string, filePath: string, context: LoaderContext<IResxLocLoaderOptions>) => {\n const options: IResxLocLoaderOptions = context.getOptions();\n const terminal: Terminal = new Terminal(LoaderTerminalProvider.getTerminalProviderForLoader(context));\n\n return parseResx({\n content,\n filePath,\n terminal,\n resxNewlineNormalization: options.resxNewlineNormalization,\n ignoreMissingResxComments: !options.ignoreMissingResxComments\n });\n }\n);\n\nexport default loader;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"trueHashes.d.ts","sourceRoot":"","sources":["../src/trueHashes.ts"],"names":[],"mappings":";AAGA,OAAO,KAAK,EAAE,OAAO,IAAI,OAAO,EAAE,WAAW,EAA+B,MAAM,SAAS,CAAC;AAY5F,MAAM,MAAM,MAAM,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,KAAK,MAAM,CAAC;AAE3D,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,OAAO,OAAO,CAAC;IAC5B,WAAW,EAAE,WAAW,CAAC;CAC1B;AAED,wBAAgB,eAAe,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,uBAAuB,GAAG,MAAM,CAU7F;AAED,MAAM,WAAW,yBAAyB;IACxC,WAAW,EAAE,OAAO,OAAO,CAAC;IAC5B,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACxD;AAOD,wBAAgB,iBAAiB,CAAC,EAChC,WAAW,EACX,WAAW,EACX,MAAM,EACN,gBAAgB,EACjB,EAAE,yBAAyB,GAAG,IAAI,CAoOlC"}
1
+ {"version":3,"file":"trueHashes.d.ts","sourceRoot":"","sources":["../src/trueHashes.ts"],"names":[],"mappings":";AAGA,OAAO,KAAK,EAAE,OAAO,IAAI,OAAO,EAAE,WAAW,EAA+B,MAAM,SAAS,CAAC;AAa5F,MAAM,MAAM,MAAM,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,KAAK,MAAM,CAAC;AAE3D,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,OAAO,OAAO,CAAC;IAC5B,WAAW,EAAE,WAAW,CAAC;CAC1B;AAED,wBAAgB,eAAe,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,uBAAuB,GAAG,MAAM,CAU7F;AAED,MAAM,WAAW,yBAAyB;IACxC,WAAW,EAAE,OAAO,OAAO,CAAC;IAC5B,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACxD;AAOD,wBAAgB,iBAAiB,CAAC,EAChC,WAAW,EACX,WAAW,EACX,MAAM,EACN,gBAAgB,EACjB,EAAE,yBAAyB,GAAG,IAAI,CAyPlC"}
package/lib/trueHashes.js CHANGED
@@ -4,6 +4,7 @@
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
5
5
  exports.updateAssetHashes = exports.getHashFunction = void 0;
6
6
  const node_core_library_1 = require("@rushstack/node-core-library");
7
+ const chunkUtilities_1 = require("./utilities/chunkUtilities");
7
8
  function getHashFunction({ thisWebpack, compilation }) {
8
9
  const { hashFunction = 'md5', hashDigest = 'hex', hashDigestLength, hashSalt } = compilation.outputOptions;
9
10
  return (contents) => {
@@ -20,6 +21,16 @@ function updateAssetHashes({ thisWebpack, compilation, hashFn, filesByChunkName
20
21
  const unprocessedDependenciesByChunk = new Map();
21
22
  const dependenciesByChunk = new Map();
22
23
  const dependentsByChunk = new Map();
24
+ const unprocessedChunks = new Set();
25
+ const nonJsChunks = new Set();
26
+ for (const chunk of compilation.chunks) {
27
+ if (!(0, chunkUtilities_1.chunkIsJs)(chunk, compilation.chunkGraph)) {
28
+ nonJsChunks.add(chunk);
29
+ }
30
+ else {
31
+ unprocessedChunks.add(chunk);
32
+ }
33
+ }
23
34
  for (const chunk of compilation.chunks) {
24
35
  let unprocessedDependencies = unprocessedDependenciesByChunk.get(chunk);
25
36
  if (!unprocessedDependencies) {
@@ -33,19 +44,24 @@ function updateAssetHashes({ thisWebpack, compilation, hashFn, filesByChunkName
33
44
  }
34
45
  if (chunk.hasRuntime()) {
35
46
  for (const asyncChunk of chunk.getAllAsyncChunks()) {
36
- unprocessedDependencies.add(asyncChunk);
37
- dependencies.add(asyncChunk);
38
- let dependents = dependentsByChunk.get(asyncChunk);
39
- if (!dependents) {
40
- dependents = new Set();
41
- dependentsByChunk.set(asyncChunk, dependents);
47
+ if (!nonJsChunks.has(asyncChunk)) {
48
+ unprocessedDependencies.add(asyncChunk);
49
+ dependencies.add(asyncChunk);
50
+ let dependents = dependentsByChunk.get(asyncChunk);
51
+ if (!dependents) {
52
+ dependents = new Set();
53
+ dependentsByChunk.set(asyncChunk, dependents);
54
+ }
55
+ dependents.add(chunk);
56
+ if (!unprocessedChunks.has(asyncChunk)) {
57
+ compilation.errors.push(new thisWebpack.WebpackError(`Found an async chunk that was not included in the compilation: ${asyncChunk.id} ` +
58
+ `(reason: ${asyncChunk.chunkReason}).`));
59
+ }
42
60
  }
43
- dependents.add(chunk);
44
61
  }
45
62
  }
46
63
  }
47
64
  const hashReplacementsByChunk = new Map();
48
- const unprocessedChunks = new Set(compilation.chunks);
49
65
  let previousSize = -1;
50
66
  while (unprocessedChunks.size > 0) {
51
67
  const currentSize = unprocessedChunks.size;
@@ -1 +1 @@
1
- {"version":3,"file":"trueHashes.js","sourceRoot":"","sources":["../src/trueHashes.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAG3D,oEAAoD;AAkBpD,SAAgB,eAAe,CAAC,EAAE,WAAW,EAAE,WAAW,EAA2B;IACnF,MAAM,EAAE,YAAY,GAAG,KAAK,EAAE,UAAU,GAAG,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,GAAG,WAAW,CAAC,aAAa,CAAC;IAC3G,OAAO,CAAC,QAAyB,EAAE,EAAE;QACnC,MAAM,IAAI,GAAgB,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QACpE,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACjC,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;IACxF,CAAC,CAAC;AACJ,CAAC;AAVD,0CAUC;AAcD,SAAgB,iBAAiB,CAAC,EAChC,WAAW,EACX,WAAW,EACX,MAAM,EACN,gBAAgB,EACU;;IAC1B,MAAM,8BAA8B,GAA2B,IAAI,GAAG,EAAE,CAAC;IACzE,MAAM,mBAAmB,GAA2B,IAAI,GAAG,EAAE,CAAC;IAC9D,MAAM,iBAAiB,GAA2B,IAAI,GAAG,EAAE,CAAC;IAC5D,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;QACvC,IAAI,uBAAuB,GAA2B,8BAA8B,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAChG,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC7B,uBAAuB,GAAG,IAAI,GAAG,EAAE,CAAC;YACpC,8BAA8B,CAAC,GAAG,CAAC,KAAK,EAAE,uBAAuB,CAAC,CAAC;QACrE,CAAC;QAED,IAAI,YAAY,GAA2B,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC1E,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,YAAY,GAAG,IAAI,GAAG,EAAE,CAAC;YACzB,mBAAmB,CAAC,GAAG,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QAC/C,CAAC;QAED,IAAI,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC;YACvB,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,iBAAiB,EAAE,EAAE,CAAC;gBACnD,uBAAuB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBACxC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBAE7B,IAAI,UAAU,GAA2B,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBAC3E,IAAI,CAAC,UAAU,EAAE,CAAC;oBAChB,UAAU,GAAG,IAAI,GAAG,EAAE,CAAC;oBACvB,iBAAiB,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;gBAChD,CAAC;gBAED,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,uBAAuB,GAAiC,IAAI,GAAG,EAAE,CAAC;IACxE,MAAM,iBAAiB,GAAe,IAAI,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAClE,IAAI,YAAY,GAAW,CAAC,CAAC,CAAC;IAC9B,OAAO,iBAAiB,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,WAAW,GAAW,iBAAiB,CAAC,IAAI,CAAC;QACnD,IAAI,WAAW,KAAK,YAAY,EAAE,CAAC;YACjC,WAAW,CAAC,MAAM,CAAC,IAAI,CACrB,IAAI,WAAW,CAAC,YAAY,CAC1B,0EAA0E,CAC3E,CACF,CAAC;YAEF,MAAM;QACR,CAAC;QAED,YAAY,GAAG,WAAW,CAAC;QAE3B,KAAK,MAAM,KAAK,IAAI,iBAAiB,EAAE,CAAC;YACtC,IAAI,CAAA,MAAA,8BAA8B,CAAC,GAAG,CAAC,KAAK,CAAC,0CAAE,IAAI,MAAK,CAAC,EAAE,CAAC;gBAC1D,sDAAsD;gBACtD,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;oBACxB,WAAW,CAAC,MAAM,CAAC,IAAI,CACrB,IAAI,WAAW,CAAC,YAAY,CAAC,qCAAqC,KAAK,CAAC,EAAE,GAAG,CAAC,CAC/E,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,MAAM,YAAY,GAAW,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC;oBAC1D,MAAM,iBAAiB,GAA2B,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;oBACjF,IAAI,CAAC,iBAAiB,EAAE,CAAC;wBACvB,WAAW,CAAC,MAAM,CAAC,IAAI,CACrB,IAAI,WAAW,CAAC,YAAY,CAAC,yCAAyC,KAAK,CAAC,EAAE,GAAG,CAAC,CACnF,CAAC;oBACJ,CAAC;yBAAM,CAAC;wBACN,SAAS,iBAAiB,CACxB,WAAmB,EACnB,MAA0B;4BAE1B,MAAM,KAAK,GAAgC,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;4BAC7E,IAAI,CAAC,KAAK,EAAE,CAAC;gCACX,WAAW,CAAC,MAAM,CAAC,IAAI,CACrB,IAAI,WAAW,CAAC,YAAY,CAAC,yBAAyB,WAAW,eAAe,KAAK,CAAC,EAAE,GAAG,CAAC,CAC7F,CAAC;4BACJ,CAAC;iCAAM,CAAC;gCACN,IAAI,WAAW,GAAmB,KAAK,CAAC,MAAM,CAAC;gCAC/C,MAAM,SAAS,GAAW,KAAK,CAAC,IAAI,CAAC;gCACrC,IAAI,iBAAkB,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;oCAChC,MAAM,wBAAwB,GAAwB,IAAI,GAAG,EAAE,CAAC;oCAChE,IAAI,kBAAkB,GAAY,KAAK,CAAC;oCACxC,KAAK,MAAM,UAAU,IAAI,iBAAkB,EAAE,CAAC;wCAC5C,MAAM,0BAA0B,GAC9B,uBAAuB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;wCAC1C,IAAI,CAAC,0BAA0B,EAAE,CAAC;4CAChC,WAAW,CAAC,MAAM,CAAC,IAAI,CACrB,IAAI,WAAW,CAAC,YAAY,CAC1B,8CAA8C,UAAU,CAAC,EAAE,GAAG,CAC/D,CACF,CAAC;wCACJ,CAAC;6CAAM,CAAC;4CACN,MAAM,EAAE,YAAY,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,GAC9D,0BAA0B,CAAC;4CAC7B,IAAI,eAAmC,CAAC;4CACxC,IAAI,OAAO,gBAAgB,KAAK,QAAQ,EAAE,CAAC;gDACzC,IAAI,MAAM,EAAE,CAAC;oDACX,eAAe,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;gDAC7C,CAAC;4CACH,CAAC;iDAAM,CAAC;gDACN,eAAe,GAAG,gBAAgB,CAAC;4CACrC,CAAC;4CAED,IAAI,eAAe,EAAE,CAAC;gDACpB,IAAI,wBAAwB,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAAE,CAAC;oDACzD,WAAW,CAAC,MAAM,CAAC,IAAI,CACrB,IAAI,WAAW,CAAC,YAAY,CAC1B,wCAAwC,sBAAsB,GAAG;wDAC/D,YAAY,KAAK,CAAC,EAAE,GAAG,CAC1B,CACF,CAAC;gDACJ,CAAC;qDAAM,CAAC;oDACN,wBAAwB,CAAC,GAAG,CAAC,sBAAsB,EAAE,eAAe,CAAC,CAAC;oDACtE,kBAAkB,GAAG,IAAI,CAAC;gDAC5B,CAAC;4CACH,CAAC;wCACH,CAAC;oCACH,CAAC;oCAED,IAAI,kBAAkB,EAAE,CAAC;wCACvB,MAAM,YAAY,GAAW,WAAW,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC;wCAC7D,MAAM,aAAa,GAA0B,IAAI,WAAW,CAAC,OAAO,CAAC,aAAa,CAChF,WAAW,EACX,SAAS,CACV,CAAC;wCAEF,MAAM,MAAM,GAAW,IAAI,MAAM,CAC/B,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,IAAI,EAAE,CAAC;6CACxC,GAAG,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,wBAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;6CACxD,IAAI,CAAC,GAAG,CAAC,EACZ,GAAG,CACJ,CAAC;wCACF,IAAI,KAA8B,CAAC;wCACnC,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;4CACpD,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;4CACzC,MAAM,UAAU,GAAW,KAAM,CAAC;4CAClC,MAAM,QAAQ,GAAW,UAAU,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;4CAC9D,MAAM,WAAW,GAAW,wBAAwB,CAAC,GAAG,CAAC,YAAY,CAAE,CAAC;4CACxE,aAAa,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;wCAC3D,CAAC;wCAED,WAAW,GAAG,aAAa,CAAC;wCAC5B,WAAW,CAAC,WAAW,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;oCACpD,CAAC;gCACH,CAAC;gCAED,IAAI,WAAW,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;oCACvC,MAAM,QAAQ,GAAW,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;oCACtD,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;wCAC9B,MAAM,aAAa,GAAW,WAAW,CAAC,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;wCAC1E,WAAW,CAAC,WAAW,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;wCAEpD,IAAI,MAAM,EAAE,CAAC;4CACX,MAAM,iBAAiB,GAAuC,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,GAAG,CACjF,KAAK,CAAC,IAAI,CACX,CAAC;4CACF,IAAI,iBAAiB,EAAE,CAAC;gDACtB,iBAAiB,CAAC,MAAM,CAAC,GAAG,aAAa,CAAC;4CAC5C,CAAC;wCACH,CAAC;wCAED,OAAO;4CACL,QAAQ;4CACR,aAAa;yCACd,CAAC;oCACJ,CAAC;gCACH,CAAC;4BACH,CAAC;wBACH,CAAC;wBAED,MAAM,cAAc,GAAwC,KAAgC;6BACzF,cAAc,CAAC;wBAClB,IAAI,cAAc,EAAE,CAAC;4BACnB,MAAM,gBAAgB,GAA2B,EAAE,CAAC;4BACpD,uBAAuB,CAAC,GAAG,CAAC,KAAK,EAAE;gCACjC,YAAY;gCACZ,gBAAgB;6BACjB,CAAC,CAAC;4BACH,KAAK,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;gCACnE,MAAM,kBAAkB,GAAyC,iBAAiB,CAChF,WAAW,EACX,MAAM,CACP,CAAC;gCACF,IAAI,kBAAkB,EAAE,CAAC;oCACvB,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,kBAAkB,CAAC;oCACvD,gBAAgB,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC;oCACpC,cAAc,CAAC,MAAM,CAAC,GAAG,aAAa,CAAC;gCACzC,CAAC;4BACH,CAAC;wBACH,CAAC;6BAAM,CAAC;4BACN,MAAM,UAAU,GAAa,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;4BACrD,IAAI,WAA+B,CAAC;4BACpC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;gCACnC,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oCAC9B,IAAI,WAAW,EAAE,CAAC;wCAChB,WAAW,CAAC,MAAM,CAAC,IAAI,CACrB,IAAI,WAAW,CAAC,YAAY,CAAC,uCAAuC,KAAK,CAAC,EAAE,GAAG,CAAC,CACjF,CAAC;oCACJ,CAAC;yCAAM,CAAC;wCACN,WAAW,GAAG,SAAS,CAAC;oCAC1B,CAAC;gCACH,CAAC;4BACH,CAAC;4BAED,IAAI,CAAC,WAAW,EAAE,CAAC;gCACjB,WAAW,CAAC,MAAM,CAAC,IAAI,CACrB,IAAI,WAAW,CAAC,YAAY,CAAC,wCAAwC,KAAK,CAAC,EAAE,GAAG,CAAC,CAClF,CAAC;4BACJ,CAAC;iCAAM,CAAC;gCACN,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,MAAA,iBAAiB,CAAC,WAAW,EAAE,SAAS,CAAC,mCAAI,EAAE,CAAC;gCACpF,uBAAuB,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,YAAY,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC,CAAC;gCACjF,IAAI,aAAa,EAAE,CAAC;oCAClB,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;oCAChC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;gCACjC,CAAC;4BACH,CAAC;wBACH,CAAC;oBACH,CAAC;oBAED,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBAChC,MAAM,UAAU,GAA2B,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;oBACxE,IAAI,UAAU,EAAE,CAAC;wBACf,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;4BACnC,MAAA,8BAA8B,CAAC,GAAG,CAAC,SAAS,CAAC,0CAAE,MAAM,CAAC,KAAK,CAAC,CAAC;wBAC/D,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAzOD,8CAyOC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport type { default as webpack, Compilation, Chunk, Asset, sources, util } from 'webpack';\nimport { Text } from '@rushstack/node-core-library';\n\nimport type { ILocalizedWebpackChunk } from './webpackInterfaces';\n\ninterface IHashReplacement {\n existingHash: string;\n trueHashByLocale: string | Record<string, string> | undefined;\n}\n\ntype WebpackHash = ReturnType<typeof util.createHash>;\n\nexport type HashFn = (contents: string | Buffer) => string;\n\nexport interface IGetHashFunctionOptions {\n thisWebpack: typeof webpack;\n compilation: Compilation;\n}\n\nexport function getHashFunction({ thisWebpack, compilation }: IGetHashFunctionOptions): HashFn {\n const { hashFunction = 'md5', hashDigest = 'hex', hashDigestLength, hashSalt } = compilation.outputOptions;\n return (contents: string | Buffer) => {\n const hash: WebpackHash = thisWebpack.util.createHash(hashFunction);\n if (hashSalt) {\n hash.update(hashSalt, 'utf-8');\n }\n\n return hash.update(contents).digest(hashDigest).toString().slice(0, hashDigestLength);\n };\n}\n\nexport interface IUpdateAssetHashesOptions {\n thisWebpack: typeof webpack;\n compilation: Compilation;\n hashFn: HashFn;\n filesByChunkName?: Map<string, Record<string, string>>;\n}\n\ninterface IProcessChunkAssetResult {\n trueHash: string;\n newJsFilename: string;\n}\n\nexport function updateAssetHashes({\n thisWebpack,\n compilation,\n hashFn,\n filesByChunkName\n}: IUpdateAssetHashesOptions): void {\n const unprocessedDependenciesByChunk: Map<Chunk, Set<Chunk>> = new Map();\n const dependenciesByChunk: Map<Chunk, Set<Chunk>> = new Map();\n const dependentsByChunk: Map<Chunk, Set<Chunk>> = new Map();\n for (const chunk of compilation.chunks) {\n let unprocessedDependencies: Set<Chunk> | undefined = unprocessedDependenciesByChunk.get(chunk);\n if (!unprocessedDependencies) {\n unprocessedDependencies = new Set();\n unprocessedDependenciesByChunk.set(chunk, unprocessedDependencies);\n }\n\n let dependencies: Set<Chunk> | undefined = dependenciesByChunk.get(chunk);\n if (!dependencies) {\n dependencies = new Set();\n dependenciesByChunk.set(chunk, dependencies);\n }\n\n if (chunk.hasRuntime()) {\n for (const asyncChunk of chunk.getAllAsyncChunks()) {\n unprocessedDependencies.add(asyncChunk);\n dependencies.add(asyncChunk);\n\n let dependents: Set<Chunk> | undefined = dependentsByChunk.get(asyncChunk);\n if (!dependents) {\n dependents = new Set();\n dependentsByChunk.set(asyncChunk, dependents);\n }\n\n dependents.add(chunk);\n }\n }\n }\n\n const hashReplacementsByChunk: Map<Chunk, IHashReplacement> = new Map();\n const unprocessedChunks: Set<Chunk> = new Set(compilation.chunks);\n let previousSize: number = -1;\n while (unprocessedChunks.size > 0) {\n const currentSize: number = unprocessedChunks.size;\n if (currentSize === previousSize) {\n compilation.errors.push(\n new thisWebpack.WebpackError(\n `Detected a cycle in the chunk dependencies. This should not be possible.`\n )\n );\n\n break;\n }\n\n previousSize = currentSize;\n\n for (const chunk of unprocessedChunks) {\n if (unprocessedDependenciesByChunk.get(chunk)?.size === 0) {\n // TODO: do we need to check if the chunk is rendered?\n if (!chunk.renderedHash) {\n compilation.errors.push(\n new thisWebpack.WebpackError(`Could not find the hash for chunk ${chunk.id}.`)\n );\n } else {\n const existingHash: string = chunk.contentHash.javascript;\n const chunkDependencies: Set<Chunk> | undefined = dependenciesByChunk.get(chunk);\n if (!chunkDependencies) {\n compilation.errors.push(\n new thisWebpack.WebpackError(`Could not find dependencies for chunk ${chunk.id}.`)\n );\n } else {\n function processChunkAsset(\n jsAssetName: string,\n locale: string | undefined\n ): IProcessChunkAssetResult | undefined {\n const asset: Readonly<Asset> | undefined = compilation.getAsset(jsAssetName);\n if (!asset) {\n compilation.errors.push(\n new thisWebpack.WebpackError(`Could not find asset \"${jsAssetName}\" for chunk ${chunk.id}.`)\n );\n } else {\n let assetSource: sources.Source = asset.source;\n const assetName: string = asset.name;\n if (chunkDependencies!.size > 0) {\n const relevantHashReplacements: Map<string, string> = new Map();\n let hasAnyReplacements: boolean = false;\n for (const dependency of chunkDependencies!) {\n const asyncChunkHashReplacements: IHashReplacement | undefined =\n hashReplacementsByChunk.get(dependency);\n if (!asyncChunkHashReplacements) {\n compilation.errors.push(\n new thisWebpack.WebpackError(\n `Could not find hash replacements for chunk ${dependency.id}.`\n )\n );\n } else {\n const { existingHash: otherChunkExistingHash, trueHashByLocale } =\n asyncChunkHashReplacements;\n let replacementHash: string | undefined;\n if (typeof trueHashByLocale === 'object') {\n if (locale) {\n replacementHash = trueHashByLocale[locale];\n }\n } else {\n replacementHash = trueHashByLocale;\n }\n\n if (replacementHash) {\n if (relevantHashReplacements.has(otherChunkExistingHash)) {\n compilation.errors.push(\n new thisWebpack.WebpackError(\n `Found multiple replacements for hash ${otherChunkExistingHash} ` +\n `in chunk ${chunk.id}.`\n )\n );\n } else {\n relevantHashReplacements.set(otherChunkExistingHash, replacementHash);\n hasAnyReplacements = true;\n }\n }\n }\n }\n\n if (hasAnyReplacements) {\n const sourceString: string = assetSource.source().toString();\n const replaceSource: sources.ReplaceSource = new thisWebpack.sources.ReplaceSource(\n assetSource,\n assetName\n );\n\n const regexp: RegExp = new RegExp(\n Array.from(relevantHashReplacements.keys())\n .map((hashToReplace) => Text.escapeRegExp(hashToReplace))\n .join('|'),\n 'g'\n );\n let match: RegExpMatchArray | null;\n while ((match = regexp.exec(sourceString)) !== null) {\n const { 0: originalHash, index } = match;\n const matchStart: number = index!;\n const matchEnd: number = matchStart + originalHash.length - 1;\n const replacement: string = relevantHashReplacements.get(originalHash)!;\n replaceSource.replace(matchStart, matchEnd, replacement);\n }\n\n assetSource = replaceSource;\n compilation.updateAsset(jsAssetName, assetSource);\n }\n }\n\n if (jsAssetName.includes(existingHash)) {\n const trueHash: string = hashFn(assetSource.buffer());\n if (trueHash !== existingHash) {\n const newJsFilename: string = jsAssetName.replace(existingHash, trueHash);\n compilation.renameAsset(jsAssetName, newJsFilename);\n\n if (locale) {\n const filesForChunkName: Record<string, string> | undefined = filesByChunkName?.get(\n chunk.name\n );\n if (filesForChunkName) {\n filesForChunkName[locale] = newJsFilename;\n }\n }\n\n return {\n trueHash,\n newJsFilename\n };\n }\n }\n }\n }\n\n const localizedFiles: Record<string, string> | undefined = (chunk as ILocalizedWebpackChunk)\n .localizedFiles;\n if (localizedFiles) {\n const trueHashByLocale: Record<string, string> = {};\n hashReplacementsByChunk.set(chunk, {\n existingHash,\n trueHashByLocale\n });\n for (const [locale, jsAssetName] of Object.entries(localizedFiles)) {\n const processAssetResult: IProcessChunkAssetResult | undefined = processChunkAsset(\n jsAssetName,\n locale\n );\n if (processAssetResult) {\n const { trueHash, newJsFilename } = processAssetResult;\n trueHashByLocale[locale] = trueHash;\n localizedFiles[locale] = newJsFilename;\n }\n }\n } else {\n const assetNames: string[] = Array.from(chunk.files);\n let jsAssetName: string | undefined;\n for (const assetName of assetNames) {\n if (assetName.endsWith('.js')) {\n if (jsAssetName) {\n compilation.errors.push(\n new thisWebpack.WebpackError(`Found multiple .js assets for chunk ${chunk.id}.`)\n );\n } else {\n jsAssetName = assetName;\n }\n }\n }\n\n if (!jsAssetName) {\n compilation.errors.push(\n new thisWebpack.WebpackError(`Could not find a .js asset for chunk ${chunk.id}.`)\n );\n } else {\n const { trueHash, newJsFilename } = processChunkAsset(jsAssetName, undefined) ?? {};\n hashReplacementsByChunk.set(chunk, { existingHash, trueHashByLocale: trueHash });\n if (newJsFilename) {\n chunk.files.delete(jsAssetName);\n chunk.files.add(newJsFilename);\n }\n }\n }\n }\n\n unprocessedChunks.delete(chunk);\n const dependents: Set<Chunk> | undefined = dependentsByChunk.get(chunk);\n if (dependents) {\n for (const dependent of dependents) {\n unprocessedDependenciesByChunk.get(dependent)?.delete(chunk);\n }\n }\n }\n }\n }\n }\n}\n"]}
1
+ {"version":3,"file":"trueHashes.js","sourceRoot":"","sources":["../src/trueHashes.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport type { default as webpack, Compilation, Chunk, Asset, sources, util } from 'webpack';\nimport { Text } from '@rushstack/node-core-library';\n\nimport type { ILocalizedWebpackChunk } from './webpackInterfaces';\nimport { chunkIsJs } from './utilities/chunkUtilities';\n\ninterface IHashReplacement {\n existingHash: string;\n trueHashByLocale: string | Record<string, string> | undefined;\n}\n\ntype WebpackHash = ReturnType<typeof util.createHash>;\n\nexport type HashFn = (contents: string | Buffer) => string;\n\nexport interface IGetHashFunctionOptions {\n thisWebpack: typeof webpack;\n compilation: Compilation;\n}\n\nexport function getHashFunction({ thisWebpack, compilation }: IGetHashFunctionOptions): HashFn {\n const { hashFunction = 'md5', hashDigest = 'hex', hashDigestLength, hashSalt } = compilation.outputOptions;\n return (contents: string | Buffer) => {\n const hash: WebpackHash = thisWebpack.util.createHash(hashFunction);\n if (hashSalt) {\n hash.update(hashSalt, 'utf-8');\n }\n\n return hash.update(contents).digest(hashDigest).toString().slice(0, hashDigestLength);\n };\n}\n\nexport interface IUpdateAssetHashesOptions {\n thisWebpack: typeof webpack;\n compilation: Compilation;\n hashFn: HashFn;\n filesByChunkName?: Map<string, Record<string, string>>;\n}\n\ninterface IProcessChunkAssetResult {\n trueHash: string;\n newJsFilename: string;\n}\n\nexport function updateAssetHashes({\n thisWebpack,\n compilation,\n hashFn,\n filesByChunkName\n}: IUpdateAssetHashesOptions): void {\n const unprocessedDependenciesByChunk: Map<Chunk, Set<Chunk>> = new Map();\n const dependenciesByChunk: Map<Chunk, Set<Chunk>> = new Map();\n const dependentsByChunk: Map<Chunk, Set<Chunk>> = new Map();\n const unprocessedChunks: Set<Chunk> = new Set();\n const nonJsChunks: Set<Chunk> = new Set();\n\n for (const chunk of compilation.chunks) {\n if (!chunkIsJs(chunk, compilation.chunkGraph)) {\n nonJsChunks.add(chunk);\n } else {\n unprocessedChunks.add(chunk);\n }\n }\n\n for (const chunk of compilation.chunks) {\n let unprocessedDependencies: Set<Chunk> | undefined = unprocessedDependenciesByChunk.get(chunk);\n if (!unprocessedDependencies) {\n unprocessedDependencies = new Set();\n unprocessedDependenciesByChunk.set(chunk, unprocessedDependencies);\n }\n\n let dependencies: Set<Chunk> | undefined = dependenciesByChunk.get(chunk);\n if (!dependencies) {\n dependencies = new Set();\n dependenciesByChunk.set(chunk, dependencies);\n }\n\n if (chunk.hasRuntime()) {\n for (const asyncChunk of chunk.getAllAsyncChunks()) {\n if (!nonJsChunks.has(asyncChunk)) {\n unprocessedDependencies.add(asyncChunk);\n dependencies.add(asyncChunk);\n\n let dependents: Set<Chunk> | undefined = dependentsByChunk.get(asyncChunk);\n if (!dependents) {\n dependents = new Set();\n dependentsByChunk.set(asyncChunk, dependents);\n }\n\n dependents.add(chunk);\n\n if (!unprocessedChunks.has(asyncChunk)) {\n compilation.errors.push(\n new thisWebpack.WebpackError(\n `Found an async chunk that was not included in the compilation: ${asyncChunk.id} ` +\n `(reason: ${asyncChunk.chunkReason}).`\n )\n );\n }\n }\n }\n }\n }\n\n const hashReplacementsByChunk: Map<Chunk, IHashReplacement> = new Map();\n let previousSize: number = -1;\n while (unprocessedChunks.size > 0) {\n const currentSize: number = unprocessedChunks.size;\n if (currentSize === previousSize) {\n compilation.errors.push(\n new thisWebpack.WebpackError(\n `Detected a cycle in the chunk dependencies. This should not be possible.`\n )\n );\n\n break;\n }\n\n previousSize = currentSize;\n\n for (const chunk of unprocessedChunks) {\n if (unprocessedDependenciesByChunk.get(chunk)?.size === 0) {\n // TODO: do we need to check if the chunk is rendered?\n if (!chunk.renderedHash) {\n compilation.errors.push(\n new thisWebpack.WebpackError(`Could not find the hash for chunk ${chunk.id}.`)\n );\n } else {\n const existingHash: string = chunk.contentHash.javascript;\n const chunkDependencies: Set<Chunk> | undefined = dependenciesByChunk.get(chunk);\n if (!chunkDependencies) {\n compilation.errors.push(\n new thisWebpack.WebpackError(`Could not find dependencies for chunk ${chunk.id}.`)\n );\n } else {\n function processChunkAsset(\n jsAssetName: string,\n locale: string | undefined\n ): IProcessChunkAssetResult | undefined {\n const asset: Readonly<Asset> | undefined = compilation.getAsset(jsAssetName);\n if (!asset) {\n compilation.errors.push(\n new thisWebpack.WebpackError(`Could not find asset \"${jsAssetName}\" for chunk ${chunk.id}.`)\n );\n } else {\n let assetSource: sources.Source = asset.source;\n const assetName: string = asset.name;\n if (chunkDependencies!.size > 0) {\n const relevantHashReplacements: Map<string, string> = new Map();\n let hasAnyReplacements: boolean = false;\n for (const dependency of chunkDependencies!) {\n const asyncChunkHashReplacements: IHashReplacement | undefined =\n hashReplacementsByChunk.get(dependency);\n if (!asyncChunkHashReplacements) {\n compilation.errors.push(\n new thisWebpack.WebpackError(\n `Could not find hash replacements for chunk ${dependency.id}.`\n )\n );\n } else {\n const { existingHash: otherChunkExistingHash, trueHashByLocale } =\n asyncChunkHashReplacements;\n let replacementHash: string | undefined;\n if (typeof trueHashByLocale === 'object') {\n if (locale) {\n replacementHash = trueHashByLocale[locale];\n }\n } else {\n replacementHash = trueHashByLocale;\n }\n\n if (replacementHash) {\n if (relevantHashReplacements.has(otherChunkExistingHash)) {\n compilation.errors.push(\n new thisWebpack.WebpackError(\n `Found multiple replacements for hash ${otherChunkExistingHash} ` +\n `in chunk ${chunk.id}.`\n )\n );\n } else {\n relevantHashReplacements.set(otherChunkExistingHash, replacementHash);\n hasAnyReplacements = true;\n }\n }\n }\n }\n\n if (hasAnyReplacements) {\n const sourceString: string = assetSource.source().toString();\n const replaceSource: sources.ReplaceSource = new thisWebpack.sources.ReplaceSource(\n assetSource,\n assetName\n );\n\n const regexp: RegExp = new RegExp(\n Array.from(relevantHashReplacements.keys())\n .map((hashToReplace) => Text.escapeRegExp(hashToReplace))\n .join('|'),\n 'g'\n );\n let match: RegExpMatchArray | null;\n while ((match = regexp.exec(sourceString)) !== null) {\n const { 0: originalHash, index } = match;\n const matchStart: number = index!;\n const matchEnd: number = matchStart + originalHash.length - 1;\n const replacement: string = relevantHashReplacements.get(originalHash)!;\n replaceSource.replace(matchStart, matchEnd, replacement);\n }\n\n assetSource = replaceSource;\n compilation.updateAsset(jsAssetName, assetSource);\n }\n }\n\n if (jsAssetName.includes(existingHash)) {\n const trueHash: string = hashFn(assetSource.buffer());\n if (trueHash !== existingHash) {\n const newJsFilename: string = jsAssetName.replace(existingHash, trueHash);\n compilation.renameAsset(jsAssetName, newJsFilename);\n\n if (locale) {\n const filesForChunkName: Record<string, string> | undefined = filesByChunkName?.get(\n chunk.name\n );\n if (filesForChunkName) {\n filesForChunkName[locale] = newJsFilename;\n }\n }\n\n return {\n trueHash,\n newJsFilename\n };\n }\n }\n }\n }\n\n const localizedFiles: Record<string, string> | undefined = (chunk as ILocalizedWebpackChunk)\n .localizedFiles;\n if (localizedFiles) {\n const trueHashByLocale: Record<string, string> = {};\n hashReplacementsByChunk.set(chunk, {\n existingHash,\n trueHashByLocale\n });\n for (const [locale, jsAssetName] of Object.entries(localizedFiles)) {\n const processAssetResult: IProcessChunkAssetResult | undefined = processChunkAsset(\n jsAssetName,\n locale\n );\n if (processAssetResult) {\n const { trueHash, newJsFilename } = processAssetResult;\n trueHashByLocale[locale] = trueHash;\n localizedFiles[locale] = newJsFilename;\n }\n }\n } else {\n const assetNames: string[] = Array.from(chunk.files);\n let jsAssetName: string | undefined;\n for (const assetName of assetNames) {\n if (assetName.endsWith('.js')) {\n if (jsAssetName) {\n compilation.errors.push(\n new thisWebpack.WebpackError(`Found multiple .js assets for chunk ${chunk.id}.`)\n );\n } else {\n jsAssetName = assetName;\n }\n }\n }\n\n if (!jsAssetName) {\n compilation.errors.push(\n new thisWebpack.WebpackError(`Could not find a .js asset for chunk ${chunk.id}.`)\n );\n } else {\n const { trueHash, newJsFilename } = processChunkAsset(jsAssetName, undefined) ?? {};\n hashReplacementsByChunk.set(chunk, { existingHash, trueHashByLocale: trueHash });\n if (newJsFilename) {\n chunk.files.delete(jsAssetName);\n chunk.files.add(newJsFilename);\n }\n }\n }\n }\n\n unprocessedChunks.delete(chunk);\n const dependents: Set<Chunk> | undefined = dependentsByChunk.get(chunk);\n if (dependents) {\n for (const dependent of dependents) {\n unprocessedDependenciesByChunk.get(dependent)?.delete(chunk);\n }\n }\n }\n }\n }\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import type { LoaderContext } from 'webpack';
2
- import { type ITerminalProvider } from '@rushstack/node-core-library';
2
+ import { type ITerminalProvider } from '@rushstack/terminal';
3
3
  export declare class LoaderTerminalProvider {
4
4
  static getTerminalProviderForLoader(loaderContext: LoaderContext<{}>): ITerminalProvider;
5
5
  }
@@ -1 +1 @@
1
- {"version":3,"file":"LoaderTerminalProvider.d.ts","sourceRoot":"","sources":["../../src/utilities/LoaderTerminalProvider.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,KAAK,iBAAiB,EAA4B,MAAM,8BAA8B,CAAC;AAEhG,qBAAa,sBAAsB;WACnB,4BAA4B,CAAC,aAAa,EAAE,aAAa,CAAC,EAAE,CAAC,GAAG,iBAAiB;CAmBhG"}
1
+ {"version":3,"file":"LoaderTerminalProvider.d.ts","sourceRoot":"","sources":["../../src/utilities/LoaderTerminalProvider.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,KAAK,iBAAiB,EAA4B,MAAM,qBAAqB,CAAC;AAEvF,qBAAa,sBAAsB;WACnB,4BAA4B,CAAC,aAAa,EAAE,aAAa,CAAC,EAAE,CAAC,GAAG,iBAAiB;CAmBhG"}
@@ -3,7 +3,7 @@
3
3
  // See LICENSE in the project root for license information.
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
5
5
  exports.LoaderTerminalProvider = void 0;
6
- const node_core_library_1 = require("@rushstack/node-core-library");
6
+ const terminal_1 = require("@rushstack/terminal");
7
7
  class LoaderTerminalProvider {
8
8
  static getTerminalProviderForLoader(loaderContext) {
9
9
  return {
@@ -11,11 +11,11 @@ class LoaderTerminalProvider {
11
11
  eolCharacter: '\n',
12
12
  write: (data, severity) => {
13
13
  switch (severity) {
14
- case node_core_library_1.TerminalProviderSeverity.error: {
14
+ case terminal_1.TerminalProviderSeverity.error: {
15
15
  loaderContext.emitError(new Error(data));
16
16
  break;
17
17
  }
18
- case node_core_library_1.TerminalProviderSeverity.warning: {
18
+ case terminal_1.TerminalProviderSeverity.warning: {
19
19
  loaderContext.emitWarning(new Error(data));
20
20
  break;
21
21
  }
@@ -1 +1 @@
1
- {"version":3,"file":"LoaderTerminalProvider.js","sourceRoot":"","sources":["../../src/utilities/LoaderTerminalProvider.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAG3D,oEAAgG;AAEhG,MAAa,sBAAsB;IAC1B,MAAM,CAAC,4BAA4B,CAAC,aAAgC;QACzE,OAAO;YACL,aAAa,EAAE,KAAK;YACpB,YAAY,EAAE,IAAI;YAClB,KAAK,EAAE,CAAC,IAAY,EAAE,QAAkC,EAAE,EAAE;gBAC1D,QAAQ,QAAQ,EAAE,CAAC;oBACjB,KAAK,4CAAwB,CAAC,KAAK,CAAC,CAAC,CAAC;wBACpC,aAAa,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;wBACzC,MAAM;oBACR,CAAC;oBAED,KAAK,4CAAwB,CAAC,OAAO,CAAC,CAAC,CAAC;wBACtC,aAAa,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;wBAC3C,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF;AApBD,wDAoBC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport type { LoaderContext } from 'webpack';\nimport { type ITerminalProvider, TerminalProviderSeverity } from '@rushstack/node-core-library';\n\nexport class LoaderTerminalProvider {\n public static getTerminalProviderForLoader(loaderContext: LoaderContext<{}>): ITerminalProvider {\n return {\n supportsColor: false,\n eolCharacter: '\\n',\n write: (data: string, severity: TerminalProviderSeverity) => {\n switch (severity) {\n case TerminalProviderSeverity.error: {\n loaderContext.emitError(new Error(data));\n break;\n }\n\n case TerminalProviderSeverity.warning: {\n loaderContext.emitWarning(new Error(data));\n break;\n }\n }\n }\n };\n }\n}\n"]}
1
+ {"version":3,"file":"LoaderTerminalProvider.js","sourceRoot":"","sources":["../../src/utilities/LoaderTerminalProvider.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAG3D,kDAAuF;AAEvF,MAAa,sBAAsB;IAC1B,MAAM,CAAC,4BAA4B,CAAC,aAAgC;QACzE,OAAO;YACL,aAAa,EAAE,KAAK;YACpB,YAAY,EAAE,IAAI;YAClB,KAAK,EAAE,CAAC,IAAY,EAAE,QAAkC,EAAE,EAAE;gBAC1D,QAAQ,QAAQ,EAAE,CAAC;oBACjB,KAAK,mCAAwB,CAAC,KAAK,CAAC,CAAC,CAAC;wBACpC,aAAa,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;wBACzC,MAAM;oBACR,CAAC;oBAED,KAAK,mCAAwB,CAAC,OAAO,CAAC,CAAC,CAAC;wBACtC,aAAa,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;wBAC3C,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF;AApBD,wDAoBC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport type { LoaderContext } from 'webpack';\nimport { type ITerminalProvider, TerminalProviderSeverity } from '@rushstack/terminal';\n\nexport class LoaderTerminalProvider {\n public static getTerminalProviderForLoader(loaderContext: LoaderContext<{}>): ITerminalProvider {\n return {\n supportsColor: false,\n eolCharacter: '\\n',\n write: (data: string, severity: TerminalProviderSeverity) => {\n switch (severity) {\n case TerminalProviderSeverity.error: {\n loaderContext.emitError(new Error(data));\n break;\n }\n\n case TerminalProviderSeverity.warning: {\n loaderContext.emitWarning(new Error(data));\n break;\n }\n }\n }\n };\n }\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { Chunk, ChunkGraph } from 'webpack';
2
+ export declare function chunkIsJs(chunk: Chunk, chunkGraph: ChunkGraph): boolean;
3
+ //# sourceMappingURL=chunkUtilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunkUtilities.d.ts","sourceRoot":"","sources":["../../src/utilities/chunkUtilities.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEjD,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO,CAEvE"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ // Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
3
+ // See LICENSE in the project root for license information.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.chunkIsJs = void 0;
6
+ function chunkIsJs(chunk, chunkGraph) {
7
+ return !!chunkGraph.getChunkModulesIterableBySourceType(chunk, 'javascript');
8
+ }
9
+ exports.chunkIsJs = chunkIsJs;
10
+ //# sourceMappingURL=chunkUtilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunkUtilities.js","sourceRoot":"","sources":["../../src/utilities/chunkUtilities.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAI3D,SAAgB,SAAS,CAAC,KAAY,EAAE,UAAsB;IAC5D,OAAO,CAAC,CAAC,UAAU,CAAC,mCAAmC,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;AAC/E,CAAC;AAFD,8BAEC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport type { Chunk, ChunkGraph } from 'webpack';\n\nexport function chunkIsJs(chunk: Chunk, chunkGraph: ChunkGraph): boolean {\n return !!chunkGraph.getChunkModulesIterableBySourceType(chunk, 'javascript');\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rushstack/webpack5-localization-plugin",
3
- "version": "0.8.0",
3
+ "version": "0.9.0",
4
4
  "description": "This plugin facilitates localization with Webpack.",
5
5
  "main": "lib/index.js",
6
6
  "typings": "dist/webpack5-localization-plugin.d.ts",
@@ -15,13 +15,14 @@
15
15
  "@types/node": "*"
16
16
  },
17
17
  "dependencies": {
18
- "@rushstack/localization-utilities": "0.9.23",
19
- "@rushstack/node-core-library": "3.66.0"
18
+ "@rushstack/localization-utilities": "0.9.25",
19
+ "@rushstack/node-core-library": "4.0.0",
20
+ "@rushstack/terminal": "0.8.0"
20
21
  },
21
22
  "devDependencies": {
22
23
  "memfs": "3.4.3",
23
24
  "webpack": "~5.82.1",
24
- "@rushstack/heft": "0.64.6",
25
+ "@rushstack/heft": "0.64.8",
25
26
  "local-node-rig": "1.0.0"
26
27
  },
27
28
  "peerDependenciesMeta": {