Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/npm/cli.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGar <gar+gh@danger.computer>2021-08-26 19:35:42 +0300
committerGar <gar+gh@danger.computer>2021-08-26 19:35:42 +0300
commit3f4d371432a1fc8280e73d8467acd0eed0bbef26 (patch)
treed825cb81e5cd252b38d69434f9933523926bf6fd /node_modules
parenteb1fbb7a2b6de0500a0b95845f150fb09b6c160f (diff)
tar@6.1.11
* fix: perf regression on hot string munging path
Diffstat (limited to 'node_modules')
-rw-r--r--node_modules/tar/lib/normalize-unicode.js11
-rw-r--r--node_modules/tar/lib/path-reservations.js9
-rw-r--r--node_modules/tar/lib/strip-trailing-slashes.js31
-rw-r--r--node_modules/tar/lib/unpack.js4
-rw-r--r--node_modules/tar/package.json2
5 files changed, 28 insertions, 29 deletions
diff --git a/node_modules/tar/lib/normalize-unicode.js b/node_modules/tar/lib/normalize-unicode.js
new file mode 100644
index 000000000..4aeb1d50d
--- /dev/null
+++ b/node_modules/tar/lib/normalize-unicode.js
@@ -0,0 +1,11 @@
+// warning: extremely hot code path.
+// This has been meticulously optimized for use
+// within npm install on large package trees.
+// Do not edit without careful benchmarking.
+const normalizeCache = Object.create(null)
+const {hasOwnProperty} = Object.prototype
+module.exports = s => {
+ if (!hasOwnProperty.call(normalizeCache, s))
+ normalizeCache[s] = s.normalize('NFKD')
+ return normalizeCache[s]
+}
diff --git a/node_modules/tar/lib/path-reservations.js b/node_modules/tar/lib/path-reservations.js
index 8d0ead9b6..8183c45f8 100644
--- a/node_modules/tar/lib/path-reservations.js
+++ b/node_modules/tar/lib/path-reservations.js
@@ -7,7 +7,7 @@
// while still allowing maximal safe parallelization.
const assert = require('assert')
-const normPath = require('./normalize-windows-path.js')
+const normalize = require('./normalize-unicode.js')
const stripSlashes = require('./strip-trailing-slashes.js')
const { join } = require('path')
@@ -28,7 +28,7 @@ module.exports = () => {
const getDirs = path => {
const dirs = path.split('/').slice(0, -1).reduce((set, path) => {
if (set.length)
- path = normPath(join(set[set.length - 1], path))
+ path = join(set[set.length - 1], path)
set.push(path || '/')
return set
}, [])
@@ -116,9 +116,8 @@ module.exports = () => {
// So, we just pretend that every path matches every other path here,
// effectively removing all parallelization on windows.
paths = isWindows ? ['win32 parallelization disabled'] : paths.map(p => {
- return stripSlashes(normPath(join(p)))
- .normalize('NFKD')
- .toLowerCase()
+ // don't need normPath, because we skip this entirely for windows
+ return normalize(stripSlashes(join(p))).toLowerCase()
})
const dirs = new Set(
diff --git a/node_modules/tar/lib/strip-trailing-slashes.js b/node_modules/tar/lib/strip-trailing-slashes.js
index f702ed5a5..3e3ecec5a 100644
--- a/node_modules/tar/lib/strip-trailing-slashes.js
+++ b/node_modules/tar/lib/strip-trailing-slashes.js
@@ -1,24 +1,13 @@
-// this is the only approach that was significantly faster than using
-// str.replace(/\/+$/, '') for strings ending with a lot of / chars and
-// containing multiple / chars.
-const batchStrings = [
- '/'.repeat(1024),
- '/'.repeat(512),
- '/'.repeat(256),
- '/'.repeat(128),
- '/'.repeat(64),
- '/'.repeat(32),
- '/'.repeat(16),
- '/'.repeat(8),
- '/'.repeat(4),
- '/'.repeat(2),
- '/',
-]
-
+// warning: extremely hot code path.
+// This has been meticulously optimized for use
+// within npm install on large package trees.
+// Do not edit without careful benchmarking.
module.exports = str => {
- for (const s of batchStrings) {
- while (str.length >= s.length && str.slice(-1 * s.length) === s)
- str = str.slice(0, -1 * s.length)
+ let i = str.length - 1
+ let slashesStart = -1
+ while (i > -1 && str.charAt(i) === '/') {
+ slashesStart = i
+ i--
}
- return str
+ return slashesStart === -1 ? str : str.slice(0, slashesStart)
}
diff --git a/node_modules/tar/lib/unpack.js b/node_modules/tar/lib/unpack.js
index 7f397f103..7d39dc0f7 100644
--- a/node_modules/tar/lib/unpack.js
+++ b/node_modules/tar/lib/unpack.js
@@ -17,6 +17,7 @@ const pathReservations = require('./path-reservations.js')
const stripAbsolutePath = require('./strip-absolute-path.js')
const normPath = require('./normalize-windows-path.js')
const stripSlash = require('./strip-trailing-slashes.js')
+const normalize = require('./normalize-unicode.js')
const ONENTRY = Symbol('onEntry')
const CHECKFS = Symbol('checkFs')
@@ -101,8 +102,7 @@ const uint32 = (a, b, c) =>
// Note that on windows, we always drop the entire cache whenever a
// symbolic link is encountered, because 8.3 filenames are impossible
// to reason about, and collisions are hazards rather than just failures.
-const cacheKeyNormalize = path => stripSlash(normPath(path))
- .normalize('NFKD')
+const cacheKeyNormalize = path => normalize(stripSlash(normPath(path)))
.toLowerCase()
const pruneCache = (cache, abs) => {
diff --git a/node_modules/tar/package.json b/node_modules/tar/package.json
index a10cdac85..9f9977a0c 100644
--- a/node_modules/tar/package.json
+++ b/node_modules/tar/package.json
@@ -2,7 +2,7 @@
"author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
"name": "tar",
"description": "tar for node",
- "version": "6.1.10",
+ "version": "6.1.11",
"repository": {
"type": "git",
"url": "https://github.com/npm/node-tar.git"