From a2712dee4ae76fe21486a4617d2be73c6eed8dfe Mon Sep 17 00:00:00 2001 From: zkochan Date: Sun, 9 Jul 2017 13:32:26 +0300 Subject: [PATCH] feat: pass both the public and private shrinkwrap files for save If the public and private shrinkwraps are the same, they are stringified once. BREAKING CHANGE: The `save` function public API changed --- src/write.ts | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/write.ts b/src/write.ts index e6cb9775e7..52171e2ddd 100644 --- a/src/write.ts +++ b/src/write.ts @@ -14,7 +14,11 @@ const SHRINKWRAP_YAML_FORMAT = { noCompatMode: true, } -export default function write (pkgPath: string, shrinkwrap: Shrinkwrap) { +export default function write ( + pkgPath: string, + shrinkwrap: Shrinkwrap, + privateShrinkwrap: Shrinkwrap +) { const shrinkwrapPath = path.join(pkgPath, SHRINKWRAP_FILENAME) const privateShrinkwrapPath = path.join(pkgPath, PRIVATE_SHRINKWRAP_FILENAME) @@ -26,10 +30,23 @@ export default function write (pkgPath: string, shrinkwrap: Shrinkwrap) { ]) } + // in most cases the `shrinkwrap.yaml` and `node_modules/.shrinkwrap.yaml` are equal + // in those cases the YAML document can be stringified only once for both files + // which is more efficient + if (shrinkwrap === privateShrinkwrap) { + const yamlDoc = yaml.safeDump(shrinkwrap, SHRINKWRAP_YAML_FORMAT) + + return Promise.all([ + writeFileAtomic(shrinkwrapPath, yamlDoc), + writeFileAtomic(privateShrinkwrapPath, yamlDoc), + ]) + } + const yamlDoc = yaml.safeDump(shrinkwrap, SHRINKWRAP_YAML_FORMAT) + const privateYamlDoc = yaml.safeDump(privateShrinkwrap, SHRINKWRAP_YAML_FORMAT) return Promise.all([ writeFileAtomic(shrinkwrapPath, yamlDoc), - writeFileAtomic(privateShrinkwrapPath, yamlDoc), + writeFileAtomic(privateShrinkwrapPath, privateYamlDoc), ]) }