diff --git a/e2e/__tests__/crawlSymlinks.test.ts b/e2e/__tests__/crawlSymlinks.test.ts index 93ee50147b9b..bb4e4b573379 100644 --- a/e2e/__tests__/crawlSymlinks.test.ts +++ b/e2e/__tests__/crawlSymlinks.test.ts @@ -75,8 +75,6 @@ test('Should throw if watchman used with haste.enableSymlinks', () => { expect(stderr).toMatchInlineSnapshot(` "Validation Error: - haste.enableSymlinks is incompatible with watchman - Either set haste.enableSymlinks to false or do not use watchman" `); expect(exitCode).toBe(1); diff --git a/e2e/babel-plugin-jest-hoist/__tests__/typescript.test.ts b/e2e/babel-plugin-jest-hoist/__tests__/typescript.test.ts index bc27a66d5bcf..64d7cec8c0ad 100644 --- a/e2e/babel-plugin-jest-hoist/__tests__/typescript.test.ts +++ b/e2e/babel-plugin-jest-hoist/__tests__/typescript.test.ts @@ -11,7 +11,7 @@ import {color} from '../entry'; import type {Color} from '../types'; -jest.mock('some-module', () => ({} as Partial<{}>), {virtual: true}); +jest.mock('some-module', () => ({}) as Partial<{}>, {virtual: true}); jest.mock('../entry', () => { const color: Color = 'blue'; diff --git a/package.json b/package.json index 5634746093aa..bed99685fa29 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "eslint-plugin-jsdoc": "^46.0.0", "eslint-plugin-local": "link:./.eslintplugin", "eslint-plugin-markdown": "^3.0.0", - "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-prettier": "^5.0.0", "execa": "^5.0.0", "find-process": "^1.4.1", "glob": "^8.0.0", @@ -66,7 +66,7 @@ "node-notifier": "^10.0.0", "p-limit": "^3.1.0", "pkg-dir": "^5.0.0", - "prettier": "^2.1.1", + "prettier": "^3.0.0", "promise": "^8.0.2", "read-pkg": "^5.2.0", "resolve": "^1.20.0", diff --git a/packages/babel-plugin-jest-hoist/package.json b/packages/babel-plugin-jest-hoist/package.json index 3698c80ff7a9..4bc624b68e15 100644 --- a/packages/babel-plugin-jest-hoist/package.json +++ b/packages/babel-plugin-jest-hoist/package.json @@ -31,9 +31,8 @@ "@babel/preset-typescript": "^7.0.0", "@types/babel__template": "^7.0.2", "@types/node": "*", - "@types/prettier": "^2.1.5", "babel-plugin-tester": "^11.0.2", - "prettier": "^2.1.1" + "prettier": "^3.0.0" }, "publishConfig": { "access": "public" diff --git a/packages/expect/src/asymmetricMatchers.ts b/packages/expect/src/asymmetricMatchers.ts index 1eb9c52fa66d..2ce48f4e53f1 100644 --- a/packages/expect/src/asymmetricMatchers.ts +++ b/packages/expect/src/asymmetricMatchers.ts @@ -69,7 +69,10 @@ export abstract class AsymmetricMatcher { $$typeof = Symbol.for('jest.asymmetricMatcher'); - constructor(protected sample: T, protected inverse = false) {} + constructor( + protected sample: T, + protected inverse = false, + ) {} protected getMatcherContext(): MatcherContext { return { diff --git a/packages/expect/src/types.ts b/packages/expect/src/types.ts index 96e858dad93d..476f5cf80596 100644 --- a/packages/expect/src/types.ts +++ b/packages/expect/src/types.ts @@ -22,7 +22,8 @@ export type ExpectationResult = SyncExpectationResult | AsyncExpectationResult; export type MatcherFunctionWithContext< Context extends MatcherContext = MatcherContext, - Expected extends Array = [] /** TODO should be: extends Array = [] */, + Expected extends + Array = [] /** TODO should be: extends Array = [] */, > = ( this: Context, actual: unknown, @@ -99,9 +100,9 @@ export interface BaseExpect { } export type Expect = { - (actual: T): Matchers & - Inverse> & - PromiseMatchers; + ( + actual: T, + ): Matchers & Inverse> & PromiseMatchers; } & BaseExpect & AsymmetricMatchers & Inverse>; diff --git a/packages/jest-core/src/__tests__/watch.test.js b/packages/jest-core/src/__tests__/watch.test.js index 7f412e1561a3..20137d6bd2e2 100644 --- a/packages/jest-core/src/__tests__/watch.test.js +++ b/packages/jest-core/src/__tests__/watch.test.js @@ -630,7 +630,7 @@ describe('Watch mode flows', () => { }); it.each` - ok | option + ok | option ${'✔︎'} | ${'bail'} ${'✖︎'} | ${'changedFilesWithAncestor'} ${'✔︎'} | ${'changedSince'} diff --git a/packages/jest-core/src/lib/__tests__/logDebugMessages.test.ts b/packages/jest-core/src/lib/__tests__/logDebugMessages.test.ts index fa4c4910ad66..1b08341df2c7 100644 --- a/packages/jest-core/src/lib/__tests__/logDebugMessages.test.ts +++ b/packages/jest-core/src/lib/__tests__/logDebugMessages.test.ts @@ -18,7 +18,7 @@ const getOutputStream = (resolve: (message: string) => void) => write(message: string) { resolve(message); }, - } as NodeJS.WriteStream); + }) as NodeJS.WriteStream; it('prints the jest version', async () => { expect.assertions(1); diff --git a/packages/jest-core/src/watch.ts b/packages/jest-core/src/watch.ts index 5671e2b5be2b..60c39fd1744c 100644 --- a/packages/jest-core/src/watch.ts +++ b/packages/jest-core/src/watch.ts @@ -496,8 +496,8 @@ const checkForConflicts = ( .join(' and '); error = ` Watch plugins ${plugins} both attempted to register key ${chalk.bold.red( - `<${key}>`, - )}. + `<${key}>`, + )}. Please change the key configuration for one of the conflicting plugins to avoid overlap.`.trim(); } diff --git a/packages/jest-each/src/table/array.ts b/packages/jest-each/src/table/array.ts index 4a90b8a76d37..740a5a0abecd 100644 --- a/packages/jest-each/src/table/array.ts +++ b/packages/jest-each/src/table/array.ts @@ -60,16 +60,19 @@ const formatTitle = ( rowIndex: number, ): string => row - .reduce((formattedTitle, value) => { - const [placeholder] = getMatchingPlaceholders(formattedTitle); - const normalisedValue = normalisePlaceholderValue(value); - if (!placeholder) return formattedTitle; + .reduce( + (formattedTitle, value) => { + const [placeholder] = getMatchingPlaceholders(formattedTitle); + const normalisedValue = normalisePlaceholderValue(value); + if (!placeholder) return formattedTitle; - if (placeholder === PRETTY_PLACEHOLDER) - return interpolatePrettyPlaceholder(formattedTitle, normalisedValue); + if (placeholder === PRETTY_PLACEHOLDER) + return interpolatePrettyPlaceholder(formattedTitle, normalisedValue); - return util.format(formattedTitle, normalisedValue); - }, interpolateTitleIndex(interpolateEscapedPlaceholders(title), rowIndex)) + return util.format(formattedTitle, normalisedValue); + }, + interpolateTitleIndex(interpolateEscapedPlaceholders(title), rowIndex), + ) .replace(new RegExp(JEST_EACH_PLACEHOLDER_ESCAPE, 'g'), PLACEHOLDER_PREFIX); const normalisePlaceholderValue = (value: unknown) => diff --git a/packages/jest-expect/src/types.ts b/packages/jest-expect/src/types.ts index 35cd086ee94d..7cceee6d01b1 100644 --- a/packages/jest-expect/src/types.ts +++ b/packages/jest-expect/src/types.ts @@ -13,7 +13,9 @@ import type { } from 'jest-snapshot'; export type JestExpect = { - (actual: T): JestMatchers & + ( + actual: T, + ): JestMatchers & Inverse> & PromiseMatchers; // Duplicated due to https://github.com/microsoft/rushstack/issues/1709 diff --git a/packages/jest-jasmine2/src/__tests__/reporter.test.ts b/packages/jest-jasmine2/src/__tests__/reporter.test.ts index c5d2c29cd998..652bed3482af 100644 --- a/packages/jest-jasmine2/src/__tests__/reporter.test.ts +++ b/packages/jest-jasmine2/src/__tests__/reporter.test.ts @@ -24,7 +24,7 @@ describe('Jasmine2Reporter', () => { description: 'description', failedExpectations: [], fullName: name, - } as any as SpecResult); + }) as any as SpecResult; reporter.suiteStarted({description: 'parent'} as SuiteResult); reporter.suiteStarted({description: 'child'} as SuiteResult); reporter.specDone(makeSpec('spec 1')); diff --git a/packages/jest-mock/src/index.ts b/packages/jest-mock/src/index.ts index 8989c5320bf3..25fbe03f69ff 100644 --- a/packages/jest-mock/src/index.ts +++ b/packages/jest-mock/src/index.ts @@ -743,8 +743,7 @@ export class ModuleMocker { } return finalReturnValue; - }, - metadata.length || 0); + }, metadata.length || 0); const f = this._createMockFunction(metadata, mockConstructor) as Mock; f._isMockFunction = true; diff --git a/packages/jest-snapshot/package.json b/packages/jest-snapshot/package.json index 67fd5ea7aaf6..69b9f8fa5a77 100644 --- a/packages/jest-snapshot/package.json +++ b/packages/jest-snapshot/package.json @@ -25,6 +25,7 @@ "@jest/expect-utils": "workspace:^", "@jest/transform": "workspace:^", "@jest/types": "workspace:^", + "@prettier/sync": "^0.3.0", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", "expect": "workspace:^", @@ -46,11 +47,10 @@ "@types/babel__core": "^7.1.14", "@types/graceful-fs": "^4.1.3", "@types/natural-compare": "^1.4.0", - "@types/prettier": "^2.1.5", "@types/semver": "^7.1.0", "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", - "prettier": "^2.1.1", + "prettier": "^3.0.0", "tsd-lite": "^0.7.0" }, "engines": { diff --git a/packages/jest-snapshot/src/InlineSnapshots.ts b/packages/jest-snapshot/src/InlineSnapshots.ts index 0f7fdb870874..ec5576968a59 100644 --- a/packages/jest-snapshot/src/InlineSnapshots.ts +++ b/packages/jest-snapshot/src/InlineSnapshots.ts @@ -14,6 +14,7 @@ import type { Program, TraversalAncestors, } from '@babel/types'; +import {createSynchronizedPrettier} from '@prettier/sync'; import * as fs from 'graceful-fs'; import type { CustomParser as PrettierCustomParser, @@ -60,6 +61,10 @@ export function saveInlineSnapshots( try { // @ts-expect-error requireOutside Babel transform prettier = requireOutside(prettierPath) as Prettier; + + if (semver.gte(prettier.version, '3.0.0')) { + prettier = createSynchronizedPrettier({prettierEntry: prettierPath}); + } } catch { // Continue even if prettier is not installed. } @@ -292,7 +297,7 @@ const runPrettier = ( // Resolve project configuration. // For older versions of Prettier, do not load configuration. const config = prettier.resolveConfig - ? prettier.resolveConfig.sync(sourceFilePath, {editorconfig: true}) + ? prettier.resolveConfig(sourceFilePath, {editorconfig: true}) : null; // Prioritize parser found in the project config. @@ -302,7 +307,7 @@ const runPrettier = ( const inferredParser: PrettierParserName | null | undefined = (config && typeof config.parser === 'string' && config.parser) || (prettier.getFileInfo - ? prettier.getFileInfo.sync(sourceFilePath).inferredParser + ? prettier.getFileInfo(sourceFilePath).inferredParser : simpleDetectParser(sourceFilePath)); if (!inferredParser) { diff --git a/packages/jest-types/src/Global.ts b/packages/jest-types/src/Global.ts index ea15a036913c..2fae1a2ffadc 100644 --- a/packages/jest-types/src/Global.ts +++ b/packages/jest-types/src/Global.ts @@ -57,35 +57,46 @@ export type EachTestFn = ( interface Each { // when the table is an array of object literals - >(table: ReadonlyArray): ( + >( + table: ReadonlyArray, + ): ( name: string | NameLike, fn: (arg: T, done: DoneFn) => ReturnType, timeout?: number, ) => void; // when the table is an array of tuples - ]>(table: ReadonlyArray): ( + ]>( + table: ReadonlyArray, + ): ( name: string | NameLike, fn: (...args: T) => ReturnType, timeout?: number, ) => void; // when the table is an array of arrays - >(table: ReadonlyArray): ( + >( + table: ReadonlyArray, + ): ( name: string | NameLike, fn: (...args: T) => ReturnType, timeout?: number, ) => void; // when the table is a tuple or array - (table: ReadonlyArray): ( + ( + table: ReadonlyArray, + ): ( name: string | NameLike, fn: (arg: T, done: DoneFn) => ReturnType, timeout?: number, ) => void; // when the table is a template literal - (strings: TemplateStringsArray, ...expressions: Array): ( + ( + strings: TemplateStringsArray, + ...expressions: Array + ): ( name: string | NameLike, fn: (arg: Record, done: DoneFn) => ReturnType, timeout?: number, diff --git a/packages/jest-worker/src/base/__tests__/BaseWorkerPool.test.ts b/packages/jest-worker/src/base/__tests__/BaseWorkerPool.test.ts index b5b83482d5fb..2b85ac18cc98 100644 --- a/packages/jest-worker/src/base/__tests__/BaseWorkerPool.test.ts +++ b/packages/jest-worker/src/base/__tests__/BaseWorkerPool.test.ts @@ -34,12 +34,12 @@ describe('BaseWorkerPool', () => { ({ forceExit: jest.fn(), getStderr: () => - ({once() {}, pipe() {}} as unknown as NodeJS.ReadStream), + ({once() {}, pipe() {}}) as unknown as NodeJS.ReadStream, getStdout: () => - ({once() {}, pipe() {}} as unknown as NodeJS.ReadStream), + ({once() {}, pipe() {}}) as unknown as NodeJS.ReadStream, send: jest.fn(), waitForExit: () => Promise.resolve(), - } as unknown as WorkerInterface), + }) as unknown as WorkerInterface, ); }); @@ -138,15 +138,15 @@ describe('BaseWorkerPool', () => { pipe(errStream: NodeJS.WritableStream) { err.push(errStream); }, - } as unknown as NodeJS.ReadableStream), + }) as unknown as NodeJS.ReadableStream, getStdout: () => ({ once() {}, pipe(outStream: NodeJS.WritableStream) { out.push(outStream); }, - } as unknown as NodeJS.ReadableStream), - } as WorkerInterface), + }) as unknown as NodeJS.ReadableStream, + }) as WorkerInterface, ); const farm = new MockWorkerPool('/tmp/baz.js', { @@ -181,7 +181,7 @@ describe('BaseWorkerPool', () => { getStderr: () => null, getStdout: () => null, send: () => null, - } as unknown as WorkerInterface), + }) as unknown as WorkerInterface, ); const farm = new MockWorkerPool('/tmp/baz.js', { @@ -225,7 +225,7 @@ describe('BaseWorkerPool', () => { getStdout: () => null, send: jest.fn(), waitForExit: () => Promise.resolve(), - } as unknown as WorkerInterface), + }) as unknown as WorkerInterface, ); const pool = new MockWorkerPool('/tmp/baz.js', { @@ -253,7 +253,7 @@ describe('BaseWorkerPool', () => { send: jest.fn(), waitForExit: () => new Promise(resolve => (worker0Exited = resolve)), - } as unknown as WorkerInterface), + }) as unknown as WorkerInterface, ).mockImplementation( () => ({ @@ -262,7 +262,7 @@ describe('BaseWorkerPool', () => { getStdout: () => null, send: jest.fn(), waitForExit: () => Promise.resolve(), - } as unknown as WorkerInterface), + }) as unknown as WorkerInterface, ); const pool = new MockWorkerPool('/tmp/baz.js', { diff --git a/scripts/build.mjs b/scripts/build.mjs index 50dc12493c66..0b508e2eb3af 100644 --- a/scripts/build.mjs +++ b/scripts/build.mjs @@ -24,7 +24,7 @@ import chalk from 'chalk'; import glob from 'glob'; import fs from 'graceful-fs'; import micromatch from 'micromatch'; -import prettier from 'prettier'; +import * as prettier from 'prettier'; import transformOptions from '../babel.config.js'; import { OK, @@ -42,7 +42,7 @@ const IGNORE_PATTERN = '**/__{tests,mocks}__/**'; const INLINE_REQUIRE_EXCLUDE_LIST = /packages\/expect|(jest-(circus|diff|get-type|jasmine2|matcher-utils|message-util|regex-util|snapshot))|pretty-format\//; -const prettierConfig = prettier.resolveConfig.sync( +const prettierConfig = await prettier.resolveConfig( fileURLToPath(import.meta.url), ); prettierConfig.trailingComma = 'none'; @@ -60,13 +60,13 @@ function getBuildPath(file, buildFolder) { return path.resolve(pkgBuildPath, relativeToSrcPath).replace(/\.ts$/, '.js'); } -function buildNodePackage({packageDir, pkg}) { +async function buildNodePackage({packageDir, pkg}) { const srcDir = path.resolve(packageDir, SRC_DIR); const files = glob.sync('**/*', {absolute: true, cwd: srcDir, nodir: true}); process.stdout.write(adjustToTerminalWidth(`${pkg.name}\n`)); - files.forEach(file => buildFile(file, true)); + await Promise.all(files.map(file => buildFile(file))); assert.ok( fs.existsSync(path.resolve(packageDir, pkg.main)), @@ -76,7 +76,7 @@ function buildNodePackage({packageDir, pkg}) { process.stdout.write(`${OK}\n`); } -function buildFile(file, silent) { +async function buildFile(file, silent) { const destPath = getBuildPath(file, BUILD_DIR); if (micromatch.isMatch(file, IGNORE_PATTERN)) { @@ -131,7 +131,7 @@ function buildFile(file, silent) { } const transformed = babel.transformFileSync(file, options).code; - const prettyCode = prettier.format(transformed, prettierConfig); + const prettyCode = await prettier.format(transformed, prettierConfig); fs.writeFileSync(destPath, prettyCode); @@ -150,9 +150,13 @@ function buildFile(file, silent) { const files = process.argv.slice(2); if (files.length) { - files.forEach(file => buildFile(file)); + for (const file of files) { + await buildFile(file); + } } else { const packages = getPackages(); process.stdout.write(chalk.inverse(' Building packages \n')); - packages.forEach(buildNodePackage); + for (const pkg of packages) { + await buildNodePackage(pkg); + } } diff --git a/scripts/bundleTs.mjs b/scripts/bundleTs.mjs index a9c6d5310743..898f80b76ce0 100644 --- a/scripts/bundleTs.mjs +++ b/scripts/bundleTs.mjs @@ -20,7 +20,7 @@ import prettier from 'prettier'; import {rimraf} from 'rimraf'; import {getPackages} from './buildUtils.mjs'; -const prettierConfig = prettier.resolveConfig.sync( +const prettierConfig = await prettier.resolveConfig( fileURLToPath(import.meta.url).replace(/\.js$/, '.d.ts'), ); @@ -194,7 +194,7 @@ await Promise.all( ...definitionFile.split(copyrightSnippet), ].join('\n'); - const formattedContent = prettier.format(definitionFile, { + const formattedContent = await prettier.format(definitionFile, { ...prettierConfig, filepath, }); diff --git a/yarn.lock b/yarn.lock index 5ef9f5d9c7bb..754df8db1e1e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2886,7 +2886,7 @@ __metadata: eslint-plugin-jsdoc: ^46.0.0 eslint-plugin-local: "link:./.eslintplugin" eslint-plugin-markdown: ^3.0.0 - eslint-plugin-prettier: ^4.0.0 + eslint-plugin-prettier: ^5.0.0 execa: ^5.0.0 find-process: ^1.4.1 glob: ^8.0.0 @@ -2913,7 +2913,7 @@ __metadata: node-notifier: ^10.0.0 p-limit: ^3.1.0 pkg-dir: ^5.0.0 - prettier: ^2.1.1 + prettier: ^3.0.0 promise: ^8.0.2 read-pkg: ^5.2.0 resolve: ^1.20.0 @@ -3824,6 +3824,15 @@ __metadata: languageName: node linkType: hard +"@prettier/sync@npm:^0.3.0": + version: 0.3.0 + resolution: "@prettier/sync@npm:0.3.0" + peerDependencies: + prettier: ^3.0.0 + checksum: a663ceca292629c66c2c983662293b047b48435942c25b7ea76f0eab899e434f2bc17ae3dce56ee66b29929f7853118073f716fd4c7dabc3cccf78458a168dd4 + languageName: node + linkType: hard + "@react-native-community/cli-clean@npm:^10.1.1": version: 10.1.1 resolution: "@react-native-community/cli-clean@npm:10.1.1" @@ -4981,13 +4990,6 @@ __metadata: languageName: node linkType: hard -"@types/prettier@npm:^2.1.5": - version: 2.7.3 - resolution: "@types/prettier@npm:2.7.3" - checksum: 705384209cea6d1433ff6c187c80dcc0b95d99d5c5ce21a46a9a58060c527973506822e428789d842761e0280d25e3359300f017fbe77b9755bc772ab3dc2f83 - languageName: node - linkType: hard - "@types/prompts@npm:^2.0.1": version: 2.4.4 resolution: "@types/prompts@npm:2.4.4" @@ -6366,9 +6368,8 @@ __metadata: "@types/babel__template": ^7.0.2 "@types/babel__traverse": ^7.0.6 "@types/node": "*" - "@types/prettier": ^2.1.5 babel-plugin-tester: ^11.0.2 - prettier: ^2.1.1 + prettier: ^3.0.0 languageName: unknown linkType: soft @@ -9357,18 +9358,22 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-prettier@npm:^4.0.0": - version: 4.2.1 - resolution: "eslint-plugin-prettier@npm:4.2.1" +"eslint-plugin-prettier@npm:^5.0.0": + version: 5.0.0 + resolution: "eslint-plugin-prettier@npm:5.0.0" dependencies: prettier-linter-helpers: ^1.0.0 + synckit: ^0.8.5 peerDependencies: - eslint: ">=7.28.0" - prettier: ">=2.0.0" + "@types/eslint": ">=8.0.0" + eslint: ">=8.0.0" + prettier: ">=3.0.0" peerDependenciesMeta: + "@types/eslint": + optional: true eslint-config-prettier: optional: true - checksum: b9e839d2334ad8ec7a5589c5cb0f219bded260839a857d7a486997f9870e95106aa59b8756ff3f37202085ebab658de382b0267cae44c3a7f0eb0bcc03a4f6d6 + checksum: 84e88744b9050f2d5ef31b94e85294dda16f3a53c2449f9d33eac8ae6264889b459bf35a68e438fb6b329c2a1d6491aac4bfa00d86317e7009de3dad0311bec6 languageName: node linkType: hard @@ -13100,11 +13105,11 @@ __metadata: "@jest/test-utils": "workspace:^" "@jest/transform": "workspace:^" "@jest/types": "workspace:^" + "@prettier/sync": ^0.3.0 "@tsd/typescript": ^5.0.4 "@types/babel__core": ^7.1.14 "@types/graceful-fs": ^4.1.3 "@types/natural-compare": ^1.4.0 - "@types/prettier": ^2.1.5 "@types/semver": ^7.1.0 ansi-regex: ^5.0.1 ansi-styles: ^5.0.0 @@ -13118,7 +13123,7 @@ __metadata: jest-message-util: "workspace:^" jest-util: "workspace:^" natural-compare: ^1.4.0 - prettier: ^2.1.1 + prettier: ^3.0.0 pretty-format: "workspace:^" semver: ^7.5.3 tsd-lite: ^0.7.0 @@ -16991,7 +16996,7 @@ __metadata: languageName: node linkType: hard -"prettier@npm:^2.1.1, prettier@npm:^2.8.3": +"prettier@npm:^2.8.3": version: 2.8.8 resolution: "prettier@npm:2.8.8" bin: @@ -17000,6 +17005,15 @@ __metadata: languageName: node linkType: hard +"prettier@npm:^3.0.0": + version: 3.0.0 + resolution: "prettier@npm:3.0.0" + bin: + prettier: bin/prettier.cjs + checksum: 6a832876a1552dc58330d2467874e5a0b46b9ccbfc5d3531eb69d15684743e7f83dc9fbd202db6270446deba9c82b79d24383d09924c462b457136a759425e33 + languageName: node + linkType: hard + "pretty-bytes@npm:^5.3.0": version: 5.6.0 resolution: "pretty-bytes@npm:5.6.0"