@rushstack/webpack5-localization-plugin 0.7.2 → 0.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,7 +5,7 @@
5
5
  "toolPackages": [
6
6
  {
7
7
  "packageName": "@microsoft/api-extractor",
8
- "packageVersion": "7.40.0"
8
+ "packageVersion": "7.40.1"
9
9
  }
10
10
  ]
11
11
  }
@@ -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,EAAyB,MAAM,SAAS,CAAC;AAUtF,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,CAS7F;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;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"}
package/lib/trueHashes.js CHANGED
@@ -5,13 +5,14 @@ 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
7
  function getHashFunction({ thisWebpack, compilation }) {
8
- const { hashFunction = 'md5', hashDigest = 'hex', hashDigestLength } = compilation.outputOptions;
9
- return (contents) => thisWebpack.util
10
- .createHash(hashFunction)
11
- .update(contents)
12
- .digest(hashDigest)
13
- .toString()
14
- .slice(0, hashDigestLength);
8
+ const { hashFunction = 'md5', hashDigest = 'hex', hashDigestLength, hashSalt } = compilation.outputOptions;
9
+ return (contents) => {
10
+ const hash = thisWebpack.util.createHash(hashFunction);
11
+ if (hashSalt) {
12
+ hash.update(hashSalt, 'utf-8');
13
+ }
14
+ return hash.update(contents).digest(hashDigest).toString().slice(0, hashDigestLength);
15
+ };
15
16
  }
16
17
  exports.getHashFunction = getHashFunction;
17
18
  function updateAssetHashes({ thisWebpack, compilation, hashFn, filesByChunkName }) {
@@ -1 +1 @@
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 } 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\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 } = compilation.outputOptions;\n return (contents: string | Buffer) =>\n thisWebpack.util\n .createHash(hashFunction)\n .update(contents)\n .digest(hashDigest)\n .toString()\n .slice(0, hashDigestLength);\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';\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rushstack/webpack5-localization-plugin",
3
- "version": "0.7.2",
3
+ "version": "0.7.3",
4
4
  "description": "This plugin facilitates localization with Webpack.",
5
5
  "main": "lib/index.js",
6
6
  "typings": "dist/webpack5-localization-plugin.d.ts",
@@ -21,8 +21,8 @@
21
21
  "devDependencies": {
22
22
  "memfs": "3.4.3",
23
23
  "webpack": "~5.82.1",
24
- "@rushstack/heft": "0.64.6",
25
- "local-node-rig": "1.0.0"
24
+ "local-node-rig": "1.0.0",
25
+ "@rushstack/heft": "0.64.6"
26
26
  },
27
27
  "peerDependenciesMeta": {
28
28
  "@types/node": {