From b1965bbb00a706a831855a16a36a72ef294efa79 Mon Sep 17 00:00:00 2001 From: Bogdan Savluk Date: Tue, 4 Jul 2023 02:26:28 +0200 Subject: [PATCH] perf(read-project-manifest): optimize normalize function --- .changeset/hot-cobras-fix.md | 5 ++++ .../read-project-manifest/package.json | 2 ++ .../read-project-manifest/src/index.ts | 28 +++++++++++++------ pnpm-lock.yaml | 16 +++++++++++ 4 files changed, 42 insertions(+), 9 deletions(-) create mode 100644 .changeset/hot-cobras-fix.md diff --git a/.changeset/hot-cobras-fix.md b/.changeset/hot-cobras-fix.md new file mode 100644 index 00000000000..3b15841796c --- /dev/null +++ b/.changeset/hot-cobras-fix.md @@ -0,0 +1,5 @@ +--- +"@pnpm/read-project-manifest": patch +--- + +Optimizing project manifest normalization, reducing amoung of data copying diff --git a/pkg-manifest/read-project-manifest/package.json b/pkg-manifest/read-project-manifest/package.json index 2f63d153761..ad4c4157999 100644 --- a/pkg-manifest/read-project-manifest/package.json +++ b/pkg-manifest/read-project-manifest/package.json @@ -38,6 +38,7 @@ "fast-deep-equal": "^3.1.3", "is-windows": "^1.0.2", "json5": "^2.2.3", + "lodash.clonedeep": "^4.5.0", "parse-json": "^5.2.0", "read-yaml-file": "^2.1.0", "sort-keys": "^4.2.0", @@ -46,6 +47,7 @@ "devDependencies": { "@pnpm/read-project-manifest": "workspace:*", "@types/is-windows": "^1.0.0", + "@types/lodash.clonedeep": "^4.5.7", "@types/parse-json": "^4.0.0", "tempy": "^1.0.1" }, diff --git a/pkg-manifest/read-project-manifest/src/index.ts b/pkg-manifest/read-project-manifest/src/index.ts index 9c4f924c032..a7a2c98bfae 100644 --- a/pkg-manifest/read-project-manifest/src/index.ts +++ b/pkg-manifest/read-project-manifest/src/index.ts @@ -8,7 +8,7 @@ import readYamlFile from 'read-yaml-file' import detectIndent from '@gwhitney/detect-indent' import equal from 'fast-deep-equal' import isWindows from 'is-windows' -import sortKeys from 'sort-keys' +import cloneDeep from 'lodash.clonedeep' import { readJson5File, readJsonFile, @@ -214,14 +214,24 @@ const dependencyKeys = new Set([ ]) function normalize (manifest: ProjectManifest) { - manifest = JSON.parse(JSON.stringify(manifest)) - const result: Record = {} // eslint-disable-line @typescript-eslint/no-explicit-any - - for (const [key, value] of Object.entries(manifest)) { - if (!dependencyKeys.has(key)) { - result[key] = value - } else if (Object.keys(value).length !== 0) { - result[key] = sortKeys(value) + const result: Record = {} // eslint-disable-line @typescript-eslint/no-explicit-any + for (const key in manifest) { + if (Object.prototype.hasOwnProperty.call(manifest, key)) { + const value = manifest[key as keyof ProjectManifest] + if (typeof value !== 'object' || !dependencyKeys.has(key)) { + result[key] = cloneDeep(value) + } else { + const keys = Object.keys(value) + if (keys.length !== 0) { + keys.sort() + const sortedValue: Record = {} + for (const k of keys) { + // @ts-expect-error this is fine + sortedValue[k] = value[k] + } + result[key] = sortedValue + } + } } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 011f7d4b3e8..423d0b0a273 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4135,6 +4135,9 @@ importers: json5: specifier: ^2.2.3 version: 2.2.3 + lodash.clonedeep: + specifier: ^4.5.0 + version: 4.5.0 parse-json: specifier: ^5.2.0 version: 5.2.0 @@ -4154,6 +4157,9 @@ importers: '@types/is-windows': specifier: ^1.0.0 version: 1.0.0 + '@types/lodash.clonedeep': + specifier: ^4.5.7 + version: 4.5.7 '@types/parse-json': specifier: ^4.0.0 version: 4.0.0 @@ -9124,6 +9130,12 @@ packages: dependencies: '@types/node': 14.18.52 + /@types/lodash.clonedeep@4.5.7: + resolution: {integrity: sha512-ccNqkPptFIXrpVqUECi60/DFxjNKsfoQxSQsgcBJCX/fuX1wgyQieojkcWH/KpE3xzLoWN/2k+ZeGqIN3paSvw==} + dependencies: + '@types/lodash': 4.14.195 + dev: true + /@types/lodash@4.14.181: resolution: {integrity: sha512-n3tyKthHJbkiWhDZs3DkhkCzt2MexYHXlX0td5iMplyfwketaOeKboEVBqzceH7juqvEg3q5oUoBFxSLu7zFag==} @@ -13847,6 +13859,10 @@ packages: resolution: {integrity: sha512-GhrVeweiTD6uTmmn5hV/lzgCQhccwReIVRLHp7LT4SopOjqEZ5BbX8b5WWEtAKasjmy8hR7ZPwsYlxRCku5odg==} dev: true + /lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + dev: false + /lodash.deburr@4.1.0: resolution: {integrity: sha512-m/M1U1f3ddMCs6Hq2tAsYThTBDaAKFDX3dwDo97GEYzamXi9SqUpjWi/Rrj/gf3X2n8ktwgZrlP1z6E3v/IExQ==} dev: false