mirror of
https://github.com/anchore/syft.git
synced 2026-04-05 14:20:34 +02:00
Updates parsing of yarn.lock to use resolved URLs that are pulled from yarn and npm registries (#926)
Co-authored-by: Christopher Phillips <christopher.phillips@anchore.com>
This commit is contained in:
parent
bafc66a5e7
commit
d5e12ff89c
@ -25,6 +25,16 @@ var (
|
|||||||
// versionExp matches the "version" line of a yarn.lock entry and captures the version value.
|
// versionExp matches the "version" line of a yarn.lock entry and captures the version value.
|
||||||
// For example: version "4.10.1" (...and the value "4.10.1" is captured)
|
// For example: version "4.10.1" (...and the value "4.10.1" is captured)
|
||||||
versionExp = regexp.MustCompile(`^\W+version(?:\W+"|:\W+)([\w-_.]+)"?`)
|
versionExp = regexp.MustCompile(`^\W+version(?:\W+"|:\W+)([\w-_.]+)"?`)
|
||||||
|
|
||||||
|
// packageURLExp matches the name and version of the dependency in yarn.lock
|
||||||
|
// from the resolved URL, including scope/namespace prefix if any.
|
||||||
|
// For example:
|
||||||
|
// `resolved "https://registry.yarnpkg.com/async/-/async-3.2.3.tgz#ac53dafd3f4720ee9e8a160628f18ea91df196c9"`
|
||||||
|
// would return "async" and "3.2.3"
|
||||||
|
//
|
||||||
|
// `resolved "https://registry.yarnpkg.com/@4lolo/resize-observer-polyfill/-/resize-observer-polyfill-1.5.2.tgz#58868fc7224506236b5550d0c68357f0a874b84b"`
|
||||||
|
// would return "@4lolo/resize-observer-polyfill" and "1.5.2"
|
||||||
|
packageURLExp = regexp.MustCompile(`^\s+resolved\s+"https://registry\.(?:yarnpkg\.com|npmjs\.org)/(.+?)/-/(?:.+?)-(\d+\..+?)\.tgz`)
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -43,39 +53,37 @@ func parseYarnLock(path string, reader io.Reader) ([]*pkg.Package, []artifact.Re
|
|||||||
scanner := bufio.NewScanner(reader)
|
scanner := bufio.NewScanner(reader)
|
||||||
parsedPackages := internal.NewStringSet()
|
parsedPackages := internal.NewStringSet()
|
||||||
currentPackage := noPackage
|
currentPackage := noPackage
|
||||||
|
currentVersion := noVersion
|
||||||
|
|
||||||
for scanner.Scan() {
|
for scanner.Scan() {
|
||||||
line := scanner.Text()
|
line := scanner.Text()
|
||||||
|
|
||||||
if currentPackage == noPackage {
|
if packageName := findPackageName(line); packageName != noPackage {
|
||||||
// Scan until we find the next package
|
// When we find a new package, check if we have unsaved identifiers
|
||||||
|
if currentPackage != noPackage && currentVersion != noVersion && !parsedPackages.Contains(currentPackage+"@"+currentVersion) {
|
||||||
packageName := findPackageName(line)
|
packages = append(packages, newYarnLockPackage(currentPackage, currentVersion))
|
||||||
if packageName == noPackage {
|
parsedPackages.Add(currentPackage + "@" + currentVersion)
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if parsedPackages.Contains(packageName) {
|
|
||||||
// We don't parse repeated package declarations.
|
|
||||||
continue
|
|
||||||
}
|
}
|
||||||
|
|
||||||
currentPackage = packageName
|
currentPackage = packageName
|
||||||
parsedPackages.Add(currentPackage)
|
} else if version := findPackageVersion(line); version != noVersion {
|
||||||
|
currentVersion = version
|
||||||
|
} else if packageName, version := findPackageAndVersion(line); packageName != noPackage && version != noVersion && !parsedPackages.Contains(packageName+"@"+version) {
|
||||||
|
packages = append(packages, newYarnLockPackage(packageName, version))
|
||||||
|
parsedPackages.Add(packageName + "@" + version)
|
||||||
|
|
||||||
continue
|
// Cleanup to indicate no unsaved identifiers
|
||||||
}
|
|
||||||
|
|
||||||
// We've found the package entry, now we just need the version
|
|
||||||
|
|
||||||
if version := findPackageVersion(line); version != noVersion {
|
|
||||||
packages = append(packages, newYarnLockPackage(currentPackage, version))
|
|
||||||
currentPackage = noPackage
|
currentPackage = noPackage
|
||||||
|
currentVersion = noVersion
|
||||||
continue
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// check if we have valid unsaved data after end-of-file has reached
|
||||||
|
if currentPackage != noPackage && currentVersion != noVersion && !parsedPackages.Contains(currentPackage+"@"+currentVersion) {
|
||||||
|
packages = append(packages, newYarnLockPackage(currentPackage, currentVersion))
|
||||||
|
parsedPackages.Add(currentPackage + "@" + currentVersion)
|
||||||
|
}
|
||||||
|
|
||||||
if err := scanner.Err(); err != nil {
|
if err := scanner.Err(); err != nil {
|
||||||
return nil, nil, fmt.Errorf("failed to parse yarn.lock file: %w", err)
|
return nil, nil, fmt.Errorf("failed to parse yarn.lock file: %w", err)
|
||||||
}
|
}
|
||||||
@ -99,6 +107,14 @@ func findPackageVersion(line string) string {
|
|||||||
return noVersion
|
return noVersion
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func findPackageAndVersion(line string) (string, string) {
|
||||||
|
if matches := packageURLExp.FindStringSubmatch(line); len(matches) >= 2 {
|
||||||
|
return matches[1], matches[2]
|
||||||
|
}
|
||||||
|
|
||||||
|
return noPackage, noVersion
|
||||||
|
}
|
||||||
|
|
||||||
func newYarnLockPackage(name, version string) *pkg.Package {
|
func newYarnLockPackage(name, version string) *pkg.Package {
|
||||||
return &pkg.Package{
|
return &pkg.Package{
|
||||||
Name: name,
|
Name: name,
|
||||||
|
|||||||
@ -9,7 +9,7 @@ import (
|
|||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestParseYarnLock(t *testing.T) {
|
func TestParseYarnBerry(t *testing.T) {
|
||||||
expected := map[string]pkg.Package{
|
expected := map[string]pkg.Package{
|
||||||
"@babel/code-frame": {
|
"@babel/code-frame": {
|
||||||
Name: "@babel/code-frame",
|
Name: "@babel/code-frame",
|
||||||
@ -66,10 +66,87 @@ func TestParseYarnLock(t *testing.T) {
|
|||||||
Type: pkg.NpmPkg,
|
Type: pkg.NpmPkg,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
testFixtures := []string{
|
||||||
|
"test-fixtures/yarn-berry/yarn.lock",
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, file := range testFixtures {
|
||||||
|
file := file
|
||||||
|
t.Run(file, func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
fixture, err := os.Open(file)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
// TODO: no relationships are under test yet
|
||||||
|
actual, _, err := parseYarnLock(fixture.Name(), fixture)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
assertPkgsEqual(t, actual, expected)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestParseYarnLock(t *testing.T) {
|
||||||
|
expected := map[string]pkg.Package{
|
||||||
|
"@babel/code-frame": {
|
||||||
|
Name: "@babel/code-frame",
|
||||||
|
Version: "7.10.4",
|
||||||
|
Language: pkg.JavaScript,
|
||||||
|
Type: pkg.NpmPkg,
|
||||||
|
},
|
||||||
|
"@types/minimatch": {
|
||||||
|
Name: "@types/minimatch",
|
||||||
|
Version: "3.0.3",
|
||||||
|
Language: pkg.JavaScript,
|
||||||
|
Type: pkg.NpmPkg,
|
||||||
|
},
|
||||||
|
"@types/qs": {
|
||||||
|
Name: "@types/qs",
|
||||||
|
Version: "6.9.4",
|
||||||
|
Language: pkg.JavaScript,
|
||||||
|
Type: pkg.NpmPkg,
|
||||||
|
},
|
||||||
|
"ajv": {
|
||||||
|
Name: "ajv",
|
||||||
|
Version: "6.12.3",
|
||||||
|
Language: pkg.JavaScript,
|
||||||
|
Type: pkg.NpmPkg,
|
||||||
|
},
|
||||||
|
"atob": {
|
||||||
|
Name: "atob",
|
||||||
|
Version: "2.1.2",
|
||||||
|
Language: pkg.JavaScript,
|
||||||
|
Type: pkg.NpmPkg,
|
||||||
|
},
|
||||||
|
"aws-sdk": {
|
||||||
|
Name: "aws-sdk",
|
||||||
|
Version: "2.706.0",
|
||||||
|
Language: pkg.JavaScript,
|
||||||
|
Type: pkg.NpmPkg,
|
||||||
|
},
|
||||||
|
"jhipster-core": {
|
||||||
|
Name: "jhipster-core",
|
||||||
|
Version: "7.3.4",
|
||||||
|
Language: pkg.JavaScript,
|
||||||
|
Type: pkg.NpmPkg,
|
||||||
|
},
|
||||||
|
"asn1.js": {
|
||||||
|
Name: "asn1.js",
|
||||||
|
Version: "4.10.1",
|
||||||
|
Language: pkg.JavaScript,
|
||||||
|
Type: pkg.NpmPkg,
|
||||||
|
},
|
||||||
|
"something-i-made-up": {
|
||||||
|
Name: "something-i-made-up",
|
||||||
|
Version: "7.7.7",
|
||||||
|
Language: pkg.JavaScript,
|
||||||
|
Type: pkg.NpmPkg,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
testFixtures := []string{
|
testFixtures := []string{
|
||||||
"test-fixtures/yarn/yarn.lock",
|
"test-fixtures/yarn/yarn.lock",
|
||||||
"test-fixtures/yarn-berry/yarn.lock",
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, file := range testFixtures {
|
for _, file := range testFixtures {
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
package integration
|
package integration
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
@ -33,6 +34,7 @@ func TestYarnPackageLockDirectory(t *testing.T) {
|
|||||||
sbom, _ := catalogDirectory(t, "test-fixtures/yarn-lock")
|
sbom, _ := catalogDirectory(t, "test-fixtures/yarn-lock")
|
||||||
|
|
||||||
foundPackages := internal.NewStringSet()
|
foundPackages := internal.NewStringSet()
|
||||||
|
expectedPackages := internal.NewStringSet("async@0.9.2", "async@3.2.3", "merge-objects@1.0.5", "should-type@1.3.0", "@4lolo/resize-observer-polyfill@1.5.2")
|
||||||
|
|
||||||
for actualPkg := range sbom.Artifacts.PackageCatalog.Enumerate(pkg.NpmPkg) {
|
for actualPkg := range sbom.Artifacts.PackageCatalog.Enumerate(pkg.NpmPkg) {
|
||||||
for _, actualLocation := range actualPkg.Locations.ToSlice() {
|
for _, actualLocation := range actualPkg.Locations.ToSlice() {
|
||||||
@ -40,12 +42,13 @@ func TestYarnPackageLockDirectory(t *testing.T) {
|
|||||||
t.Errorf("found packages from yarn.lock in node_modules: %s", actualLocation)
|
t.Errorf("found packages from yarn.lock in node_modules: %s", actualLocation)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
foundPackages.Add(actualPkg.Name)
|
foundPackages.Add(actualPkg.Name + "@" + actualPkg.Version)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ensure that integration test commonTestCases stay in sync with the available catalogers
|
// ensure that integration test commonTestCases stay in sync with the available catalogers
|
||||||
const expectedPackageCount = 5
|
if len(foundPackages) != len(expectedPackages) {
|
||||||
if len(foundPackages) != expectedPackageCount {
|
t.Errorf("found the wrong set of yarn.lock packages (expected: %d, actual: %d)", len(expectedPackages), len(foundPackages))
|
||||||
t.Errorf("found the wrong set of yarn.lock packages (expected: %d, actual: %d)", expectedPackageCount, len(foundPackages))
|
} else if !reflect.DeepEqual(foundPackages, expectedPackages) {
|
||||||
|
t.Errorf("found the wrong set of yarn.lock packages (expected: %+q, actual: %+q)", expectedPackages.ToSlice(), foundPackages.ToSlice())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
1
test/integration/test-fixtures/yarn-lock/node_modules/.bin/semver
generated
vendored
1
test/integration/test-fixtures/yarn-lock/node_modules/.bin/semver
generated
vendored
@ -1 +0,0 @@
|
|||||||
../semver/bin/semver.js
|
|
||||||
22
test/integration/test-fixtures/yarn-lock/node_modules/.yarn-integrity
generated
vendored
22
test/integration/test-fixtures/yarn-lock/node_modules/.yarn-integrity
generated
vendored
@ -1,22 +0,0 @@
|
|||||||
{
|
|
||||||
"systemParams": "darwin-x64-83",
|
|
||||||
"modulesFolders": [
|
|
||||||
"node_modules"
|
|
||||||
],
|
|
||||||
"flags": [],
|
|
||||||
"linkedModules": [],
|
|
||||||
"topLevelPatterns": [
|
|
||||||
"collapse-white-space@^2.0.0",
|
|
||||||
"merge-objects@^1.0.5",
|
|
||||||
"semver@^7.3.5"
|
|
||||||
],
|
|
||||||
"lockfileEntries": {
|
|
||||||
"collapse-white-space@^2.0.0": "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-2.0.0.tgz#37d8521344cdd36635db180a7c83e9d515ac281b",
|
|
||||||
"lru-cache@^6.0.0": "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94",
|
|
||||||
"merge-objects@^1.0.5": "https://registry.yarnpkg.com/merge-objects/-/merge-objects-1.0.5.tgz#ad923ff3910091acc1438f53eb75b8f37d862a86",
|
|
||||||
"semver@^7.3.5": "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7",
|
|
||||||
"yallist@^4.0.0": "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
|
|
||||||
},
|
|
||||||
"files": [],
|
|
||||||
"artifacts": {}
|
|
||||||
}
|
|
||||||
19
test/integration/test-fixtures/yarn-lock/node_modules/async/LICENSE
generated
vendored
Normal file
19
test/integration/test-fixtures/yarn-lock/node_modules/async/LICENSE
generated
vendored
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
Copyright (c) 2010-2018 Caolan McMahon
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
17
test/integration/test-fixtures/yarn-lock/node_modules/async/bower.json
generated
vendored
Normal file
17
test/integration/test-fixtures/yarn-lock/node_modules/async/bower.json
generated
vendored
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"name": "async",
|
||||||
|
"main": "dist/async.js",
|
||||||
|
"ignore": [
|
||||||
|
"bower_components",
|
||||||
|
"lib",
|
||||||
|
"test",
|
||||||
|
"node_modules",
|
||||||
|
"perf",
|
||||||
|
"support",
|
||||||
|
"**/.*",
|
||||||
|
"*.config.js",
|
||||||
|
"*.json",
|
||||||
|
"index.js",
|
||||||
|
"Makefile"
|
||||||
|
]
|
||||||
|
}
|
||||||
80
test/integration/test-fixtures/yarn-lock/node_modules/async/package.json
generated
vendored
Normal file
80
test/integration/test-fixtures/yarn-lock/node_modules/async/package.json
generated
vendored
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
{
|
||||||
|
"name": "async",
|
||||||
|
"description": "Higher-order functions and common patterns for asynchronous code",
|
||||||
|
"version": "3.2.3",
|
||||||
|
"main": "dist/async.js",
|
||||||
|
"author": "Caolan McMahon",
|
||||||
|
"homepage": "https://caolan.github.io/async/",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/caolan/async.git"
|
||||||
|
},
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/caolan/async/issues"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"async",
|
||||||
|
"callback",
|
||||||
|
"module",
|
||||||
|
"utility"
|
||||||
|
],
|
||||||
|
"devDependencies": {
|
||||||
|
"babel-core": "^6.26.3",
|
||||||
|
"babel-eslint": "^8.2.6",
|
||||||
|
"babel-minify": "^0.5.0",
|
||||||
|
"babel-plugin-add-module-exports": "^0.2.1",
|
||||||
|
"babel-plugin-istanbul": "^5.1.4",
|
||||||
|
"babel-plugin-syntax-async-generators": "^6.13.0",
|
||||||
|
"babel-plugin-transform-es2015-modules-commonjs": "^6.26.2",
|
||||||
|
"babel-preset-es2015": "^6.3.13",
|
||||||
|
"babel-preset-es2017": "^6.22.0",
|
||||||
|
"babel-register": "^6.26.0",
|
||||||
|
"babelify": "^8.0.0",
|
||||||
|
"benchmark": "^2.1.1",
|
||||||
|
"bluebird": "^3.4.6",
|
||||||
|
"browserify": "^16.2.3",
|
||||||
|
"chai": "^4.2.0",
|
||||||
|
"cheerio": "^0.22.0",
|
||||||
|
"coveralls": "^3.0.4",
|
||||||
|
"es6-promise": "^2.3.0",
|
||||||
|
"eslint": "^6.0.1",
|
||||||
|
"eslint-plugin-prefer-arrow": "^1.1.5",
|
||||||
|
"fs-extra": "^0.26.7",
|
||||||
|
"jsdoc": "^3.6.2",
|
||||||
|
"karma": "^4.1.0",
|
||||||
|
"karma-browserify": "^5.3.0",
|
||||||
|
"karma-edge-launcher": "^0.4.2",
|
||||||
|
"karma-firefox-launcher": "^1.1.0",
|
||||||
|
"karma-junit-reporter": "^1.2.0",
|
||||||
|
"karma-mocha": "^1.2.0",
|
||||||
|
"karma-mocha-reporter": "^2.2.0",
|
||||||
|
"karma-safari-launcher": "^1.0.0",
|
||||||
|
"mocha": "^6.1.4",
|
||||||
|
"mocha-junit-reporter": "^1.18.0",
|
||||||
|
"native-promise-only": "^0.8.0-a",
|
||||||
|
"nyc": "^14.1.1",
|
||||||
|
"rollup": "^0.63.4",
|
||||||
|
"rollup-plugin-node-resolve": "^2.0.0",
|
||||||
|
"rollup-plugin-npm": "^2.0.0",
|
||||||
|
"rsvp": "^3.0.18",
|
||||||
|
"semver": "^5.5.0",
|
||||||
|
"yargs": "^11.0.0"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"coverage": "nyc npm run mocha-node-test -- --grep @nycinvalid --invert",
|
||||||
|
"coveralls": "npm run coverage && nyc report --reporter=text-lcov | coveralls",
|
||||||
|
"jsdoc": "jsdoc -c ./support/jsdoc/jsdoc.json && node support/jsdoc/jsdoc-fix-html.js",
|
||||||
|
"lint": "eslint --fix lib/ test/ perf/memory.js perf/suites.js perf/benchmark.js support/build/ support/*.js karma.conf.js",
|
||||||
|
"mocha-browser-test": "karma start",
|
||||||
|
"mocha-node-test": "mocha",
|
||||||
|
"mocha-test": "npm run mocha-node-test && npm run mocha-browser-test",
|
||||||
|
"test": "npm run lint && npm run mocha-node-test"
|
||||||
|
},
|
||||||
|
"license": "MIT",
|
||||||
|
"nyc": {
|
||||||
|
"exclude": [
|
||||||
|
"test"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"module": "dist/async.mjs"
|
||||||
|
}
|
||||||
@ -1,7 +0,0 @@
|
|||||||
/**
|
|
||||||
* Collapse whitespace to a single space.
|
|
||||||
*
|
|
||||||
* @param {string} value
|
|
||||||
* @returns {string}
|
|
||||||
*/
|
|
||||||
export function collapseWhiteSpace(value: string): string;
|
|
||||||
9
test/integration/test-fixtures/yarn-lock/node_modules/collapse-white-space/index.js
generated
vendored
9
test/integration/test-fixtures/yarn-lock/node_modules/collapse-white-space/index.js
generated
vendored
@ -1,9 +0,0 @@
|
|||||||
/**
|
|
||||||
* Collapse whitespace to a single space.
|
|
||||||
*
|
|
||||||
* @param {string} value
|
|
||||||
* @returns {string}
|
|
||||||
*/
|
|
||||||
export function collapseWhiteSpace(value) {
|
|
||||||
return String(value).replace(/\s+/g, ' ')
|
|
||||||
}
|
|
||||||
22
test/integration/test-fixtures/yarn-lock/node_modules/collapse-white-space/license
generated
vendored
22
test/integration/test-fixtures/yarn-lock/node_modules/collapse-white-space/license
generated
vendored
@ -1,22 +0,0 @@
|
|||||||
(The MIT License)
|
|
||||||
|
|
||||||
Copyright (c) 2015 Titus Wormer <tituswormer@gmail.com>
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of this software and associated documentation files (the
|
|
||||||
'Software'), to deal in the Software without restriction, including
|
|
||||||
without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
||||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
||||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
||||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
69
test/integration/test-fixtures/yarn-lock/node_modules/collapse-white-space/package.json
generated
vendored
69
test/integration/test-fixtures/yarn-lock/node_modules/collapse-white-space/package.json
generated
vendored
@ -1,69 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "collapse-white-space",
|
|
||||||
"version": "2.0.0",
|
|
||||||
"description": "Replace multiple white space characters with a single space",
|
|
||||||
"license": "MIT",
|
|
||||||
"keywords": [
|
|
||||||
"collapse",
|
|
||||||
"white",
|
|
||||||
"space"
|
|
||||||
],
|
|
||||||
"repository": "wooorm/collapse-white-space",
|
|
||||||
"bugs": "https://github.com/wooorm/collapse-white-space/issues",
|
|
||||||
"funding": {
|
|
||||||
"type": "github",
|
|
||||||
"url": "https://github.com/sponsors/wooorm"
|
|
||||||
},
|
|
||||||
"author": "Titus Wormer <tituswormer@gmail.com> (https://wooorm.com)",
|
|
||||||
"contributors": [
|
|
||||||
"Titus Wormer <tituswormer@gmail.com> (https://wooorm.com)"
|
|
||||||
],
|
|
||||||
"sideEffects": false,
|
|
||||||
"type": "module",
|
|
||||||
"main": "index.js",
|
|
||||||
"types": "index.d.ts",
|
|
||||||
"files": [
|
|
||||||
"index.d.ts",
|
|
||||||
"index.js"
|
|
||||||
],
|
|
||||||
"devDependencies": {
|
|
||||||
"@types/tape": "^4.0.0",
|
|
||||||
"c8": "^7.0.0",
|
|
||||||
"prettier": "^2.0.0",
|
|
||||||
"remark-cli": "^9.0.0",
|
|
||||||
"remark-preset-wooorm": "^8.0.0",
|
|
||||||
"rimraf": "^3.0.0",
|
|
||||||
"tape": "^5.0.0",
|
|
||||||
"typescript": "^4.0.0",
|
|
||||||
"xo": "^0.38.0"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"prepublishOnly": "npm run build",
|
|
||||||
"format": "remark . -qfo && prettier . -w --loglevel warn && xo --fix",
|
|
||||||
"prebuild": "rimraf \"*.d.ts\"",
|
|
||||||
"build": "tsc",
|
|
||||||
"test-api": "node test",
|
|
||||||
"test-coverage": "c8 --check-coverage --branches 100 --functions 100 --lines 100 --statements 100 --reporter lcov node test.js",
|
|
||||||
"test": "npm run format && npm run build && npm run test-coverage"
|
|
||||||
},
|
|
||||||
"prettier": {
|
|
||||||
"tabWidth": 2,
|
|
||||||
"useTabs": false,
|
|
||||||
"singleQuote": true,
|
|
||||||
"bracketSpacing": false,
|
|
||||||
"semi": false,
|
|
||||||
"trailingComma": "none"
|
|
||||||
},
|
|
||||||
"xo": {
|
|
||||||
"prettier": true,
|
|
||||||
"rules": {
|
|
||||||
"no-var": "off",
|
|
||||||
"prefer-arrow-callback": "off"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"remarkConfig": {
|
|
||||||
"plugins": [
|
|
||||||
"preset-wooorm"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
65
test/integration/test-fixtures/yarn-lock/node_modules/collapse-white-space/readme.md
generated
vendored
65
test/integration/test-fixtures/yarn-lock/node_modules/collapse-white-space/readme.md
generated
vendored
@ -1,65 +0,0 @@
|
|||||||
# collapse-white-space
|
|
||||||
|
|
||||||
[![Build][build-badge]][build]
|
|
||||||
[![Coverage][coverage-badge]][coverage]
|
|
||||||
[![Downloads][downloads-badge]][downloads]
|
|
||||||
[![Size][size-badge]][size]
|
|
||||||
|
|
||||||
Replace multiple whitespace characters with a single space.
|
|
||||||
|
|
||||||
## Install
|
|
||||||
|
|
||||||
This package is ESM only: Node 12+ is needed to use it and it must be `import`ed
|
|
||||||
instead of `require`d.
|
|
||||||
|
|
||||||
[npm][]:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
npm install collapse-white-space
|
|
||||||
```
|
|
||||||
|
|
||||||
## Use
|
|
||||||
|
|
||||||
```js
|
|
||||||
import {collapseWhiteSpace} from 'collapse-white-space'
|
|
||||||
|
|
||||||
collapseWhiteSpace('\tfoo \n\tbar \t\r\nbaz') //=> ' foo bar baz'
|
|
||||||
```
|
|
||||||
|
|
||||||
## API
|
|
||||||
|
|
||||||
This package exports the following identifiers: `collapseWhiteSpace`.
|
|
||||||
There is no default export.
|
|
||||||
|
|
||||||
### `collapseWhiteSpace(value)`
|
|
||||||
|
|
||||||
Replace multiple whitespace characters in `value` (`string`) with a single
|
|
||||||
space.
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
[MIT][license] © [Titus Wormer][author]
|
|
||||||
|
|
||||||
<!-- Definitions -->
|
|
||||||
|
|
||||||
[build-badge]: https://github.com/wooorm/collapse-white-space/workflows/main/badge.svg
|
|
||||||
|
|
||||||
[build]: https://github.com/wooorm/collapse-white-space/actions
|
|
||||||
|
|
||||||
[coverage-badge]: https://img.shields.io/codecov/c/github/wooorm/collapse-white-space.svg
|
|
||||||
|
|
||||||
[coverage]: https://codecov.io/github/wooorm/collapse-white-space
|
|
||||||
|
|
||||||
[downloads-badge]: https://img.shields.io/npm/dm/collapse-white-space.svg
|
|
||||||
|
|
||||||
[downloads]: https://www.npmjs.com/package/collapse-white-space
|
|
||||||
|
|
||||||
[size-badge]: https://img.shields.io/bundlephobia/minzip/collapse-white-space.svg
|
|
||||||
|
|
||||||
[size]: https://bundlephobia.com/result?p=collapse-white-space
|
|
||||||
|
|
||||||
[npm]: https://docs.npmjs.com/cli/install
|
|
||||||
|
|
||||||
[license]: license
|
|
||||||
|
|
||||||
[author]: https://wooorm.com
|
|
||||||
5957
test/integration/test-fixtures/yarn-lock/node_modules/collapse-white-space/yarn.lock
generated
vendored
5957
test/integration/test-fixtures/yarn-lock/node_modules/collapse-white-space/yarn.lock
generated
vendored
File diff suppressed because it is too large
Load Diff
15
test/integration/test-fixtures/yarn-lock/node_modules/lru-cache/LICENSE
generated
vendored
15
test/integration/test-fixtures/yarn-lock/node_modules/lru-cache/LICENSE
generated
vendored
@ -1,15 +0,0 @@
|
|||||||
The ISC License
|
|
||||||
|
|
||||||
Copyright (c) Isaac Z. Schlueter and Contributors
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
|
||||||
copyright notice and this permission notice appear in all copies.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
|
|
||||||
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
166
test/integration/test-fixtures/yarn-lock/node_modules/lru-cache/README.md
generated
vendored
166
test/integration/test-fixtures/yarn-lock/node_modules/lru-cache/README.md
generated
vendored
@ -1,166 +0,0 @@
|
|||||||
# lru cache
|
|
||||||
|
|
||||||
A cache object that deletes the least-recently-used items.
|
|
||||||
|
|
||||||
[](https://travis-ci.org/isaacs/node-lru-cache) [](https://coveralls.io/github/isaacs/node-lru-cache)
|
|
||||||
|
|
||||||
## Installation:
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
npm install lru-cache --save
|
|
||||||
```
|
|
||||||
|
|
||||||
## Usage:
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
var LRU = require("lru-cache")
|
|
||||||
, options = { max: 500
|
|
||||||
, length: function (n, key) { return n * 2 + key.length }
|
|
||||||
, dispose: function (key, n) { n.close() }
|
|
||||||
, maxAge: 1000 * 60 * 60 }
|
|
||||||
, cache = new LRU(options)
|
|
||||||
, otherCache = new LRU(50) // sets just the max size
|
|
||||||
|
|
||||||
cache.set("key", "value")
|
|
||||||
cache.get("key") // "value"
|
|
||||||
|
|
||||||
// non-string keys ARE fully supported
|
|
||||||
// but note that it must be THE SAME object, not
|
|
||||||
// just a JSON-equivalent object.
|
|
||||||
var someObject = { a: 1 }
|
|
||||||
cache.set(someObject, 'a value')
|
|
||||||
// Object keys are not toString()-ed
|
|
||||||
cache.set('[object Object]', 'a different value')
|
|
||||||
assert.equal(cache.get(someObject), 'a value')
|
|
||||||
// A similar object with same keys/values won't work,
|
|
||||||
// because it's a different object identity
|
|
||||||
assert.equal(cache.get({ a: 1 }), undefined)
|
|
||||||
|
|
||||||
cache.reset() // empty the cache
|
|
||||||
```
|
|
||||||
|
|
||||||
If you put more stuff in it, then items will fall out.
|
|
||||||
|
|
||||||
If you try to put an oversized thing in it, then it'll fall out right
|
|
||||||
away.
|
|
||||||
|
|
||||||
## Options
|
|
||||||
|
|
||||||
* `max` The maximum size of the cache, checked by applying the length
|
|
||||||
function to all values in the cache. Not setting this is kind of
|
|
||||||
silly, since that's the whole purpose of this lib, but it defaults
|
|
||||||
to `Infinity`. Setting it to a non-number or negative number will
|
|
||||||
throw a `TypeError`. Setting it to 0 makes it be `Infinity`.
|
|
||||||
* `maxAge` Maximum age in ms. Items are not pro-actively pruned out
|
|
||||||
as they age, but if you try to get an item that is too old, it'll
|
|
||||||
drop it and return undefined instead of giving it to you.
|
|
||||||
Setting this to a negative value will make everything seem old!
|
|
||||||
Setting it to a non-number will throw a `TypeError`.
|
|
||||||
* `length` Function that is used to calculate the length of stored
|
|
||||||
items. If you're storing strings or buffers, then you probably want
|
|
||||||
to do something like `function(n, key){return n.length}`. The default is
|
|
||||||
`function(){return 1}`, which is fine if you want to store `max`
|
|
||||||
like-sized things. The item is passed as the first argument, and
|
|
||||||
the key is passed as the second argumnet.
|
|
||||||
* `dispose` Function that is called on items when they are dropped
|
|
||||||
from the cache. This can be handy if you want to close file
|
|
||||||
descriptors or do other cleanup tasks when items are no longer
|
|
||||||
accessible. Called with `key, value`. It's called *before*
|
|
||||||
actually removing the item from the internal cache, so if you want
|
|
||||||
to immediately put it back in, you'll have to do that in a
|
|
||||||
`nextTick` or `setTimeout` callback or it won't do anything.
|
|
||||||
* `stale` By default, if you set a `maxAge`, it'll only actually pull
|
|
||||||
stale items out of the cache when you `get(key)`. (That is, it's
|
|
||||||
not pre-emptively doing a `setTimeout` or anything.) If you set
|
|
||||||
`stale:true`, it'll return the stale value before deleting it. If
|
|
||||||
you don't set this, then it'll return `undefined` when you try to
|
|
||||||
get a stale entry, as if it had already been deleted.
|
|
||||||
* `noDisposeOnSet` By default, if you set a `dispose()` method, then
|
|
||||||
it'll be called whenever a `set()` operation overwrites an existing
|
|
||||||
key. If you set this option, `dispose()` will only be called when a
|
|
||||||
key falls out of the cache, not when it is overwritten.
|
|
||||||
* `updateAgeOnGet` When using time-expiring entries with `maxAge`,
|
|
||||||
setting this to `true` will make each item's effective time update
|
|
||||||
to the current time whenever it is retrieved from cache, causing it
|
|
||||||
to not expire. (It can still fall out of cache based on recency of
|
|
||||||
use, of course.)
|
|
||||||
|
|
||||||
## API
|
|
||||||
|
|
||||||
* `set(key, value, maxAge)`
|
|
||||||
* `get(key) => value`
|
|
||||||
|
|
||||||
Both of these will update the "recently used"-ness of the key.
|
|
||||||
They do what you think. `maxAge` is optional and overrides the
|
|
||||||
cache `maxAge` option if provided.
|
|
||||||
|
|
||||||
If the key is not found, `get()` will return `undefined`.
|
|
||||||
|
|
||||||
The key and val can be any value.
|
|
||||||
|
|
||||||
* `peek(key)`
|
|
||||||
|
|
||||||
Returns the key value (or `undefined` if not found) without
|
|
||||||
updating the "recently used"-ness of the key.
|
|
||||||
|
|
||||||
(If you find yourself using this a lot, you *might* be using the
|
|
||||||
wrong sort of data structure, but there are some use cases where
|
|
||||||
it's handy.)
|
|
||||||
|
|
||||||
* `del(key)`
|
|
||||||
|
|
||||||
Deletes a key out of the cache.
|
|
||||||
|
|
||||||
* `reset()`
|
|
||||||
|
|
||||||
Clear the cache entirely, throwing away all values.
|
|
||||||
|
|
||||||
* `has(key)`
|
|
||||||
|
|
||||||
Check if a key is in the cache, without updating the recent-ness
|
|
||||||
or deleting it for being stale.
|
|
||||||
|
|
||||||
* `forEach(function(value,key,cache), [thisp])`
|
|
||||||
|
|
||||||
Just like `Array.prototype.forEach`. Iterates over all the keys
|
|
||||||
in the cache, in order of recent-ness. (Ie, more recently used
|
|
||||||
items are iterated over first.)
|
|
||||||
|
|
||||||
* `rforEach(function(value,key,cache), [thisp])`
|
|
||||||
|
|
||||||
The same as `cache.forEach(...)` but items are iterated over in
|
|
||||||
reverse order. (ie, less recently used items are iterated over
|
|
||||||
first.)
|
|
||||||
|
|
||||||
* `keys()`
|
|
||||||
|
|
||||||
Return an array of the keys in the cache.
|
|
||||||
|
|
||||||
* `values()`
|
|
||||||
|
|
||||||
Return an array of the values in the cache.
|
|
||||||
|
|
||||||
* `length`
|
|
||||||
|
|
||||||
Return total length of objects in cache taking into account
|
|
||||||
`length` options function.
|
|
||||||
|
|
||||||
* `itemCount`
|
|
||||||
|
|
||||||
Return total quantity of objects currently in cache. Note, that
|
|
||||||
`stale` (see options) items are returned as part of this item
|
|
||||||
count.
|
|
||||||
|
|
||||||
* `dump()`
|
|
||||||
|
|
||||||
Return an array of the cache entries ready for serialization and usage
|
|
||||||
with 'destinationCache.load(arr)`.
|
|
||||||
|
|
||||||
* `load(cacheEntriesArray)`
|
|
||||||
|
|
||||||
Loads another cache entries array, obtained with `sourceCache.dump()`,
|
|
||||||
into the cache. The destination cache is reset before loading new entries
|
|
||||||
|
|
||||||
* `prune()`
|
|
||||||
|
|
||||||
Manually iterates over the entire cache proactively pruning old entries
|
|
||||||
334
test/integration/test-fixtures/yarn-lock/node_modules/lru-cache/index.js
generated
vendored
334
test/integration/test-fixtures/yarn-lock/node_modules/lru-cache/index.js
generated
vendored
@ -1,334 +0,0 @@
|
|||||||
'use strict'
|
|
||||||
|
|
||||||
// A linked list to keep track of recently-used-ness
|
|
||||||
const Yallist = require('yallist')
|
|
||||||
|
|
||||||
const MAX = Symbol('max')
|
|
||||||
const LENGTH = Symbol('length')
|
|
||||||
const LENGTH_CALCULATOR = Symbol('lengthCalculator')
|
|
||||||
const ALLOW_STALE = Symbol('allowStale')
|
|
||||||
const MAX_AGE = Symbol('maxAge')
|
|
||||||
const DISPOSE = Symbol('dispose')
|
|
||||||
const NO_DISPOSE_ON_SET = Symbol('noDisposeOnSet')
|
|
||||||
const LRU_LIST = Symbol('lruList')
|
|
||||||
const CACHE = Symbol('cache')
|
|
||||||
const UPDATE_AGE_ON_GET = Symbol('updateAgeOnGet')
|
|
||||||
|
|
||||||
const naiveLength = () => 1
|
|
||||||
|
|
||||||
// lruList is a yallist where the head is the youngest
|
|
||||||
// item, and the tail is the oldest. the list contains the Hit
|
|
||||||
// objects as the entries.
|
|
||||||
// Each Hit object has a reference to its Yallist.Node. This
|
|
||||||
// never changes.
|
|
||||||
//
|
|
||||||
// cache is a Map (or PseudoMap) that matches the keys to
|
|
||||||
// the Yallist.Node object.
|
|
||||||
class LRUCache {
|
|
||||||
constructor (options) {
|
|
||||||
if (typeof options === 'number')
|
|
||||||
options = { max: options }
|
|
||||||
|
|
||||||
if (!options)
|
|
||||||
options = {}
|
|
||||||
|
|
||||||
if (options.max && (typeof options.max !== 'number' || options.max < 0))
|
|
||||||
throw new TypeError('max must be a non-negative number')
|
|
||||||
// Kind of weird to have a default max of Infinity, but oh well.
|
|
||||||
const max = this[MAX] = options.max || Infinity
|
|
||||||
|
|
||||||
const lc = options.length || naiveLength
|
|
||||||
this[LENGTH_CALCULATOR] = (typeof lc !== 'function') ? naiveLength : lc
|
|
||||||
this[ALLOW_STALE] = options.stale || false
|
|
||||||
if (options.maxAge && typeof options.maxAge !== 'number')
|
|
||||||
throw new TypeError('maxAge must be a number')
|
|
||||||
this[MAX_AGE] = options.maxAge || 0
|
|
||||||
this[DISPOSE] = options.dispose
|
|
||||||
this[NO_DISPOSE_ON_SET] = options.noDisposeOnSet || false
|
|
||||||
this[UPDATE_AGE_ON_GET] = options.updateAgeOnGet || false
|
|
||||||
this.reset()
|
|
||||||
}
|
|
||||||
|
|
||||||
// resize the cache when the max changes.
|
|
||||||
set max (mL) {
|
|
||||||
if (typeof mL !== 'number' || mL < 0)
|
|
||||||
throw new TypeError('max must be a non-negative number')
|
|
||||||
|
|
||||||
this[MAX] = mL || Infinity
|
|
||||||
trim(this)
|
|
||||||
}
|
|
||||||
get max () {
|
|
||||||
return this[MAX]
|
|
||||||
}
|
|
||||||
|
|
||||||
set allowStale (allowStale) {
|
|
||||||
this[ALLOW_STALE] = !!allowStale
|
|
||||||
}
|
|
||||||
get allowStale () {
|
|
||||||
return this[ALLOW_STALE]
|
|
||||||
}
|
|
||||||
|
|
||||||
set maxAge (mA) {
|
|
||||||
if (typeof mA !== 'number')
|
|
||||||
throw new TypeError('maxAge must be a non-negative number')
|
|
||||||
|
|
||||||
this[MAX_AGE] = mA
|
|
||||||
trim(this)
|
|
||||||
}
|
|
||||||
get maxAge () {
|
|
||||||
return this[MAX_AGE]
|
|
||||||
}
|
|
||||||
|
|
||||||
// resize the cache when the lengthCalculator changes.
|
|
||||||
set lengthCalculator (lC) {
|
|
||||||
if (typeof lC !== 'function')
|
|
||||||
lC = naiveLength
|
|
||||||
|
|
||||||
if (lC !== this[LENGTH_CALCULATOR]) {
|
|
||||||
this[LENGTH_CALCULATOR] = lC
|
|
||||||
this[LENGTH] = 0
|
|
||||||
this[LRU_LIST].forEach(hit => {
|
|
||||||
hit.length = this[LENGTH_CALCULATOR](hit.value, hit.key)
|
|
||||||
this[LENGTH] += hit.length
|
|
||||||
})
|
|
||||||
}
|
|
||||||
trim(this)
|
|
||||||
}
|
|
||||||
get lengthCalculator () { return this[LENGTH_CALCULATOR] }
|
|
||||||
|
|
||||||
get length () { return this[LENGTH] }
|
|
||||||
get itemCount () { return this[LRU_LIST].length }
|
|
||||||
|
|
||||||
rforEach (fn, thisp) {
|
|
||||||
thisp = thisp || this
|
|
||||||
for (let walker = this[LRU_LIST].tail; walker !== null;) {
|
|
||||||
const prev = walker.prev
|
|
||||||
forEachStep(this, fn, walker, thisp)
|
|
||||||
walker = prev
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
forEach (fn, thisp) {
|
|
||||||
thisp = thisp || this
|
|
||||||
for (let walker = this[LRU_LIST].head; walker !== null;) {
|
|
||||||
const next = walker.next
|
|
||||||
forEachStep(this, fn, walker, thisp)
|
|
||||||
walker = next
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
keys () {
|
|
||||||
return this[LRU_LIST].toArray().map(k => k.key)
|
|
||||||
}
|
|
||||||
|
|
||||||
values () {
|
|
||||||
return this[LRU_LIST].toArray().map(k => k.value)
|
|
||||||
}
|
|
||||||
|
|
||||||
reset () {
|
|
||||||
if (this[DISPOSE] &&
|
|
||||||
this[LRU_LIST] &&
|
|
||||||
this[LRU_LIST].length) {
|
|
||||||
this[LRU_LIST].forEach(hit => this[DISPOSE](hit.key, hit.value))
|
|
||||||
}
|
|
||||||
|
|
||||||
this[CACHE] = new Map() // hash of items by key
|
|
||||||
this[LRU_LIST] = new Yallist() // list of items in order of use recency
|
|
||||||
this[LENGTH] = 0 // length of items in the list
|
|
||||||
}
|
|
||||||
|
|
||||||
dump () {
|
|
||||||
return this[LRU_LIST].map(hit =>
|
|
||||||
isStale(this, hit) ? false : {
|
|
||||||
k: hit.key,
|
|
||||||
v: hit.value,
|
|
||||||
e: hit.now + (hit.maxAge || 0)
|
|
||||||
}).toArray().filter(h => h)
|
|
||||||
}
|
|
||||||
|
|
||||||
dumpLru () {
|
|
||||||
return this[LRU_LIST]
|
|
||||||
}
|
|
||||||
|
|
||||||
set (key, value, maxAge) {
|
|
||||||
maxAge = maxAge || this[MAX_AGE]
|
|
||||||
|
|
||||||
if (maxAge && typeof maxAge !== 'number')
|
|
||||||
throw new TypeError('maxAge must be a number')
|
|
||||||
|
|
||||||
const now = maxAge ? Date.now() : 0
|
|
||||||
const len = this[LENGTH_CALCULATOR](value, key)
|
|
||||||
|
|
||||||
if (this[CACHE].has(key)) {
|
|
||||||
if (len > this[MAX]) {
|
|
||||||
del(this, this[CACHE].get(key))
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
const node = this[CACHE].get(key)
|
|
||||||
const item = node.value
|
|
||||||
|
|
||||||
// dispose of the old one before overwriting
|
|
||||||
// split out into 2 ifs for better coverage tracking
|
|
||||||
if (this[DISPOSE]) {
|
|
||||||
if (!this[NO_DISPOSE_ON_SET])
|
|
||||||
this[DISPOSE](key, item.value)
|
|
||||||
}
|
|
||||||
|
|
||||||
item.now = now
|
|
||||||
item.maxAge = maxAge
|
|
||||||
item.value = value
|
|
||||||
this[LENGTH] += len - item.length
|
|
||||||
item.length = len
|
|
||||||
this.get(key)
|
|
||||||
trim(this)
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
const hit = new Entry(key, value, len, now, maxAge)
|
|
||||||
|
|
||||||
// oversized objects fall out of cache automatically.
|
|
||||||
if (hit.length > this[MAX]) {
|
|
||||||
if (this[DISPOSE])
|
|
||||||
this[DISPOSE](key, value)
|
|
||||||
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
this[LENGTH] += hit.length
|
|
||||||
this[LRU_LIST].unshift(hit)
|
|
||||||
this[CACHE].set(key, this[LRU_LIST].head)
|
|
||||||
trim(this)
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
has (key) {
|
|
||||||
if (!this[CACHE].has(key)) return false
|
|
||||||
const hit = this[CACHE].get(key).value
|
|
||||||
return !isStale(this, hit)
|
|
||||||
}
|
|
||||||
|
|
||||||
get (key) {
|
|
||||||
return get(this, key, true)
|
|
||||||
}
|
|
||||||
|
|
||||||
peek (key) {
|
|
||||||
return get(this, key, false)
|
|
||||||
}
|
|
||||||
|
|
||||||
pop () {
|
|
||||||
const node = this[LRU_LIST].tail
|
|
||||||
if (!node)
|
|
||||||
return null
|
|
||||||
|
|
||||||
del(this, node)
|
|
||||||
return node.value
|
|
||||||
}
|
|
||||||
|
|
||||||
del (key) {
|
|
||||||
del(this, this[CACHE].get(key))
|
|
||||||
}
|
|
||||||
|
|
||||||
load (arr) {
|
|
||||||
// reset the cache
|
|
||||||
this.reset()
|
|
||||||
|
|
||||||
const now = Date.now()
|
|
||||||
// A previous serialized cache has the most recent items first
|
|
||||||
for (let l = arr.length - 1; l >= 0; l--) {
|
|
||||||
const hit = arr[l]
|
|
||||||
const expiresAt = hit.e || 0
|
|
||||||
if (expiresAt === 0)
|
|
||||||
// the item was created without expiration in a non aged cache
|
|
||||||
this.set(hit.k, hit.v)
|
|
||||||
else {
|
|
||||||
const maxAge = expiresAt - now
|
|
||||||
// dont add already expired items
|
|
||||||
if (maxAge > 0) {
|
|
||||||
this.set(hit.k, hit.v, maxAge)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
prune () {
|
|
||||||
this[CACHE].forEach((value, key) => get(this, key, false))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const get = (self, key, doUse) => {
|
|
||||||
const node = self[CACHE].get(key)
|
|
||||||
if (node) {
|
|
||||||
const hit = node.value
|
|
||||||
if (isStale(self, hit)) {
|
|
||||||
del(self, node)
|
|
||||||
if (!self[ALLOW_STALE])
|
|
||||||
return undefined
|
|
||||||
} else {
|
|
||||||
if (doUse) {
|
|
||||||
if (self[UPDATE_AGE_ON_GET])
|
|
||||||
node.value.now = Date.now()
|
|
||||||
self[LRU_LIST].unshiftNode(node)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return hit.value
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const isStale = (self, hit) => {
|
|
||||||
if (!hit || (!hit.maxAge && !self[MAX_AGE]))
|
|
||||||
return false
|
|
||||||
|
|
||||||
const diff = Date.now() - hit.now
|
|
||||||
return hit.maxAge ? diff > hit.maxAge
|
|
||||||
: self[MAX_AGE] && (diff > self[MAX_AGE])
|
|
||||||
}
|
|
||||||
|
|
||||||
const trim = self => {
|
|
||||||
if (self[LENGTH] > self[MAX]) {
|
|
||||||
for (let walker = self[LRU_LIST].tail;
|
|
||||||
self[LENGTH] > self[MAX] && walker !== null;) {
|
|
||||||
// We know that we're about to delete this one, and also
|
|
||||||
// what the next least recently used key will be, so just
|
|
||||||
// go ahead and set it now.
|
|
||||||
const prev = walker.prev
|
|
||||||
del(self, walker)
|
|
||||||
walker = prev
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const del = (self, node) => {
|
|
||||||
if (node) {
|
|
||||||
const hit = node.value
|
|
||||||
if (self[DISPOSE])
|
|
||||||
self[DISPOSE](hit.key, hit.value)
|
|
||||||
|
|
||||||
self[LENGTH] -= hit.length
|
|
||||||
self[CACHE].delete(hit.key)
|
|
||||||
self[LRU_LIST].removeNode(node)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Entry {
|
|
||||||
constructor (key, value, length, now, maxAge) {
|
|
||||||
this.key = key
|
|
||||||
this.value = value
|
|
||||||
this.length = length
|
|
||||||
this.now = now
|
|
||||||
this.maxAge = maxAge || 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const forEachStep = (self, fn, node, thisp) => {
|
|
||||||
let hit = node.value
|
|
||||||
if (isStale(self, hit)) {
|
|
||||||
del(self, node)
|
|
||||||
if (!self[ALLOW_STALE])
|
|
||||||
hit = undefined
|
|
||||||
}
|
|
||||||
if (hit)
|
|
||||||
fn.call(thisp, hit.value, hit.key, self)
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = LRUCache
|
|
||||||
34
test/integration/test-fixtures/yarn-lock/node_modules/lru-cache/package.json
generated
vendored
34
test/integration/test-fixtures/yarn-lock/node_modules/lru-cache/package.json
generated
vendored
@ -1,34 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "lru-cache",
|
|
||||||
"description": "A cache object that deletes the least-recently-used items.",
|
|
||||||
"version": "6.0.0",
|
|
||||||
"author": "Isaac Z. Schlueter <i@izs.me>",
|
|
||||||
"keywords": [
|
|
||||||
"mru",
|
|
||||||
"lru",
|
|
||||||
"cache"
|
|
||||||
],
|
|
||||||
"scripts": {
|
|
||||||
"test": "tap",
|
|
||||||
"snap": "tap",
|
|
||||||
"preversion": "npm test",
|
|
||||||
"postversion": "npm publish",
|
|
||||||
"prepublishOnly": "git push origin --follow-tags"
|
|
||||||
},
|
|
||||||
"main": "index.js",
|
|
||||||
"repository": "git://github.com/isaacs/node-lru-cache.git",
|
|
||||||
"devDependencies": {
|
|
||||||
"benchmark": "^2.1.4",
|
|
||||||
"tap": "^14.10.7"
|
|
||||||
},
|
|
||||||
"license": "ISC",
|
|
||||||
"dependencies": {
|
|
||||||
"yallist": "^4.0.0"
|
|
||||||
},
|
|
||||||
"files": [
|
|
||||||
"index.js"
|
|
||||||
],
|
|
||||||
"engines": {
|
|
||||||
"node": ">=10"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
2
test/integration/test-fixtures/yarn-lock/node_modules/merge-objects/.npmignore
generated
vendored
2
test/integration/test-fixtures/yarn-lock/node_modules/merge-objects/.npmignore
generated
vendored
@ -1,2 +0,0 @@
|
|||||||
*.log
|
|
||||||
.DS_Store
|
|
||||||
9
test/integration/test-fixtures/yarn-lock/node_modules/merge-objects/.travis.yml
generated
vendored
9
test/integration/test-fixtures/yarn-lock/node_modules/merge-objects/.travis.yml
generated
vendored
@ -1,9 +0,0 @@
|
|||||||
language: node_js
|
|
||||||
node_js:
|
|
||||||
- 4.0
|
|
||||||
- 0.12
|
|
||||||
- 0.11
|
|
||||||
- 0.10
|
|
||||||
- 0.9
|
|
||||||
- 0.8
|
|
||||||
- 0.6
|
|
||||||
24
test/integration/test-fixtures/yarn-lock/node_modules/merge-objects/README.md
generated
vendored
24
test/integration/test-fixtures/yarn-lock/node_modules/merge-objects/README.md
generated
vendored
@ -1,24 +0,0 @@
|
|||||||
# node-merge-objects
|
|
||||||
|
|
||||||
Merge two objects and concatenate arrays that are values of the same object key.
|
|
||||||
|
|
||||||
Similar to extend in JQuery, but with arrays concatenation. Does deep merging too.
|
|
||||||
|
|
||||||
[](http://travis-ci.org/shevaroller/node-merge-objects)
|
|
||||||
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
npm install merge-objects --save
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
var merge = require('merge-objects');
|
|
||||||
|
|
||||||
var object1 = {a: 1, b: [2, 3]};
|
|
||||||
var object2 = {b: [4, 5], c: 6};
|
|
||||||
|
|
||||||
var result = merge(object1, object2);
|
|
||||||
console.log(result); //logs {a: 1, b: [2, 3, 4, 5], c: 6}
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
MIT
|
|
||||||
42
test/integration/test-fixtures/yarn-lock/node_modules/merge-objects/lib/merge-objects.js
generated
vendored
42
test/integration/test-fixtures/yarn-lock/node_modules/merge-objects/lib/merge-objects.js
generated
vendored
@ -1,42 +0,0 @@
|
|||||||
/**
|
|
||||||
* Merge two objects and concatenate arrays that are values of the same object key
|
|
||||||
*
|
|
||||||
* @author Oleksii Shevchenko <shevaroller@gmail.com> (http://shevaroller.me)
|
|
||||||
* @since 6 September 2015
|
|
||||||
*/
|
|
||||||
|
|
||||||
var mergeObjects;
|
|
||||||
|
|
||||||
mergeObjects = function(object1, object2) {
|
|
||||||
var key;
|
|
||||||
|
|
||||||
// concatenate not objects into arrays
|
|
||||||
if (typeof object1 !== 'object') {
|
|
||||||
if (typeof object2 !== 'object') {
|
|
||||||
return [object1, object2];
|
|
||||||
}
|
|
||||||
return object2.concat(object1);
|
|
||||||
}
|
|
||||||
if (typeof object2 !== 'object') {
|
|
||||||
return object1.concat(object2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// merge object2 into object1
|
|
||||||
for (key in object2) {
|
|
||||||
if ((Array.isArray(object1[key])) && (Array.isArray(object2[key]))) {
|
|
||||||
// concatenate arrays that are values of the same object key
|
|
||||||
object1[key] = object1[key].concat(object2[key]);
|
|
||||||
} else if (typeof object1[key] === 'object' && typeof object2[key] === 'object') {
|
|
||||||
// deep merge object2 into object1
|
|
||||||
object1[key] = mergeObjects(object1[key], object2[key]);
|
|
||||||
} else {
|
|
||||||
object1[key] = object2[key];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return object1;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Exports Module mergeObjects
|
|
||||||
*/
|
|
||||||
module.exports = mergeObjects;
|
|
||||||
53
test/integration/test-fixtures/yarn-lock/node_modules/merge-objects/test/test.js
generated
vendored
53
test/integration/test-fixtures/yarn-lock/node_modules/merge-objects/test/test.js
generated
vendored
@ -1,53 +0,0 @@
|
|||||||
var merge = require('../lib/merge-objects');
|
|
||||||
var assert = require('assert');
|
|
||||||
|
|
||||||
var object1, object2, result;
|
|
||||||
|
|
||||||
/* Test not objects */
|
|
||||||
object1 = 0;
|
|
||||||
object2 = 'a string';
|
|
||||||
result = merge(object1, object2);
|
|
||||||
|
|
||||||
assert.deepEqual(result, [0, 'a string'], 'two not objects');
|
|
||||||
|
|
||||||
/* Test one object and one not object */
|
|
||||||
object1 = [0, 1];
|
|
||||||
object2 = 'a string';
|
|
||||||
result = merge(object1, object2);
|
|
||||||
|
|
||||||
assert.deepEqual(result, [0, 1, 'a string'], 'one object and one not object');
|
|
||||||
|
|
||||||
/* Test one not object and one object */
|
|
||||||
object1 = 0;
|
|
||||||
object2 = ['a string', 'string2'];
|
|
||||||
result = merge(object1, object2);
|
|
||||||
|
|
||||||
assert.deepEqual(result, ['a string', 'string2', 0], 'one not object and one object');
|
|
||||||
|
|
||||||
/* Test two objects with no depth */
|
|
||||||
object1 = {a: 1};
|
|
||||||
object2 = {b: 2};
|
|
||||||
result = merge(object1, object2);
|
|
||||||
|
|
||||||
assert.deepEqual(result, {a: 1, b: 2}, 'two objects with no depth');
|
|
||||||
|
|
||||||
/* Test two objects with equal keys */
|
|
||||||
object1 = {a: 1};
|
|
||||||
object2 = {a: 2};
|
|
||||||
result = merge(object1, object2);
|
|
||||||
|
|
||||||
assert.deepEqual(result, {a: 2}, 'two objects with equal keys');
|
|
||||||
|
|
||||||
/* Test array concatenation inside objects */
|
|
||||||
object1 = {a: 1, b: [2, 3]};
|
|
||||||
object2 = {b: [4, 5], c: 6};
|
|
||||||
result = merge(object1, object2);
|
|
||||||
|
|
||||||
assert.deepEqual(result, {a: 1, b: [2, 3, 4, 5], c: 6}, 'array concatenation inside objects');
|
|
||||||
|
|
||||||
/* Test two objects with depth and equal keys */
|
|
||||||
object1 = {a: {b: [0, 1], c: 'a'}};
|
|
||||||
object2 = {a: {b: [2, 3], c: 'b'}};
|
|
||||||
result = merge(object1, object2);
|
|
||||||
|
|
||||||
assert.deepEqual(result, {a: {b: [0, 1, 2, 3], c: 'b'}}, 'two objects with depth and equal keys');
|
|
||||||
21
test/integration/test-fixtures/yarn-lock/node_modules/resize-observer-polyfill/LICENSE
generated
vendored
Normal file
21
test/integration/test-fixtures/yarn-lock/node_modules/resize-observer-polyfill/LICENSE
generated
vendored
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2016 Denis Rul
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
64
test/integration/test-fixtures/yarn-lock/node_modules/resize-observer-polyfill/package.json
generated
vendored
Normal file
64
test/integration/test-fixtures/yarn-lock/node_modules/resize-observer-polyfill/package.json
generated
vendored
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
{
|
||||||
|
"name": "@4lolo/resize-observer-polyfill",
|
||||||
|
"author": "Denis Rul <que.etc@gmail.com>",
|
||||||
|
"version": "1.5.2",
|
||||||
|
"description": "A polyfill for the Resize Observer API",
|
||||||
|
"main": "dist/ResizeObserver.js",
|
||||||
|
"module": "dist/ResizeObserver.es.js",
|
||||||
|
"scripts": {
|
||||||
|
"build": "rollup -c && cpy src/index.js.flow dist --rename=ResizeObserver.js.flow",
|
||||||
|
"test": "npm run test:lint && npm run test:spec",
|
||||||
|
"test:ci": "npm run test:lint && npm run test:spec:sauce && npm run test:spec:node",
|
||||||
|
"test:ci:pull": "npm run test:lint && karma start --browsers Firefox && npm run test:spec:node",
|
||||||
|
"test:lint": "node ./node_modules/eslint/bin/eslint.js \"**/*.js\" --ignore-pattern \"/dist/\"",
|
||||||
|
"test:spec": "karma start --browsers Chrome && npm run test:spec:node",
|
||||||
|
"test:spec:sauce": "karma start --sauce=windows && karma start --sauce=linux && karma start --sauce=osx",
|
||||||
|
"test:spec:node": "npm run build && node tests/node/index.js",
|
||||||
|
"test:spec:custom": "karma start --no-browsers",
|
||||||
|
"test:spec:native": "karma start --no-browsers --native"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/que-etc/resize-observer-polyfill.git"
|
||||||
|
},
|
||||||
|
"license": "MIT",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/que-etc/resize-observer-polyfill/issues"
|
||||||
|
},
|
||||||
|
"types": "src/index.d.ts",
|
||||||
|
"files": [
|
||||||
|
"src/",
|
||||||
|
"dist/"
|
||||||
|
],
|
||||||
|
"keywords": [
|
||||||
|
"ResizeObserver",
|
||||||
|
"resize",
|
||||||
|
"observer",
|
||||||
|
"util",
|
||||||
|
"client",
|
||||||
|
"browser",
|
||||||
|
"polyfill",
|
||||||
|
"ponyfill"
|
||||||
|
],
|
||||||
|
"homepage": "https://github.com/que-etc/resize-observer-polyfill",
|
||||||
|
"devDependencies": {
|
||||||
|
"babel-eslint": "10.0.1",
|
||||||
|
"cpy-cli": "2.0.0",
|
||||||
|
"eslint": "5.10.0",
|
||||||
|
"jasmine": "2.8.0",
|
||||||
|
"jasmine-core": "2.8.0",
|
||||||
|
"karma": "3.1.3",
|
||||||
|
"karma-chrome-launcher": "2.2.0",
|
||||||
|
"karma-firefox-launcher": "1.1.0",
|
||||||
|
"karma-jasmine": "1.1.2",
|
||||||
|
"karma-jasmine-html-reporter": "0.2.2",
|
||||||
|
"karma-rollup-preprocessor": "6.1.1",
|
||||||
|
"karma-sauce-launcher": "1.2.0",
|
||||||
|
"karma-sourcemap-loader": "0.3.7",
|
||||||
|
"karma-spec-reporter": "0.0.32",
|
||||||
|
"promise-polyfill": "8.1.0",
|
||||||
|
"rollup": "0.67.4",
|
||||||
|
"rollup-plugin-typescript": "1.0.0",
|
||||||
|
"typescript": "3.2.2"
|
||||||
|
}
|
||||||
|
}
|
||||||
15
test/integration/test-fixtures/yarn-lock/node_modules/semver/LICENSE
generated
vendored
15
test/integration/test-fixtures/yarn-lock/node_modules/semver/LICENSE
generated
vendored
@ -1,15 +0,0 @@
|
|||||||
The ISC License
|
|
||||||
|
|
||||||
Copyright (c) Isaac Z. Schlueter and Contributors
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
|
||||||
copyright notice and this permission notice appear in all copies.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
|
|
||||||
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
566
test/integration/test-fixtures/yarn-lock/node_modules/semver/README.md
generated
vendored
566
test/integration/test-fixtures/yarn-lock/node_modules/semver/README.md
generated
vendored
@ -1,566 +0,0 @@
|
|||||||
semver(1) -- The semantic versioner for npm
|
|
||||||
===========================================
|
|
||||||
|
|
||||||
## Install
|
|
||||||
|
|
||||||
```bash
|
|
||||||
npm install semver
|
|
||||||
````
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
As a node module:
|
|
||||||
|
|
||||||
```js
|
|
||||||
const semver = require('semver')
|
|
||||||
|
|
||||||
semver.valid('1.2.3') // '1.2.3'
|
|
||||||
semver.valid('a.b.c') // null
|
|
||||||
semver.clean(' =v1.2.3 ') // '1.2.3'
|
|
||||||
semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3') // true
|
|
||||||
semver.gt('1.2.3', '9.8.7') // false
|
|
||||||
semver.lt('1.2.3', '9.8.7') // true
|
|
||||||
semver.minVersion('>=1.0.0') // '1.0.0'
|
|
||||||
semver.valid(semver.coerce('v2')) // '2.0.0'
|
|
||||||
semver.valid(semver.coerce('42.6.7.9.3-alpha')) // '42.6.7'
|
|
||||||
```
|
|
||||||
|
|
||||||
You can also just load the module for the function that you care about, if
|
|
||||||
you'd like to minimize your footprint.
|
|
||||||
|
|
||||||
```js
|
|
||||||
// load the whole API at once in a single object
|
|
||||||
const semver = require('semver')
|
|
||||||
|
|
||||||
// or just load the bits you need
|
|
||||||
// all of them listed here, just pick and choose what you want
|
|
||||||
|
|
||||||
// classes
|
|
||||||
const SemVer = require('semver/classes/semver')
|
|
||||||
const Comparator = require('semver/classes/comparator')
|
|
||||||
const Range = require('semver/classes/range')
|
|
||||||
|
|
||||||
// functions for working with versions
|
|
||||||
const semverParse = require('semver/functions/parse')
|
|
||||||
const semverValid = require('semver/functions/valid')
|
|
||||||
const semverClean = require('semver/functions/clean')
|
|
||||||
const semverInc = require('semver/functions/inc')
|
|
||||||
const semverDiff = require('semver/functions/diff')
|
|
||||||
const semverMajor = require('semver/functions/major')
|
|
||||||
const semverMinor = require('semver/functions/minor')
|
|
||||||
const semverPatch = require('semver/functions/patch')
|
|
||||||
const semverPrerelease = require('semver/functions/prerelease')
|
|
||||||
const semverCompare = require('semver/functions/compare')
|
|
||||||
const semverRcompare = require('semver/functions/rcompare')
|
|
||||||
const semverCompareLoose = require('semver/functions/compare-loose')
|
|
||||||
const semverCompareBuild = require('semver/functions/compare-build')
|
|
||||||
const semverSort = require('semver/functions/sort')
|
|
||||||
const semverRsort = require('semver/functions/rsort')
|
|
||||||
|
|
||||||
// low-level comparators between versions
|
|
||||||
const semverGt = require('semver/functions/gt')
|
|
||||||
const semverLt = require('semver/functions/lt')
|
|
||||||
const semverEq = require('semver/functions/eq')
|
|
||||||
const semverNeq = require('semver/functions/neq')
|
|
||||||
const semverGte = require('semver/functions/gte')
|
|
||||||
const semverLte = require('semver/functions/lte')
|
|
||||||
const semverCmp = require('semver/functions/cmp')
|
|
||||||
const semverCoerce = require('semver/functions/coerce')
|
|
||||||
|
|
||||||
// working with ranges
|
|
||||||
const semverSatisfies = require('semver/functions/satisfies')
|
|
||||||
const semverMaxSatisfying = require('semver/ranges/max-satisfying')
|
|
||||||
const semverMinSatisfying = require('semver/ranges/min-satisfying')
|
|
||||||
const semverToComparators = require('semver/ranges/to-comparators')
|
|
||||||
const semverMinVersion = require('semver/ranges/min-version')
|
|
||||||
const semverValidRange = require('semver/ranges/valid')
|
|
||||||
const semverOutside = require('semver/ranges/outside')
|
|
||||||
const semverGtr = require('semver/ranges/gtr')
|
|
||||||
const semverLtr = require('semver/ranges/ltr')
|
|
||||||
const semverIntersects = require('semver/ranges/intersects')
|
|
||||||
const simplifyRange = require('semver/ranges/simplify')
|
|
||||||
const rangeSubset = require('semver/ranges/subset')
|
|
||||||
```
|
|
||||||
|
|
||||||
As a command-line utility:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ semver -h
|
|
||||||
|
|
||||||
A JavaScript implementation of the https://semver.org/ specification
|
|
||||||
Copyright Isaac Z. Schlueter
|
|
||||||
|
|
||||||
Usage: semver [options] <version> [<version> [...]]
|
|
||||||
Prints valid versions sorted by SemVer precedence
|
|
||||||
|
|
||||||
Options:
|
|
||||||
-r --range <range>
|
|
||||||
Print versions that match the specified range.
|
|
||||||
|
|
||||||
-i --increment [<level>]
|
|
||||||
Increment a version by the specified level. Level can
|
|
||||||
be one of: major, minor, patch, premajor, preminor,
|
|
||||||
prepatch, or prerelease. Default level is 'patch'.
|
|
||||||
Only one version may be specified.
|
|
||||||
|
|
||||||
--preid <identifier>
|
|
||||||
Identifier to be used to prefix premajor, preminor,
|
|
||||||
prepatch or prerelease version increments.
|
|
||||||
|
|
||||||
-l --loose
|
|
||||||
Interpret versions and ranges loosely
|
|
||||||
|
|
||||||
-p --include-prerelease
|
|
||||||
Always include prerelease versions in range matching
|
|
||||||
|
|
||||||
-c --coerce
|
|
||||||
Coerce a string into SemVer if possible
|
|
||||||
(does not imply --loose)
|
|
||||||
|
|
||||||
--rtl
|
|
||||||
Coerce version strings right to left
|
|
||||||
|
|
||||||
--ltr
|
|
||||||
Coerce version strings left to right (default)
|
|
||||||
|
|
||||||
Program exits successfully if any valid version satisfies
|
|
||||||
all supplied ranges, and prints all satisfying versions.
|
|
||||||
|
|
||||||
If no satisfying versions are found, then exits failure.
|
|
||||||
|
|
||||||
Versions are printed in ascending order, so supplying
|
|
||||||
multiple versions to the utility will just sort them.
|
|
||||||
```
|
|
||||||
|
|
||||||
## Versions
|
|
||||||
|
|
||||||
A "version" is described by the `v2.0.0` specification found at
|
|
||||||
<https://semver.org/>.
|
|
||||||
|
|
||||||
A leading `"="` or `"v"` character is stripped off and ignored.
|
|
||||||
|
|
||||||
## Ranges
|
|
||||||
|
|
||||||
A `version range` is a set of `comparators` which specify versions
|
|
||||||
that satisfy the range.
|
|
||||||
|
|
||||||
A `comparator` is composed of an `operator` and a `version`. The set
|
|
||||||
of primitive `operators` is:
|
|
||||||
|
|
||||||
* `<` Less than
|
|
||||||
* `<=` Less than or equal to
|
|
||||||
* `>` Greater than
|
|
||||||
* `>=` Greater than or equal to
|
|
||||||
* `=` Equal. If no operator is specified, then equality is assumed,
|
|
||||||
so this operator is optional, but MAY be included.
|
|
||||||
|
|
||||||
For example, the comparator `>=1.2.7` would match the versions
|
|
||||||
`1.2.7`, `1.2.8`, `2.5.3`, and `1.3.9`, but not the versions `1.2.6`
|
|
||||||
or `1.1.0`.
|
|
||||||
|
|
||||||
Comparators can be joined by whitespace to form a `comparator set`,
|
|
||||||
which is satisfied by the **intersection** of all of the comparators
|
|
||||||
it includes.
|
|
||||||
|
|
||||||
A range is composed of one or more comparator sets, joined by `||`. A
|
|
||||||
version matches a range if and only if every comparator in at least
|
|
||||||
one of the `||`-separated comparator sets is satisfied by the version.
|
|
||||||
|
|
||||||
For example, the range `>=1.2.7 <1.3.0` would match the versions
|
|
||||||
`1.2.7`, `1.2.8`, and `1.2.99`, but not the versions `1.2.6`, `1.3.0`,
|
|
||||||
or `1.1.0`.
|
|
||||||
|
|
||||||
The range `1.2.7 || >=1.2.9 <2.0.0` would match the versions `1.2.7`,
|
|
||||||
`1.2.9`, and `1.4.6`, but not the versions `1.2.8` or `2.0.0`.
|
|
||||||
|
|
||||||
### Prerelease Tags
|
|
||||||
|
|
||||||
If a version has a prerelease tag (for example, `1.2.3-alpha.3`) then
|
|
||||||
it will only be allowed to satisfy comparator sets if at least one
|
|
||||||
comparator with the same `[major, minor, patch]` tuple also has a
|
|
||||||
prerelease tag.
|
|
||||||
|
|
||||||
For example, the range `>1.2.3-alpha.3` would be allowed to match the
|
|
||||||
version `1.2.3-alpha.7`, but it would *not* be satisfied by
|
|
||||||
`3.4.5-alpha.9`, even though `3.4.5-alpha.9` is technically "greater
|
|
||||||
than" `1.2.3-alpha.3` according to the SemVer sort rules. The version
|
|
||||||
range only accepts prerelease tags on the `1.2.3` version. The
|
|
||||||
version `3.4.5` *would* satisfy the range, because it does not have a
|
|
||||||
prerelease flag, and `3.4.5` is greater than `1.2.3-alpha.7`.
|
|
||||||
|
|
||||||
The purpose for this behavior is twofold. First, prerelease versions
|
|
||||||
frequently are updated very quickly, and contain many breaking changes
|
|
||||||
that are (by the author's design) not yet fit for public consumption.
|
|
||||||
Therefore, by default, they are excluded from range matching
|
|
||||||
semantics.
|
|
||||||
|
|
||||||
Second, a user who has opted into using a prerelease version has
|
|
||||||
clearly indicated the intent to use *that specific* set of
|
|
||||||
alpha/beta/rc versions. By including a prerelease tag in the range,
|
|
||||||
the user is indicating that they are aware of the risk. However, it
|
|
||||||
is still not appropriate to assume that they have opted into taking a
|
|
||||||
similar risk on the *next* set of prerelease versions.
|
|
||||||
|
|
||||||
Note that this behavior can be suppressed (treating all prerelease
|
|
||||||
versions as if they were normal versions, for the purpose of range
|
|
||||||
matching) by setting the `includePrerelease` flag on the options
|
|
||||||
object to any
|
|
||||||
[functions](https://github.com/npm/node-semver#functions) that do
|
|
||||||
range matching.
|
|
||||||
|
|
||||||
#### Prerelease Identifiers
|
|
||||||
|
|
||||||
The method `.inc` takes an additional `identifier` string argument that
|
|
||||||
will append the value of the string as a prerelease identifier:
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
semver.inc('1.2.3', 'prerelease', 'beta')
|
|
||||||
// '1.2.4-beta.0'
|
|
||||||
```
|
|
||||||
|
|
||||||
command-line example:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ semver 1.2.3 -i prerelease --preid beta
|
|
||||||
1.2.4-beta.0
|
|
||||||
```
|
|
||||||
|
|
||||||
Which then can be used to increment further:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ semver 1.2.4-beta.0 -i prerelease
|
|
||||||
1.2.4-beta.1
|
|
||||||
```
|
|
||||||
|
|
||||||
### Advanced Range Syntax
|
|
||||||
|
|
||||||
Advanced range syntax desugars to primitive comparators in
|
|
||||||
deterministic ways.
|
|
||||||
|
|
||||||
Advanced ranges may be combined in the same way as primitive
|
|
||||||
comparators using white space or `||`.
|
|
||||||
|
|
||||||
#### Hyphen Ranges `X.Y.Z - A.B.C`
|
|
||||||
|
|
||||||
Specifies an inclusive set.
|
|
||||||
|
|
||||||
* `1.2.3 - 2.3.4` := `>=1.2.3 <=2.3.4`
|
|
||||||
|
|
||||||
If a partial version is provided as the first version in the inclusive
|
|
||||||
range, then the missing pieces are replaced with zeroes.
|
|
||||||
|
|
||||||
* `1.2 - 2.3.4` := `>=1.2.0 <=2.3.4`
|
|
||||||
|
|
||||||
If a partial version is provided as the second version in the
|
|
||||||
inclusive range, then all versions that start with the supplied parts
|
|
||||||
of the tuple are accepted, but nothing that would be greater than the
|
|
||||||
provided tuple parts.
|
|
||||||
|
|
||||||
* `1.2.3 - 2.3` := `>=1.2.3 <2.4.0-0`
|
|
||||||
* `1.2.3 - 2` := `>=1.2.3 <3.0.0-0`
|
|
||||||
|
|
||||||
#### X-Ranges `1.2.x` `1.X` `1.2.*` `*`
|
|
||||||
|
|
||||||
Any of `X`, `x`, or `*` may be used to "stand in" for one of the
|
|
||||||
numeric values in the `[major, minor, patch]` tuple.
|
|
||||||
|
|
||||||
* `*` := `>=0.0.0` (Any version satisfies)
|
|
||||||
* `1.x` := `>=1.0.0 <2.0.0-0` (Matching major version)
|
|
||||||
* `1.2.x` := `>=1.2.0 <1.3.0-0` (Matching major and minor versions)
|
|
||||||
|
|
||||||
A partial version range is treated as an X-Range, so the special
|
|
||||||
character is in fact optional.
|
|
||||||
|
|
||||||
* `""` (empty string) := `*` := `>=0.0.0`
|
|
||||||
* `1` := `1.x.x` := `>=1.0.0 <2.0.0-0`
|
|
||||||
* `1.2` := `1.2.x` := `>=1.2.0 <1.3.0-0`
|
|
||||||
|
|
||||||
#### Tilde Ranges `~1.2.3` `~1.2` `~1`
|
|
||||||
|
|
||||||
Allows patch-level changes if a minor version is specified on the
|
|
||||||
comparator. Allows minor-level changes if not.
|
|
||||||
|
|
||||||
* `~1.2.3` := `>=1.2.3 <1.(2+1).0` := `>=1.2.3 <1.3.0-0`
|
|
||||||
* `~1.2` := `>=1.2.0 <1.(2+1).0` := `>=1.2.0 <1.3.0-0` (Same as `1.2.x`)
|
|
||||||
* `~1` := `>=1.0.0 <(1+1).0.0` := `>=1.0.0 <2.0.0-0` (Same as `1.x`)
|
|
||||||
* `~0.2.3` := `>=0.2.3 <0.(2+1).0` := `>=0.2.3 <0.3.0-0`
|
|
||||||
* `~0.2` := `>=0.2.0 <0.(2+1).0` := `>=0.2.0 <0.3.0-0` (Same as `0.2.x`)
|
|
||||||
* `~0` := `>=0.0.0 <(0+1).0.0` := `>=0.0.0 <1.0.0-0` (Same as `0.x`)
|
|
||||||
* `~1.2.3-beta.2` := `>=1.2.3-beta.2 <1.3.0-0` Note that prereleases in
|
|
||||||
the `1.2.3` version will be allowed, if they are greater than or
|
|
||||||
equal to `beta.2`. So, `1.2.3-beta.4` would be allowed, but
|
|
||||||
`1.2.4-beta.2` would not, because it is a prerelease of a
|
|
||||||
different `[major, minor, patch]` tuple.
|
|
||||||
|
|
||||||
#### Caret Ranges `^1.2.3` `^0.2.5` `^0.0.4`
|
|
||||||
|
|
||||||
Allows changes that do not modify the left-most non-zero element in the
|
|
||||||
`[major, minor, patch]` tuple. In other words, this allows patch and
|
|
||||||
minor updates for versions `1.0.0` and above, patch updates for
|
|
||||||
versions `0.X >=0.1.0`, and *no* updates for versions `0.0.X`.
|
|
||||||
|
|
||||||
Many authors treat a `0.x` version as if the `x` were the major
|
|
||||||
"breaking-change" indicator.
|
|
||||||
|
|
||||||
Caret ranges are ideal when an author may make breaking changes
|
|
||||||
between `0.2.4` and `0.3.0` releases, which is a common practice.
|
|
||||||
However, it presumes that there will *not* be breaking changes between
|
|
||||||
`0.2.4` and `0.2.5`. It allows for changes that are presumed to be
|
|
||||||
additive (but non-breaking), according to commonly observed practices.
|
|
||||||
|
|
||||||
* `^1.2.3` := `>=1.2.3 <2.0.0-0`
|
|
||||||
* `^0.2.3` := `>=0.2.3 <0.3.0-0`
|
|
||||||
* `^0.0.3` := `>=0.0.3 <0.0.4-0`
|
|
||||||
* `^1.2.3-beta.2` := `>=1.2.3-beta.2 <2.0.0-0` Note that prereleases in
|
|
||||||
the `1.2.3` version will be allowed, if they are greater than or
|
|
||||||
equal to `beta.2`. So, `1.2.3-beta.4` would be allowed, but
|
|
||||||
`1.2.4-beta.2` would not, because it is a prerelease of a
|
|
||||||
different `[major, minor, patch]` tuple.
|
|
||||||
* `^0.0.3-beta` := `>=0.0.3-beta <0.0.4-0` Note that prereleases in the
|
|
||||||
`0.0.3` version *only* will be allowed, if they are greater than or
|
|
||||||
equal to `beta`. So, `0.0.3-pr.2` would be allowed.
|
|
||||||
|
|
||||||
When parsing caret ranges, a missing `patch` value desugars to the
|
|
||||||
number `0`, but will allow flexibility within that value, even if the
|
|
||||||
major and minor versions are both `0`.
|
|
||||||
|
|
||||||
* `^1.2.x` := `>=1.2.0 <2.0.0-0`
|
|
||||||
* `^0.0.x` := `>=0.0.0 <0.1.0-0`
|
|
||||||
* `^0.0` := `>=0.0.0 <0.1.0-0`
|
|
||||||
|
|
||||||
A missing `minor` and `patch` values will desugar to zero, but also
|
|
||||||
allow flexibility within those values, even if the major version is
|
|
||||||
zero.
|
|
||||||
|
|
||||||
* `^1.x` := `>=1.0.0 <2.0.0-0`
|
|
||||||
* `^0.x` := `>=0.0.0 <1.0.0-0`
|
|
||||||
|
|
||||||
### Range Grammar
|
|
||||||
|
|
||||||
Putting all this together, here is a Backus-Naur grammar for ranges,
|
|
||||||
for the benefit of parser authors:
|
|
||||||
|
|
||||||
```bnf
|
|
||||||
range-set ::= range ( logical-or range ) *
|
|
||||||
logical-or ::= ( ' ' ) * '||' ( ' ' ) *
|
|
||||||
range ::= hyphen | simple ( ' ' simple ) * | ''
|
|
||||||
hyphen ::= partial ' - ' partial
|
|
||||||
simple ::= primitive | partial | tilde | caret
|
|
||||||
primitive ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial
|
|
||||||
partial ::= xr ( '.' xr ( '.' xr qualifier ? )? )?
|
|
||||||
xr ::= 'x' | 'X' | '*' | nr
|
|
||||||
nr ::= '0' | ['1'-'9'] ( ['0'-'9'] ) *
|
|
||||||
tilde ::= '~' partial
|
|
||||||
caret ::= '^' partial
|
|
||||||
qualifier ::= ( '-' pre )? ( '+' build )?
|
|
||||||
pre ::= parts
|
|
||||||
build ::= parts
|
|
||||||
parts ::= part ( '.' part ) *
|
|
||||||
part ::= nr | [-0-9A-Za-z]+
|
|
||||||
```
|
|
||||||
|
|
||||||
## Functions
|
|
||||||
|
|
||||||
All methods and classes take a final `options` object argument. All
|
|
||||||
options in this object are `false` by default. The options supported
|
|
||||||
are:
|
|
||||||
|
|
||||||
- `loose` Be more forgiving about not-quite-valid semver strings.
|
|
||||||
(Any resulting output will always be 100% strict compliant, of
|
|
||||||
course.) For backwards compatibility reasons, if the `options`
|
|
||||||
argument is a boolean value instead of an object, it is interpreted
|
|
||||||
to be the `loose` param.
|
|
||||||
- `includePrerelease` Set to suppress the [default
|
|
||||||
behavior](https://github.com/npm/node-semver#prerelease-tags) of
|
|
||||||
excluding prerelease tagged versions from ranges unless they are
|
|
||||||
explicitly opted into.
|
|
||||||
|
|
||||||
Strict-mode Comparators and Ranges will be strict about the SemVer
|
|
||||||
strings that they parse.
|
|
||||||
|
|
||||||
* `valid(v)`: Return the parsed version, or null if it's not valid.
|
|
||||||
* `inc(v, release)`: Return the version incremented by the release
|
|
||||||
type (`major`, `premajor`, `minor`, `preminor`, `patch`,
|
|
||||||
`prepatch`, or `prerelease`), or null if it's not valid
|
|
||||||
* `premajor` in one call will bump the version up to the next major
|
|
||||||
version and down to a prerelease of that major version.
|
|
||||||
`preminor`, and `prepatch` work the same way.
|
|
||||||
* If called from a non-prerelease version, the `prerelease` will work the
|
|
||||||
same as `prepatch`. It increments the patch version, then makes a
|
|
||||||
prerelease. If the input version is already a prerelease it simply
|
|
||||||
increments it.
|
|
||||||
* `prerelease(v)`: Returns an array of prerelease components, or null
|
|
||||||
if none exist. Example: `prerelease('1.2.3-alpha.1') -> ['alpha', 1]`
|
|
||||||
* `major(v)`: Return the major version number.
|
|
||||||
* `minor(v)`: Return the minor version number.
|
|
||||||
* `patch(v)`: Return the patch version number.
|
|
||||||
* `intersects(r1, r2, loose)`: Return true if the two supplied ranges
|
|
||||||
or comparators intersect.
|
|
||||||
* `parse(v)`: Attempt to parse a string as a semantic version, returning either
|
|
||||||
a `SemVer` object or `null`.
|
|
||||||
|
|
||||||
### Comparison
|
|
||||||
|
|
||||||
* `gt(v1, v2)`: `v1 > v2`
|
|
||||||
* `gte(v1, v2)`: `v1 >= v2`
|
|
||||||
* `lt(v1, v2)`: `v1 < v2`
|
|
||||||
* `lte(v1, v2)`: `v1 <= v2`
|
|
||||||
* `eq(v1, v2)`: `v1 == v2` This is true if they're logically equivalent,
|
|
||||||
even if they're not the exact same string. You already know how to
|
|
||||||
compare strings.
|
|
||||||
* `neq(v1, v2)`: `v1 != v2` The opposite of `eq`.
|
|
||||||
* `cmp(v1, comparator, v2)`: Pass in a comparison string, and it'll call
|
|
||||||
the corresponding function above. `"==="` and `"!=="` do simple
|
|
||||||
string comparison, but are included for completeness. Throws if an
|
|
||||||
invalid comparison string is provided.
|
|
||||||
* `compare(v1, v2)`: Return `0` if `v1 == v2`, or `1` if `v1` is greater, or `-1` if
|
|
||||||
`v2` is greater. Sorts in ascending order if passed to `Array.sort()`.
|
|
||||||
* `rcompare(v1, v2)`: The reverse of compare. Sorts an array of versions
|
|
||||||
in descending order when passed to `Array.sort()`.
|
|
||||||
* `compareBuild(v1, v2)`: The same as `compare` but considers `build` when two versions
|
|
||||||
are equal. Sorts in ascending order if passed to `Array.sort()`.
|
|
||||||
`v2` is greater. Sorts in ascending order if passed to `Array.sort()`.
|
|
||||||
* `diff(v1, v2)`: Returns difference between two versions by the release type
|
|
||||||
(`major`, `premajor`, `minor`, `preminor`, `patch`, `prepatch`, or `prerelease`),
|
|
||||||
or null if the versions are the same.
|
|
||||||
|
|
||||||
### Comparators
|
|
||||||
|
|
||||||
* `intersects(comparator)`: Return true if the comparators intersect
|
|
||||||
|
|
||||||
### Ranges
|
|
||||||
|
|
||||||
* `validRange(range)`: Return the valid range or null if it's not valid
|
|
||||||
* `satisfies(version, range)`: Return true if the version satisfies the
|
|
||||||
range.
|
|
||||||
* `maxSatisfying(versions, range)`: Return the highest version in the list
|
|
||||||
that satisfies the range, or `null` if none of them do.
|
|
||||||
* `minSatisfying(versions, range)`: Return the lowest version in the list
|
|
||||||
that satisfies the range, or `null` if none of them do.
|
|
||||||
* `minVersion(range)`: Return the lowest version that can possibly match
|
|
||||||
the given range.
|
|
||||||
* `gtr(version, range)`: Return `true` if version is greater than all the
|
|
||||||
versions possible in the range.
|
|
||||||
* `ltr(version, range)`: Return `true` if version is less than all the
|
|
||||||
versions possible in the range.
|
|
||||||
* `outside(version, range, hilo)`: Return true if the version is outside
|
|
||||||
the bounds of the range in either the high or low direction. The
|
|
||||||
`hilo` argument must be either the string `'>'` or `'<'`. (This is
|
|
||||||
the function called by `gtr` and `ltr`.)
|
|
||||||
* `intersects(range)`: Return true if any of the ranges comparators intersect
|
|
||||||
* `simplifyRange(versions, range)`: Return a "simplified" range that
|
|
||||||
matches the same items in `versions` list as the range specified. Note
|
|
||||||
that it does *not* guarantee that it would match the same versions in all
|
|
||||||
cases, only for the set of versions provided. This is useful when
|
|
||||||
generating ranges by joining together multiple versions with `||`
|
|
||||||
programmatically, to provide the user with something a bit more
|
|
||||||
ergonomic. If the provided range is shorter in string-length than the
|
|
||||||
generated range, then that is returned.
|
|
||||||
* `subset(subRange, superRange)`: Return `true` if the `subRange` range is
|
|
||||||
entirely contained by the `superRange` range.
|
|
||||||
|
|
||||||
Note that, since ranges may be non-contiguous, a version might not be
|
|
||||||
greater than a range, less than a range, *or* satisfy a range! For
|
|
||||||
example, the range `1.2 <1.2.9 || >2.0.0` would have a hole from `1.2.9`
|
|
||||||
until `2.0.0`, so the version `1.2.10` would not be greater than the
|
|
||||||
range (because `2.0.1` satisfies, which is higher), nor less than the
|
|
||||||
range (since `1.2.8` satisfies, which is lower), and it also does not
|
|
||||||
satisfy the range.
|
|
||||||
|
|
||||||
If you want to know if a version satisfies or does not satisfy a
|
|
||||||
range, use the `satisfies(version, range)` function.
|
|
||||||
|
|
||||||
### Coercion
|
|
||||||
|
|
||||||
* `coerce(version, options)`: Coerces a string to semver if possible
|
|
||||||
|
|
||||||
This aims to provide a very forgiving translation of a non-semver string to
|
|
||||||
semver. It looks for the first digit in a string, and consumes all
|
|
||||||
remaining characters which satisfy at least a partial semver (e.g., `1`,
|
|
||||||
`1.2`, `1.2.3`) up to the max permitted length (256 characters). Longer
|
|
||||||
versions are simply truncated (`4.6.3.9.2-alpha2` becomes `4.6.3`). All
|
|
||||||
surrounding text is simply ignored (`v3.4 replaces v3.3.1` becomes
|
|
||||||
`3.4.0`). Only text which lacks digits will fail coercion (`version one`
|
|
||||||
is not valid). The maximum length for any semver component considered for
|
|
||||||
coercion is 16 characters; longer components will be ignored
|
|
||||||
(`10000000000000000.4.7.4` becomes `4.7.4`). The maximum value for any
|
|
||||||
semver component is `Number.MAX_SAFE_INTEGER || (2**53 - 1)`; higher value
|
|
||||||
components are invalid (`9999999999999999.4.7.4` is likely invalid).
|
|
||||||
|
|
||||||
If the `options.rtl` flag is set, then `coerce` will return the right-most
|
|
||||||
coercible tuple that does not share an ending index with a longer coercible
|
|
||||||
tuple. For example, `1.2.3.4` will return `2.3.4` in rtl mode, not
|
|
||||||
`4.0.0`. `1.2.3/4` will return `4.0.0`, because the `4` is not a part of
|
|
||||||
any other overlapping SemVer tuple.
|
|
||||||
|
|
||||||
### Clean
|
|
||||||
|
|
||||||
* `clean(version)`: Clean a string to be a valid semver if possible
|
|
||||||
|
|
||||||
This will return a cleaned and trimmed semver version. If the provided
|
|
||||||
version is not valid a null will be returned. This does not work for
|
|
||||||
ranges.
|
|
||||||
|
|
||||||
ex.
|
|
||||||
* `s.clean(' = v 2.1.5foo')`: `null`
|
|
||||||
* `s.clean(' = v 2.1.5foo', { loose: true })`: `'2.1.5-foo'`
|
|
||||||
* `s.clean(' = v 2.1.5-foo')`: `null`
|
|
||||||
* `s.clean(' = v 2.1.5-foo', { loose: true })`: `'2.1.5-foo'`
|
|
||||||
* `s.clean('=v2.1.5')`: `'2.1.5'`
|
|
||||||
* `s.clean(' =v2.1.5')`: `2.1.5`
|
|
||||||
* `s.clean(' 2.1.5 ')`: `'2.1.5'`
|
|
||||||
* `s.clean('~1.0.0')`: `null`
|
|
||||||
|
|
||||||
## Exported Modules
|
|
||||||
|
|
||||||
<!--
|
|
||||||
TODO: Make sure that all of these items are documented (classes aren't,
|
|
||||||
eg), and then pull the module name into the documentation for that specific
|
|
||||||
thing.
|
|
||||||
-->
|
|
||||||
|
|
||||||
You may pull in just the part of this semver utility that you need, if you
|
|
||||||
are sensitive to packing and tree-shaking concerns. The main
|
|
||||||
`require('semver')` export uses getter functions to lazily load the parts
|
|
||||||
of the API that are used.
|
|
||||||
|
|
||||||
The following modules are available:
|
|
||||||
|
|
||||||
* `require('semver')`
|
|
||||||
* `require('semver/classes')`
|
|
||||||
* `require('semver/classes/comparator')`
|
|
||||||
* `require('semver/classes/range')`
|
|
||||||
* `require('semver/classes/semver')`
|
|
||||||
* `require('semver/functions/clean')`
|
|
||||||
* `require('semver/functions/cmp')`
|
|
||||||
* `require('semver/functions/coerce')`
|
|
||||||
* `require('semver/functions/compare')`
|
|
||||||
* `require('semver/functions/compare-build')`
|
|
||||||
* `require('semver/functions/compare-loose')`
|
|
||||||
* `require('semver/functions/diff')`
|
|
||||||
* `require('semver/functions/eq')`
|
|
||||||
* `require('semver/functions/gt')`
|
|
||||||
* `require('semver/functions/gte')`
|
|
||||||
* `require('semver/functions/inc')`
|
|
||||||
* `require('semver/functions/lt')`
|
|
||||||
* `require('semver/functions/lte')`
|
|
||||||
* `require('semver/functions/major')`
|
|
||||||
* `require('semver/functions/minor')`
|
|
||||||
* `require('semver/functions/neq')`
|
|
||||||
* `require('semver/functions/parse')`
|
|
||||||
* `require('semver/functions/patch')`
|
|
||||||
* `require('semver/functions/prerelease')`
|
|
||||||
* `require('semver/functions/rcompare')`
|
|
||||||
* `require('semver/functions/rsort')`
|
|
||||||
* `require('semver/functions/satisfies')`
|
|
||||||
* `require('semver/functions/sort')`
|
|
||||||
* `require('semver/functions/valid')`
|
|
||||||
* `require('semver/ranges/gtr')`
|
|
||||||
* `require('semver/ranges/intersects')`
|
|
||||||
* `require('semver/ranges/ltr')`
|
|
||||||
* `require('semver/ranges/max-satisfying')`
|
|
||||||
* `require('semver/ranges/min-satisfying')`
|
|
||||||
* `require('semver/ranges/min-version')`
|
|
||||||
* `require('semver/ranges/outside')`
|
|
||||||
* `require('semver/ranges/to-comparators')`
|
|
||||||
* `require('semver/ranges/valid')`
|
|
||||||
173
test/integration/test-fixtures/yarn-lock/node_modules/semver/bin/semver.js
generated
vendored
173
test/integration/test-fixtures/yarn-lock/node_modules/semver/bin/semver.js
generated
vendored
@ -1,173 +0,0 @@
|
|||||||
#!/usr/bin/env node
|
|
||||||
// Standalone semver comparison program.
|
|
||||||
// Exits successfully and prints matching version(s) if
|
|
||||||
// any supplied version is valid and passes all tests.
|
|
||||||
|
|
||||||
const argv = process.argv.slice(2)
|
|
||||||
|
|
||||||
let versions = []
|
|
||||||
|
|
||||||
const range = []
|
|
||||||
|
|
||||||
let inc = null
|
|
||||||
|
|
||||||
const version = require('../package.json').version
|
|
||||||
|
|
||||||
let loose = false
|
|
||||||
|
|
||||||
let includePrerelease = false
|
|
||||||
|
|
||||||
let coerce = false
|
|
||||||
|
|
||||||
let rtl = false
|
|
||||||
|
|
||||||
let identifier
|
|
||||||
|
|
||||||
const semver = require('../')
|
|
||||||
|
|
||||||
let reverse = false
|
|
||||||
|
|
||||||
const options = {}
|
|
||||||
|
|
||||||
const main = () => {
|
|
||||||
if (!argv.length) return help()
|
|
||||||
while (argv.length) {
|
|
||||||
let a = argv.shift()
|
|
||||||
const indexOfEqualSign = a.indexOf('=')
|
|
||||||
if (indexOfEqualSign !== -1) {
|
|
||||||
a = a.slice(0, indexOfEqualSign)
|
|
||||||
argv.unshift(a.slice(indexOfEqualSign + 1))
|
|
||||||
}
|
|
||||||
switch (a) {
|
|
||||||
case '-rv': case '-rev': case '--rev': case '--reverse':
|
|
||||||
reverse = true
|
|
||||||
break
|
|
||||||
case '-l': case '--loose':
|
|
||||||
loose = true
|
|
||||||
break
|
|
||||||
case '-p': case '--include-prerelease':
|
|
||||||
includePrerelease = true
|
|
||||||
break
|
|
||||||
case '-v': case '--version':
|
|
||||||
versions.push(argv.shift())
|
|
||||||
break
|
|
||||||
case '-i': case '--inc': case '--increment':
|
|
||||||
switch (argv[0]) {
|
|
||||||
case 'major': case 'minor': case 'patch': case 'prerelease':
|
|
||||||
case 'premajor': case 'preminor': case 'prepatch':
|
|
||||||
inc = argv.shift()
|
|
||||||
break
|
|
||||||
default:
|
|
||||||
inc = 'patch'
|
|
||||||
break
|
|
||||||
}
|
|
||||||
break
|
|
||||||
case '--preid':
|
|
||||||
identifier = argv.shift()
|
|
||||||
break
|
|
||||||
case '-r': case '--range':
|
|
||||||
range.push(argv.shift())
|
|
||||||
break
|
|
||||||
case '-c': case '--coerce':
|
|
||||||
coerce = true
|
|
||||||
break
|
|
||||||
case '--rtl':
|
|
||||||
rtl = true
|
|
||||||
break
|
|
||||||
case '--ltr':
|
|
||||||
rtl = false
|
|
||||||
break
|
|
||||||
case '-h': case '--help': case '-?':
|
|
||||||
return help()
|
|
||||||
default:
|
|
||||||
versions.push(a)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const options = { loose: loose, includePrerelease: includePrerelease, rtl: rtl }
|
|
||||||
|
|
||||||
versions = versions.map((v) => {
|
|
||||||
return coerce ? (semver.coerce(v, options) || { version: v }).version : v
|
|
||||||
}).filter((v) => {
|
|
||||||
return semver.valid(v)
|
|
||||||
})
|
|
||||||
if (!versions.length) return fail()
|
|
||||||
if (inc && (versions.length !== 1 || range.length)) { return failInc() }
|
|
||||||
|
|
||||||
for (let i = 0, l = range.length; i < l; i++) {
|
|
||||||
versions = versions.filter((v) => {
|
|
||||||
return semver.satisfies(v, range[i], options)
|
|
||||||
})
|
|
||||||
if (!versions.length) return fail()
|
|
||||||
}
|
|
||||||
return success(versions)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const failInc = () => {
|
|
||||||
console.error('--inc can only be used on a single version with no range')
|
|
||||||
fail()
|
|
||||||
}
|
|
||||||
|
|
||||||
const fail = () => process.exit(1)
|
|
||||||
|
|
||||||
const success = () => {
|
|
||||||
const compare = reverse ? 'rcompare' : 'compare'
|
|
||||||
versions.sort((a, b) => {
|
|
||||||
return semver[compare](a, b, options)
|
|
||||||
}).map((v) => {
|
|
||||||
return semver.clean(v, options)
|
|
||||||
}).map((v) => {
|
|
||||||
return inc ? semver.inc(v, inc, options, identifier) : v
|
|
||||||
}).forEach((v, i, _) => { console.log(v) })
|
|
||||||
}
|
|
||||||
|
|
||||||
const help = () => console.log(
|
|
||||||
`SemVer ${version}
|
|
||||||
|
|
||||||
A JavaScript implementation of the https://semver.org/ specification
|
|
||||||
Copyright Isaac Z. Schlueter
|
|
||||||
|
|
||||||
Usage: semver [options] <version> [<version> [...]]
|
|
||||||
Prints valid versions sorted by SemVer precedence
|
|
||||||
|
|
||||||
Options:
|
|
||||||
-r --range <range>
|
|
||||||
Print versions that match the specified range.
|
|
||||||
|
|
||||||
-i --increment [<level>]
|
|
||||||
Increment a version by the specified level. Level can
|
|
||||||
be one of: major, minor, patch, premajor, preminor,
|
|
||||||
prepatch, or prerelease. Default level is 'patch'.
|
|
||||||
Only one version may be specified.
|
|
||||||
|
|
||||||
--preid <identifier>
|
|
||||||
Identifier to be used to prefix premajor, preminor,
|
|
||||||
prepatch or prerelease version increments.
|
|
||||||
|
|
||||||
-l --loose
|
|
||||||
Interpret versions and ranges loosely
|
|
||||||
|
|
||||||
-p --include-prerelease
|
|
||||||
Always include prerelease versions in range matching
|
|
||||||
|
|
||||||
-c --coerce
|
|
||||||
Coerce a string into SemVer if possible
|
|
||||||
(does not imply --loose)
|
|
||||||
|
|
||||||
--rtl
|
|
||||||
Coerce version strings right to left
|
|
||||||
|
|
||||||
--ltr
|
|
||||||
Coerce version strings left to right (default)
|
|
||||||
|
|
||||||
Program exits successfully if any valid version satisfies
|
|
||||||
all supplied ranges, and prints all satisfying versions.
|
|
||||||
|
|
||||||
If no satisfying versions are found, then exits failure.
|
|
||||||
|
|
||||||
Versions are printed in ascending order, so supplying
|
|
||||||
multiple versions to the utility will just sort them.`)
|
|
||||||
|
|
||||||
main()
|
|
||||||
135
test/integration/test-fixtures/yarn-lock/node_modules/semver/classes/comparator.js
generated
vendored
135
test/integration/test-fixtures/yarn-lock/node_modules/semver/classes/comparator.js
generated
vendored
@ -1,135 +0,0 @@
|
|||||||
const ANY = Symbol('SemVer ANY')
|
|
||||||
// hoisted class for cyclic dependency
|
|
||||||
class Comparator {
|
|
||||||
static get ANY () {
|
|
||||||
return ANY
|
|
||||||
}
|
|
||||||
constructor (comp, options) {
|
|
||||||
options = parseOptions(options)
|
|
||||||
|
|
||||||
if (comp instanceof Comparator) {
|
|
||||||
if (comp.loose === !!options.loose) {
|
|
||||||
return comp
|
|
||||||
} else {
|
|
||||||
comp = comp.value
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
debug('comparator', comp, options)
|
|
||||||
this.options = options
|
|
||||||
this.loose = !!options.loose
|
|
||||||
this.parse(comp)
|
|
||||||
|
|
||||||
if (this.semver === ANY) {
|
|
||||||
this.value = ''
|
|
||||||
} else {
|
|
||||||
this.value = this.operator + this.semver.version
|
|
||||||
}
|
|
||||||
|
|
||||||
debug('comp', this)
|
|
||||||
}
|
|
||||||
|
|
||||||
parse (comp) {
|
|
||||||
const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]
|
|
||||||
const m = comp.match(r)
|
|
||||||
|
|
||||||
if (!m) {
|
|
||||||
throw new TypeError(`Invalid comparator: ${comp}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
this.operator = m[1] !== undefined ? m[1] : ''
|
|
||||||
if (this.operator === '=') {
|
|
||||||
this.operator = ''
|
|
||||||
}
|
|
||||||
|
|
||||||
// if it literally is just '>' or '' then allow anything.
|
|
||||||
if (!m[2]) {
|
|
||||||
this.semver = ANY
|
|
||||||
} else {
|
|
||||||
this.semver = new SemVer(m[2], this.options.loose)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
toString () {
|
|
||||||
return this.value
|
|
||||||
}
|
|
||||||
|
|
||||||
test (version) {
|
|
||||||
debug('Comparator.test', version, this.options.loose)
|
|
||||||
|
|
||||||
if (this.semver === ANY || version === ANY) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof version === 'string') {
|
|
||||||
try {
|
|
||||||
version = new SemVer(version, this.options)
|
|
||||||
} catch (er) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return cmp(version, this.operator, this.semver, this.options)
|
|
||||||
}
|
|
||||||
|
|
||||||
intersects (comp, options) {
|
|
||||||
if (!(comp instanceof Comparator)) {
|
|
||||||
throw new TypeError('a Comparator is required')
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!options || typeof options !== 'object') {
|
|
||||||
options = {
|
|
||||||
loose: !!options,
|
|
||||||
includePrerelease: false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.operator === '') {
|
|
||||||
if (this.value === '') {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return new Range(comp.value, options).test(this.value)
|
|
||||||
} else if (comp.operator === '') {
|
|
||||||
if (comp.value === '') {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return new Range(this.value, options).test(comp.semver)
|
|
||||||
}
|
|
||||||
|
|
||||||
const sameDirectionIncreasing =
|
|
||||||
(this.operator === '>=' || this.operator === '>') &&
|
|
||||||
(comp.operator === '>=' || comp.operator === '>')
|
|
||||||
const sameDirectionDecreasing =
|
|
||||||
(this.operator === '<=' || this.operator === '<') &&
|
|
||||||
(comp.operator === '<=' || comp.operator === '<')
|
|
||||||
const sameSemVer = this.semver.version === comp.semver.version
|
|
||||||
const differentDirectionsInclusive =
|
|
||||||
(this.operator === '>=' || this.operator === '<=') &&
|
|
||||||
(comp.operator === '>=' || comp.operator === '<=')
|
|
||||||
const oppositeDirectionsLessThan =
|
|
||||||
cmp(this.semver, '<', comp.semver, options) &&
|
|
||||||
(this.operator === '>=' || this.operator === '>') &&
|
|
||||||
(comp.operator === '<=' || comp.operator === '<')
|
|
||||||
const oppositeDirectionsGreaterThan =
|
|
||||||
cmp(this.semver, '>', comp.semver, options) &&
|
|
||||||
(this.operator === '<=' || this.operator === '<') &&
|
|
||||||
(comp.operator === '>=' || comp.operator === '>')
|
|
||||||
|
|
||||||
return (
|
|
||||||
sameDirectionIncreasing ||
|
|
||||||
sameDirectionDecreasing ||
|
|
||||||
(sameSemVer && differentDirectionsInclusive) ||
|
|
||||||
oppositeDirectionsLessThan ||
|
|
||||||
oppositeDirectionsGreaterThan
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = Comparator
|
|
||||||
|
|
||||||
const parseOptions = require('../internal/parse-options')
|
|
||||||
const {re, t} = require('../internal/re')
|
|
||||||
const cmp = require('../functions/cmp')
|
|
||||||
const debug = require('../internal/debug')
|
|
||||||
const SemVer = require('./semver')
|
|
||||||
const Range = require('./range')
|
|
||||||
5
test/integration/test-fixtures/yarn-lock/node_modules/semver/classes/index.js
generated
vendored
5
test/integration/test-fixtures/yarn-lock/node_modules/semver/classes/index.js
generated
vendored
@ -1,5 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
SemVer: require('./semver.js'),
|
|
||||||
Range: require('./range.js'),
|
|
||||||
Comparator: require('./comparator.js')
|
|
||||||
}
|
|
||||||
510
test/integration/test-fixtures/yarn-lock/node_modules/semver/classes/range.js
generated
vendored
510
test/integration/test-fixtures/yarn-lock/node_modules/semver/classes/range.js
generated
vendored
@ -1,510 +0,0 @@
|
|||||||
// hoisted class for cyclic dependency
|
|
||||||
class Range {
|
|
||||||
constructor (range, options) {
|
|
||||||
options = parseOptions(options)
|
|
||||||
|
|
||||||
if (range instanceof Range) {
|
|
||||||
if (
|
|
||||||
range.loose === !!options.loose &&
|
|
||||||
range.includePrerelease === !!options.includePrerelease
|
|
||||||
) {
|
|
||||||
return range
|
|
||||||
} else {
|
|
||||||
return new Range(range.raw, options)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (range instanceof Comparator) {
|
|
||||||
// just put it in the set and return
|
|
||||||
this.raw = range.value
|
|
||||||
this.set = [[range]]
|
|
||||||
this.format()
|
|
||||||
return this
|
|
||||||
}
|
|
||||||
|
|
||||||
this.options = options
|
|
||||||
this.loose = !!options.loose
|
|
||||||
this.includePrerelease = !!options.includePrerelease
|
|
||||||
|
|
||||||
// First, split based on boolean or ||
|
|
||||||
this.raw = range
|
|
||||||
this.set = range
|
|
||||||
.split(/\s*\|\|\s*/)
|
|
||||||
// map the range to a 2d array of comparators
|
|
||||||
.map(range => this.parseRange(range.trim()))
|
|
||||||
// throw out any comparator lists that are empty
|
|
||||||
// this generally means that it was not a valid range, which is allowed
|
|
||||||
// in loose mode, but will still throw if the WHOLE range is invalid.
|
|
||||||
.filter(c => c.length)
|
|
||||||
|
|
||||||
if (!this.set.length) {
|
|
||||||
throw new TypeError(`Invalid SemVer Range: ${range}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
// if we have any that are not the null set, throw out null sets.
|
|
||||||
if (this.set.length > 1) {
|
|
||||||
// keep the first one, in case they're all null sets
|
|
||||||
const first = this.set[0]
|
|
||||||
this.set = this.set.filter(c => !isNullSet(c[0]))
|
|
||||||
if (this.set.length === 0)
|
|
||||||
this.set = [first]
|
|
||||||
else if (this.set.length > 1) {
|
|
||||||
// if we have any that are *, then the range is just *
|
|
||||||
for (const c of this.set) {
|
|
||||||
if (c.length === 1 && isAny(c[0])) {
|
|
||||||
this.set = [c]
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.format()
|
|
||||||
}
|
|
||||||
|
|
||||||
format () {
|
|
||||||
this.range = this.set
|
|
||||||
.map((comps) => {
|
|
||||||
return comps.join(' ').trim()
|
|
||||||
})
|
|
||||||
.join('||')
|
|
||||||
.trim()
|
|
||||||
return this.range
|
|
||||||
}
|
|
||||||
|
|
||||||
toString () {
|
|
||||||
return this.range
|
|
||||||
}
|
|
||||||
|
|
||||||
parseRange (range) {
|
|
||||||
range = range.trim()
|
|
||||||
|
|
||||||
// memoize range parsing for performance.
|
|
||||||
// this is a very hot path, and fully deterministic.
|
|
||||||
const memoOpts = Object.keys(this.options).join(',')
|
|
||||||
const memoKey = `parseRange:${memoOpts}:${range}`
|
|
||||||
const cached = cache.get(memoKey)
|
|
||||||
if (cached)
|
|
||||||
return cached
|
|
||||||
|
|
||||||
const loose = this.options.loose
|
|
||||||
// `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`
|
|
||||||
const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE]
|
|
||||||
range = range.replace(hr, hyphenReplace(this.options.includePrerelease))
|
|
||||||
debug('hyphen replace', range)
|
|
||||||
// `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`
|
|
||||||
range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace)
|
|
||||||
debug('comparator trim', range, re[t.COMPARATORTRIM])
|
|
||||||
|
|
||||||
// `~ 1.2.3` => `~1.2.3`
|
|
||||||
range = range.replace(re[t.TILDETRIM], tildeTrimReplace)
|
|
||||||
|
|
||||||
// `^ 1.2.3` => `^1.2.3`
|
|
||||||
range = range.replace(re[t.CARETTRIM], caretTrimReplace)
|
|
||||||
|
|
||||||
// normalize spaces
|
|
||||||
range = range.split(/\s+/).join(' ')
|
|
||||||
|
|
||||||
// At this point, the range is completely trimmed and
|
|
||||||
// ready to be split into comparators.
|
|
||||||
|
|
||||||
const compRe = loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]
|
|
||||||
const rangeList = range
|
|
||||||
.split(' ')
|
|
||||||
.map(comp => parseComparator(comp, this.options))
|
|
||||||
.join(' ')
|
|
||||||
.split(/\s+/)
|
|
||||||
// >=0.0.0 is equivalent to *
|
|
||||||
.map(comp => replaceGTE0(comp, this.options))
|
|
||||||
// in loose mode, throw out any that are not valid comparators
|
|
||||||
.filter(this.options.loose ? comp => !!comp.match(compRe) : () => true)
|
|
||||||
.map(comp => new Comparator(comp, this.options))
|
|
||||||
|
|
||||||
// if any comparators are the null set, then replace with JUST null set
|
|
||||||
// if more than one comparator, remove any * comparators
|
|
||||||
// also, don't include the same comparator more than once
|
|
||||||
const l = rangeList.length
|
|
||||||
const rangeMap = new Map()
|
|
||||||
for (const comp of rangeList) {
|
|
||||||
if (isNullSet(comp))
|
|
||||||
return [comp]
|
|
||||||
rangeMap.set(comp.value, comp)
|
|
||||||
}
|
|
||||||
if (rangeMap.size > 1 && rangeMap.has(''))
|
|
||||||
rangeMap.delete('')
|
|
||||||
|
|
||||||
const result = [...rangeMap.values()]
|
|
||||||
cache.set(memoKey, result)
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
intersects (range, options) {
|
|
||||||
if (!(range instanceof Range)) {
|
|
||||||
throw new TypeError('a Range is required')
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.set.some((thisComparators) => {
|
|
||||||
return (
|
|
||||||
isSatisfiable(thisComparators, options) &&
|
|
||||||
range.set.some((rangeComparators) => {
|
|
||||||
return (
|
|
||||||
isSatisfiable(rangeComparators, options) &&
|
|
||||||
thisComparators.every((thisComparator) => {
|
|
||||||
return rangeComparators.every((rangeComparator) => {
|
|
||||||
return thisComparator.intersects(rangeComparator, options)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
)
|
|
||||||
})
|
|
||||||
)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// if ANY of the sets match ALL of its comparators, then pass
|
|
||||||
test (version) {
|
|
||||||
if (!version) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof version === 'string') {
|
|
||||||
try {
|
|
||||||
version = new SemVer(version, this.options)
|
|
||||||
} catch (er) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let i = 0; i < this.set.length; i++) {
|
|
||||||
if (testSet(this.set[i], version, this.options)) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
module.exports = Range
|
|
||||||
|
|
||||||
const LRU = require('lru-cache')
|
|
||||||
const cache = new LRU({ max: 1000 })
|
|
||||||
|
|
||||||
const parseOptions = require('../internal/parse-options')
|
|
||||||
const Comparator = require('./comparator')
|
|
||||||
const debug = require('../internal/debug')
|
|
||||||
const SemVer = require('./semver')
|
|
||||||
const {
|
|
||||||
re,
|
|
||||||
t,
|
|
||||||
comparatorTrimReplace,
|
|
||||||
tildeTrimReplace,
|
|
||||||
caretTrimReplace
|
|
||||||
} = require('../internal/re')
|
|
||||||
|
|
||||||
const isNullSet = c => c.value === '<0.0.0-0'
|
|
||||||
const isAny = c => c.value === ''
|
|
||||||
|
|
||||||
// take a set of comparators and determine whether there
|
|
||||||
// exists a version which can satisfy it
|
|
||||||
const isSatisfiable = (comparators, options) => {
|
|
||||||
let result = true
|
|
||||||
const remainingComparators = comparators.slice()
|
|
||||||
let testComparator = remainingComparators.pop()
|
|
||||||
|
|
||||||
while (result && remainingComparators.length) {
|
|
||||||
result = remainingComparators.every((otherComparator) => {
|
|
||||||
return testComparator.intersects(otherComparator, options)
|
|
||||||
})
|
|
||||||
|
|
||||||
testComparator = remainingComparators.pop()
|
|
||||||
}
|
|
||||||
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
// comprised of xranges, tildes, stars, and gtlt's at this point.
|
|
||||||
// already replaced the hyphen ranges
|
|
||||||
// turn into a set of JUST comparators.
|
|
||||||
const parseComparator = (comp, options) => {
|
|
||||||
debug('comp', comp, options)
|
|
||||||
comp = replaceCarets(comp, options)
|
|
||||||
debug('caret', comp)
|
|
||||||
comp = replaceTildes(comp, options)
|
|
||||||
debug('tildes', comp)
|
|
||||||
comp = replaceXRanges(comp, options)
|
|
||||||
debug('xrange', comp)
|
|
||||||
comp = replaceStars(comp, options)
|
|
||||||
debug('stars', comp)
|
|
||||||
return comp
|
|
||||||
}
|
|
||||||
|
|
||||||
const isX = id => !id || id.toLowerCase() === 'x' || id === '*'
|
|
||||||
|
|
||||||
// ~, ~> --> * (any, kinda silly)
|
|
||||||
// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0
|
|
||||||
// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0
|
|
||||||
// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0
|
|
||||||
// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0
|
|
||||||
// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0
|
|
||||||
const replaceTildes = (comp, options) =>
|
|
||||||
comp.trim().split(/\s+/).map((comp) => {
|
|
||||||
return replaceTilde(comp, options)
|
|
||||||
}).join(' ')
|
|
||||||
|
|
||||||
const replaceTilde = (comp, options) => {
|
|
||||||
const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE]
|
|
||||||
return comp.replace(r, (_, M, m, p, pr) => {
|
|
||||||
debug('tilde', comp, _, M, m, p, pr)
|
|
||||||
let ret
|
|
||||||
|
|
||||||
if (isX(M)) {
|
|
||||||
ret = ''
|
|
||||||
} else if (isX(m)) {
|
|
||||||
ret = `>=${M}.0.0 <${+M + 1}.0.0-0`
|
|
||||||
} else if (isX(p)) {
|
|
||||||
// ~1.2 == >=1.2.0 <1.3.0-0
|
|
||||||
ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`
|
|
||||||
} else if (pr) {
|
|
||||||
debug('replaceTilde pr', pr)
|
|
||||||
ret = `>=${M}.${m}.${p}-${pr
|
|
||||||
} <${M}.${+m + 1}.0-0`
|
|
||||||
} else {
|
|
||||||
// ~1.2.3 == >=1.2.3 <1.3.0-0
|
|
||||||
ret = `>=${M}.${m}.${p
|
|
||||||
} <${M}.${+m + 1}.0-0`
|
|
||||||
}
|
|
||||||
|
|
||||||
debug('tilde return', ret)
|
|
||||||
return ret
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// ^ --> * (any, kinda silly)
|
|
||||||
// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0
|
|
||||||
// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0
|
|
||||||
// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0
|
|
||||||
// ^1.2.3 --> >=1.2.3 <2.0.0-0
|
|
||||||
// ^1.2.0 --> >=1.2.0 <2.0.0-0
|
|
||||||
const replaceCarets = (comp, options) =>
|
|
||||||
comp.trim().split(/\s+/).map((comp) => {
|
|
||||||
return replaceCaret(comp, options)
|
|
||||||
}).join(' ')
|
|
||||||
|
|
||||||
const replaceCaret = (comp, options) => {
|
|
||||||
debug('caret', comp, options)
|
|
||||||
const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET]
|
|
||||||
const z = options.includePrerelease ? '-0' : ''
|
|
||||||
return comp.replace(r, (_, M, m, p, pr) => {
|
|
||||||
debug('caret', comp, _, M, m, p, pr)
|
|
||||||
let ret
|
|
||||||
|
|
||||||
if (isX(M)) {
|
|
||||||
ret = ''
|
|
||||||
} else if (isX(m)) {
|
|
||||||
ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`
|
|
||||||
} else if (isX(p)) {
|
|
||||||
if (M === '0') {
|
|
||||||
ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`
|
|
||||||
} else {
|
|
||||||
ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`
|
|
||||||
}
|
|
||||||
} else if (pr) {
|
|
||||||
debug('replaceCaret pr', pr)
|
|
||||||
if (M === '0') {
|
|
||||||
if (m === '0') {
|
|
||||||
ret = `>=${M}.${m}.${p}-${pr
|
|
||||||
} <${M}.${m}.${+p + 1}-0`
|
|
||||||
} else {
|
|
||||||
ret = `>=${M}.${m}.${p}-${pr
|
|
||||||
} <${M}.${+m + 1}.0-0`
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ret = `>=${M}.${m}.${p}-${pr
|
|
||||||
} <${+M + 1}.0.0-0`
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
debug('no pr')
|
|
||||||
if (M === '0') {
|
|
||||||
if (m === '0') {
|
|
||||||
ret = `>=${M}.${m}.${p
|
|
||||||
}${z} <${M}.${m}.${+p + 1}-0`
|
|
||||||
} else {
|
|
||||||
ret = `>=${M}.${m}.${p
|
|
||||||
}${z} <${M}.${+m + 1}.0-0`
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ret = `>=${M}.${m}.${p
|
|
||||||
} <${+M + 1}.0.0-0`
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
debug('caret return', ret)
|
|
||||||
return ret
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
const replaceXRanges = (comp, options) => {
|
|
||||||
debug('replaceXRanges', comp, options)
|
|
||||||
return comp.split(/\s+/).map((comp) => {
|
|
||||||
return replaceXRange(comp, options)
|
|
||||||
}).join(' ')
|
|
||||||
}
|
|
||||||
|
|
||||||
const replaceXRange = (comp, options) => {
|
|
||||||
comp = comp.trim()
|
|
||||||
const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE]
|
|
||||||
return comp.replace(r, (ret, gtlt, M, m, p, pr) => {
|
|
||||||
debug('xRange', comp, ret, gtlt, M, m, p, pr)
|
|
||||||
const xM = isX(M)
|
|
||||||
const xm = xM || isX(m)
|
|
||||||
const xp = xm || isX(p)
|
|
||||||
const anyX = xp
|
|
||||||
|
|
||||||
if (gtlt === '=' && anyX) {
|
|
||||||
gtlt = ''
|
|
||||||
}
|
|
||||||
|
|
||||||
// if we're including prereleases in the match, then we need
|
|
||||||
// to fix this to -0, the lowest possible prerelease value
|
|
||||||
pr = options.includePrerelease ? '-0' : ''
|
|
||||||
|
|
||||||
if (xM) {
|
|
||||||
if (gtlt === '>' || gtlt === '<') {
|
|
||||||
// nothing is allowed
|
|
||||||
ret = '<0.0.0-0'
|
|
||||||
} else {
|
|
||||||
// nothing is forbidden
|
|
||||||
ret = '*'
|
|
||||||
}
|
|
||||||
} else if (gtlt && anyX) {
|
|
||||||
// we know patch is an x, because we have any x at all.
|
|
||||||
// replace X with 0
|
|
||||||
if (xm) {
|
|
||||||
m = 0
|
|
||||||
}
|
|
||||||
p = 0
|
|
||||||
|
|
||||||
if (gtlt === '>') {
|
|
||||||
// >1 => >=2.0.0
|
|
||||||
// >1.2 => >=1.3.0
|
|
||||||
gtlt = '>='
|
|
||||||
if (xm) {
|
|
||||||
M = +M + 1
|
|
||||||
m = 0
|
|
||||||
p = 0
|
|
||||||
} else {
|
|
||||||
m = +m + 1
|
|
||||||
p = 0
|
|
||||||
}
|
|
||||||
} else if (gtlt === '<=') {
|
|
||||||
// <=0.7.x is actually <0.8.0, since any 0.7.x should
|
|
||||||
// pass. Similarly, <=7.x is actually <8.0.0, etc.
|
|
||||||
gtlt = '<'
|
|
||||||
if (xm) {
|
|
||||||
M = +M + 1
|
|
||||||
} else {
|
|
||||||
m = +m + 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gtlt === '<')
|
|
||||||
pr = '-0'
|
|
||||||
|
|
||||||
ret = `${gtlt + M}.${m}.${p}${pr}`
|
|
||||||
} else if (xm) {
|
|
||||||
ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0`
|
|
||||||
} else if (xp) {
|
|
||||||
ret = `>=${M}.${m}.0${pr
|
|
||||||
} <${M}.${+m + 1}.0-0`
|
|
||||||
}
|
|
||||||
|
|
||||||
debug('xRange return', ret)
|
|
||||||
|
|
||||||
return ret
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// Because * is AND-ed with everything else in the comparator,
|
|
||||||
// and '' means "any version", just remove the *s entirely.
|
|
||||||
const replaceStars = (comp, options) => {
|
|
||||||
debug('replaceStars', comp, options)
|
|
||||||
// Looseness is ignored here. star is always as loose as it gets!
|
|
||||||
return comp.trim().replace(re[t.STAR], '')
|
|
||||||
}
|
|
||||||
|
|
||||||
const replaceGTE0 = (comp, options) => {
|
|
||||||
debug('replaceGTE0', comp, options)
|
|
||||||
return comp.trim()
|
|
||||||
.replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '')
|
|
||||||
}
|
|
||||||
|
|
||||||
// This function is passed to string.replace(re[t.HYPHENRANGE])
|
|
||||||
// M, m, patch, prerelease, build
|
|
||||||
// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5
|
|
||||||
// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do
|
|
||||||
// 1.2 - 3.4 => >=1.2.0 <3.5.0-0
|
|
||||||
const hyphenReplace = incPr => ($0,
|
|
||||||
from, fM, fm, fp, fpr, fb,
|
|
||||||
to, tM, tm, tp, tpr, tb) => {
|
|
||||||
if (isX(fM)) {
|
|
||||||
from = ''
|
|
||||||
} else if (isX(fm)) {
|
|
||||||
from = `>=${fM}.0.0${incPr ? '-0' : ''}`
|
|
||||||
} else if (isX(fp)) {
|
|
||||||
from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}`
|
|
||||||
} else if (fpr) {
|
|
||||||
from = `>=${from}`
|
|
||||||
} else {
|
|
||||||
from = `>=${from}${incPr ? '-0' : ''}`
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isX(tM)) {
|
|
||||||
to = ''
|
|
||||||
} else if (isX(tm)) {
|
|
||||||
to = `<${+tM + 1}.0.0-0`
|
|
||||||
} else if (isX(tp)) {
|
|
||||||
to = `<${tM}.${+tm + 1}.0-0`
|
|
||||||
} else if (tpr) {
|
|
||||||
to = `<=${tM}.${tm}.${tp}-${tpr}`
|
|
||||||
} else if (incPr) {
|
|
||||||
to = `<${tM}.${tm}.${+tp + 1}-0`
|
|
||||||
} else {
|
|
||||||
to = `<=${to}`
|
|
||||||
}
|
|
||||||
|
|
||||||
return (`${from} ${to}`).trim()
|
|
||||||
}
|
|
||||||
|
|
||||||
const testSet = (set, version, options) => {
|
|
||||||
for (let i = 0; i < set.length; i++) {
|
|
||||||
if (!set[i].test(version)) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (version.prerelease.length && !options.includePrerelease) {
|
|
||||||
// Find the set of versions that are allowed to have prereleases
|
|
||||||
// For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0
|
|
||||||
// That should allow `1.2.3-pr.2` to pass.
|
|
||||||
// However, `1.2.4-alpha.notready` should NOT be allowed,
|
|
||||||
// even though it's within the range set by the comparators.
|
|
||||||
for (let i = 0; i < set.length; i++) {
|
|
||||||
debug(set[i].semver)
|
|
||||||
if (set[i].semver === Comparator.ANY) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if (set[i].semver.prerelease.length > 0) {
|
|
||||||
const allowed = set[i].semver
|
|
||||||
if (allowed.major === version.major &&
|
|
||||||
allowed.minor === version.minor &&
|
|
||||||
allowed.patch === version.patch) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Version has a -pre, but it's not one of the ones we like.
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
287
test/integration/test-fixtures/yarn-lock/node_modules/semver/classes/semver.js
generated
vendored
287
test/integration/test-fixtures/yarn-lock/node_modules/semver/classes/semver.js
generated
vendored
@ -1,287 +0,0 @@
|
|||||||
const debug = require('../internal/debug')
|
|
||||||
const { MAX_LENGTH, MAX_SAFE_INTEGER } = require('../internal/constants')
|
|
||||||
const { re, t } = require('../internal/re')
|
|
||||||
|
|
||||||
const parseOptions = require('../internal/parse-options')
|
|
||||||
const { compareIdentifiers } = require('../internal/identifiers')
|
|
||||||
class SemVer {
|
|
||||||
constructor (version, options) {
|
|
||||||
options = parseOptions(options)
|
|
||||||
|
|
||||||
if (version instanceof SemVer) {
|
|
||||||
if (version.loose === !!options.loose &&
|
|
||||||
version.includePrerelease === !!options.includePrerelease) {
|
|
||||||
return version
|
|
||||||
} else {
|
|
||||||
version = version.version
|
|
||||||
}
|
|
||||||
} else if (typeof version !== 'string') {
|
|
||||||
throw new TypeError(`Invalid Version: ${version}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (version.length > MAX_LENGTH) {
|
|
||||||
throw new TypeError(
|
|
||||||
`version is longer than ${MAX_LENGTH} characters`
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
debug('SemVer', version, options)
|
|
||||||
this.options = options
|
|
||||||
this.loose = !!options.loose
|
|
||||||
// this isn't actually relevant for versions, but keep it so that we
|
|
||||||
// don't run into trouble passing this.options around.
|
|
||||||
this.includePrerelease = !!options.includePrerelease
|
|
||||||
|
|
||||||
const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL])
|
|
||||||
|
|
||||||
if (!m) {
|
|
||||||
throw new TypeError(`Invalid Version: ${version}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
this.raw = version
|
|
||||||
|
|
||||||
// these are actually numbers
|
|
||||||
this.major = +m[1]
|
|
||||||
this.minor = +m[2]
|
|
||||||
this.patch = +m[3]
|
|
||||||
|
|
||||||
if (this.major > MAX_SAFE_INTEGER || this.major < 0) {
|
|
||||||
throw new TypeError('Invalid major version')
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {
|
|
||||||
throw new TypeError('Invalid minor version')
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {
|
|
||||||
throw new TypeError('Invalid patch version')
|
|
||||||
}
|
|
||||||
|
|
||||||
// numberify any prerelease numeric ids
|
|
||||||
if (!m[4]) {
|
|
||||||
this.prerelease = []
|
|
||||||
} else {
|
|
||||||
this.prerelease = m[4].split('.').map((id) => {
|
|
||||||
if (/^[0-9]+$/.test(id)) {
|
|
||||||
const num = +id
|
|
||||||
if (num >= 0 && num < MAX_SAFE_INTEGER) {
|
|
||||||
return num
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return id
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
this.build = m[5] ? m[5].split('.') : []
|
|
||||||
this.format()
|
|
||||||
}
|
|
||||||
|
|
||||||
format () {
|
|
||||||
this.version = `${this.major}.${this.minor}.${this.patch}`
|
|
||||||
if (this.prerelease.length) {
|
|
||||||
this.version += `-${this.prerelease.join('.')}`
|
|
||||||
}
|
|
||||||
return this.version
|
|
||||||
}
|
|
||||||
|
|
||||||
toString () {
|
|
||||||
return this.version
|
|
||||||
}
|
|
||||||
|
|
||||||
compare (other) {
|
|
||||||
debug('SemVer.compare', this.version, this.options, other)
|
|
||||||
if (!(other instanceof SemVer)) {
|
|
||||||
if (typeof other === 'string' && other === this.version) {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
other = new SemVer(other, this.options)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (other.version === this.version) {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.compareMain(other) || this.comparePre(other)
|
|
||||||
}
|
|
||||||
|
|
||||||
compareMain (other) {
|
|
||||||
if (!(other instanceof SemVer)) {
|
|
||||||
other = new SemVer(other, this.options)
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
compareIdentifiers(this.major, other.major) ||
|
|
||||||
compareIdentifiers(this.minor, other.minor) ||
|
|
||||||
compareIdentifiers(this.patch, other.patch)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
comparePre (other) {
|
|
||||||
if (!(other instanceof SemVer)) {
|
|
||||||
other = new SemVer(other, this.options)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOT having a prerelease is > having one
|
|
||||||
if (this.prerelease.length && !other.prerelease.length) {
|
|
||||||
return -1
|
|
||||||
} else if (!this.prerelease.length && other.prerelease.length) {
|
|
||||||
return 1
|
|
||||||
} else if (!this.prerelease.length && !other.prerelease.length) {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
let i = 0
|
|
||||||
do {
|
|
||||||
const a = this.prerelease[i]
|
|
||||||
const b = other.prerelease[i]
|
|
||||||
debug('prerelease compare', i, a, b)
|
|
||||||
if (a === undefined && b === undefined) {
|
|
||||||
return 0
|
|
||||||
} else if (b === undefined) {
|
|
||||||
return 1
|
|
||||||
} else if (a === undefined) {
|
|
||||||
return -1
|
|
||||||
} else if (a === b) {
|
|
||||||
continue
|
|
||||||
} else {
|
|
||||||
return compareIdentifiers(a, b)
|
|
||||||
}
|
|
||||||
} while (++i)
|
|
||||||
}
|
|
||||||
|
|
||||||
compareBuild (other) {
|
|
||||||
if (!(other instanceof SemVer)) {
|
|
||||||
other = new SemVer(other, this.options)
|
|
||||||
}
|
|
||||||
|
|
||||||
let i = 0
|
|
||||||
do {
|
|
||||||
const a = this.build[i]
|
|
||||||
const b = other.build[i]
|
|
||||||
debug('prerelease compare', i, a, b)
|
|
||||||
if (a === undefined && b === undefined) {
|
|
||||||
return 0
|
|
||||||
} else if (b === undefined) {
|
|
||||||
return 1
|
|
||||||
} else if (a === undefined) {
|
|
||||||
return -1
|
|
||||||
} else if (a === b) {
|
|
||||||
continue
|
|
||||||
} else {
|
|
||||||
return compareIdentifiers(a, b)
|
|
||||||
}
|
|
||||||
} while (++i)
|
|
||||||
}
|
|
||||||
|
|
||||||
// preminor will bump the version up to the next minor release, and immediately
|
|
||||||
// down to pre-release. premajor and prepatch work the same way.
|
|
||||||
inc (release, identifier) {
|
|
||||||
switch (release) {
|
|
||||||
case 'premajor':
|
|
||||||
this.prerelease.length = 0
|
|
||||||
this.patch = 0
|
|
||||||
this.minor = 0
|
|
||||||
this.major++
|
|
||||||
this.inc('pre', identifier)
|
|
||||||
break
|
|
||||||
case 'preminor':
|
|
||||||
this.prerelease.length = 0
|
|
||||||
this.patch = 0
|
|
||||||
this.minor++
|
|
||||||
this.inc('pre', identifier)
|
|
||||||
break
|
|
||||||
case 'prepatch':
|
|
||||||
// If this is already a prerelease, it will bump to the next version
|
|
||||||
// drop any prereleases that might already exist, since they are not
|
|
||||||
// relevant at this point.
|
|
||||||
this.prerelease.length = 0
|
|
||||||
this.inc('patch', identifier)
|
|
||||||
this.inc('pre', identifier)
|
|
||||||
break
|
|
||||||
// If the input is a non-prerelease version, this acts the same as
|
|
||||||
// prepatch.
|
|
||||||
case 'prerelease':
|
|
||||||
if (this.prerelease.length === 0) {
|
|
||||||
this.inc('patch', identifier)
|
|
||||||
}
|
|
||||||
this.inc('pre', identifier)
|
|
||||||
break
|
|
||||||
|
|
||||||
case 'major':
|
|
||||||
// If this is a pre-major version, bump up to the same major version.
|
|
||||||
// Otherwise increment major.
|
|
||||||
// 1.0.0-5 bumps to 1.0.0
|
|
||||||
// 1.1.0 bumps to 2.0.0
|
|
||||||
if (
|
|
||||||
this.minor !== 0 ||
|
|
||||||
this.patch !== 0 ||
|
|
||||||
this.prerelease.length === 0
|
|
||||||
) {
|
|
||||||
this.major++
|
|
||||||
}
|
|
||||||
this.minor = 0
|
|
||||||
this.patch = 0
|
|
||||||
this.prerelease = []
|
|
||||||
break
|
|
||||||
case 'minor':
|
|
||||||
// If this is a pre-minor version, bump up to the same minor version.
|
|
||||||
// Otherwise increment minor.
|
|
||||||
// 1.2.0-5 bumps to 1.2.0
|
|
||||||
// 1.2.1 bumps to 1.3.0
|
|
||||||
if (this.patch !== 0 || this.prerelease.length === 0) {
|
|
||||||
this.minor++
|
|
||||||
}
|
|
||||||
this.patch = 0
|
|
||||||
this.prerelease = []
|
|
||||||
break
|
|
||||||
case 'patch':
|
|
||||||
// If this is not a pre-release version, it will increment the patch.
|
|
||||||
// If it is a pre-release it will bump up to the same patch version.
|
|
||||||
// 1.2.0-5 patches to 1.2.0
|
|
||||||
// 1.2.0 patches to 1.2.1
|
|
||||||
if (this.prerelease.length === 0) {
|
|
||||||
this.patch++
|
|
||||||
}
|
|
||||||
this.prerelease = []
|
|
||||||
break
|
|
||||||
// This probably shouldn't be used publicly.
|
|
||||||
// 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction.
|
|
||||||
case 'pre':
|
|
||||||
if (this.prerelease.length === 0) {
|
|
||||||
this.prerelease = [0]
|
|
||||||
} else {
|
|
||||||
let i = this.prerelease.length
|
|
||||||
while (--i >= 0) {
|
|
||||||
if (typeof this.prerelease[i] === 'number') {
|
|
||||||
this.prerelease[i]++
|
|
||||||
i = -2
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (i === -1) {
|
|
||||||
// didn't increment anything
|
|
||||||
this.prerelease.push(0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (identifier) {
|
|
||||||
// 1.2.0-beta.1 bumps to 1.2.0-beta.2,
|
|
||||||
// 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0
|
|
||||||
if (this.prerelease[0] === identifier) {
|
|
||||||
if (isNaN(this.prerelease[1])) {
|
|
||||||
this.prerelease = [identifier, 0]
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this.prerelease = [identifier, 0]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break
|
|
||||||
|
|
||||||
default:
|
|
||||||
throw new Error(`invalid increment argument: ${release}`)
|
|
||||||
}
|
|
||||||
this.format()
|
|
||||||
this.raw = this.version
|
|
||||||
return this
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = SemVer
|
|
||||||
6
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/clean.js
generated
vendored
6
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/clean.js
generated
vendored
@ -1,6 +0,0 @@
|
|||||||
const parse = require('./parse')
|
|
||||||
const clean = (version, options) => {
|
|
||||||
const s = parse(version.trim().replace(/^[=v]+/, ''), options)
|
|
||||||
return s ? s.version : null
|
|
||||||
}
|
|
||||||
module.exports = clean
|
|
||||||
48
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/cmp.js
generated
vendored
48
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/cmp.js
generated
vendored
@ -1,48 +0,0 @@
|
|||||||
const eq = require('./eq')
|
|
||||||
const neq = require('./neq')
|
|
||||||
const gt = require('./gt')
|
|
||||||
const gte = require('./gte')
|
|
||||||
const lt = require('./lt')
|
|
||||||
const lte = require('./lte')
|
|
||||||
|
|
||||||
const cmp = (a, op, b, loose) => {
|
|
||||||
switch (op) {
|
|
||||||
case '===':
|
|
||||||
if (typeof a === 'object')
|
|
||||||
a = a.version
|
|
||||||
if (typeof b === 'object')
|
|
||||||
b = b.version
|
|
||||||
return a === b
|
|
||||||
|
|
||||||
case '!==':
|
|
||||||
if (typeof a === 'object')
|
|
||||||
a = a.version
|
|
||||||
if (typeof b === 'object')
|
|
||||||
b = b.version
|
|
||||||
return a !== b
|
|
||||||
|
|
||||||
case '':
|
|
||||||
case '=':
|
|
||||||
case '==':
|
|
||||||
return eq(a, b, loose)
|
|
||||||
|
|
||||||
case '!=':
|
|
||||||
return neq(a, b, loose)
|
|
||||||
|
|
||||||
case '>':
|
|
||||||
return gt(a, b, loose)
|
|
||||||
|
|
||||||
case '>=':
|
|
||||||
return gte(a, b, loose)
|
|
||||||
|
|
||||||
case '<':
|
|
||||||
return lt(a, b, loose)
|
|
||||||
|
|
||||||
case '<=':
|
|
||||||
return lte(a, b, loose)
|
|
||||||
|
|
||||||
default:
|
|
||||||
throw new TypeError(`Invalid operator: ${op}`)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
module.exports = cmp
|
|
||||||
51
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/coerce.js
generated
vendored
51
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/coerce.js
generated
vendored
@ -1,51 +0,0 @@
|
|||||||
const SemVer = require('../classes/semver')
|
|
||||||
const parse = require('./parse')
|
|
||||||
const {re, t} = require('../internal/re')
|
|
||||||
|
|
||||||
const coerce = (version, options) => {
|
|
||||||
if (version instanceof SemVer) {
|
|
||||||
return version
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof version === 'number') {
|
|
||||||
version = String(version)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof version !== 'string') {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
options = options || {}
|
|
||||||
|
|
||||||
let match = null
|
|
||||||
if (!options.rtl) {
|
|
||||||
match = version.match(re[t.COERCE])
|
|
||||||
} else {
|
|
||||||
// Find the right-most coercible string that does not share
|
|
||||||
// a terminus with a more left-ward coercible string.
|
|
||||||
// Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4'
|
|
||||||
//
|
|
||||||
// Walk through the string checking with a /g regexp
|
|
||||||
// Manually set the index so as to pick up overlapping matches.
|
|
||||||
// Stop when we get a match that ends at the string end, since no
|
|
||||||
// coercible string can be more right-ward without the same terminus.
|
|
||||||
let next
|
|
||||||
while ((next = re[t.COERCERTL].exec(version)) &&
|
|
||||||
(!match || match.index + match[0].length !== version.length)
|
|
||||||
) {
|
|
||||||
if (!match ||
|
|
||||||
next.index + next[0].length !== match.index + match[0].length) {
|
|
||||||
match = next
|
|
||||||
}
|
|
||||||
re[t.COERCERTL].lastIndex = next.index + next[1].length + next[2].length
|
|
||||||
}
|
|
||||||
// leave it in a clean state
|
|
||||||
re[t.COERCERTL].lastIndex = -1
|
|
||||||
}
|
|
||||||
|
|
||||||
if (match === null)
|
|
||||||
return null
|
|
||||||
|
|
||||||
return parse(`${match[2]}.${match[3] || '0'}.${match[4] || '0'}`, options)
|
|
||||||
}
|
|
||||||
module.exports = coerce
|
|
||||||
@ -1,7 +0,0 @@
|
|||||||
const SemVer = require('../classes/semver')
|
|
||||||
const compareBuild = (a, b, loose) => {
|
|
||||||
const versionA = new SemVer(a, loose)
|
|
||||||
const versionB = new SemVer(b, loose)
|
|
||||||
return versionA.compare(versionB) || versionA.compareBuild(versionB)
|
|
||||||
}
|
|
||||||
module.exports = compareBuild
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
const compare = require('./compare')
|
|
||||||
const compareLoose = (a, b) => compare(a, b, true)
|
|
||||||
module.exports = compareLoose
|
|
||||||
5
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/compare.js
generated
vendored
5
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/compare.js
generated
vendored
@ -1,5 +0,0 @@
|
|||||||
const SemVer = require('../classes/semver')
|
|
||||||
const compare = (a, b, loose) =>
|
|
||||||
new SemVer(a, loose).compare(new SemVer(b, loose))
|
|
||||||
|
|
||||||
module.exports = compare
|
|
||||||
23
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/diff.js
generated
vendored
23
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/diff.js
generated
vendored
@ -1,23 +0,0 @@
|
|||||||
const parse = require('./parse')
|
|
||||||
const eq = require('./eq')
|
|
||||||
|
|
||||||
const diff = (version1, version2) => {
|
|
||||||
if (eq(version1, version2)) {
|
|
||||||
return null
|
|
||||||
} else {
|
|
||||||
const v1 = parse(version1)
|
|
||||||
const v2 = parse(version2)
|
|
||||||
const hasPre = v1.prerelease.length || v2.prerelease.length
|
|
||||||
const prefix = hasPre ? 'pre' : ''
|
|
||||||
const defaultResult = hasPre ? 'prerelease' : ''
|
|
||||||
for (const key in v1) {
|
|
||||||
if (key === 'major' || key === 'minor' || key === 'patch') {
|
|
||||||
if (v1[key] !== v2[key]) {
|
|
||||||
return prefix + key
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return defaultResult // may be undefined
|
|
||||||
}
|
|
||||||
}
|
|
||||||
module.exports = diff
|
|
||||||
3
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/eq.js
generated
vendored
3
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/eq.js
generated
vendored
@ -1,3 +0,0 @@
|
|||||||
const compare = require('./compare')
|
|
||||||
const eq = (a, b, loose) => compare(a, b, loose) === 0
|
|
||||||
module.exports = eq
|
|
||||||
3
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/gt.js
generated
vendored
3
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/gt.js
generated
vendored
@ -1,3 +0,0 @@
|
|||||||
const compare = require('./compare')
|
|
||||||
const gt = (a, b, loose) => compare(a, b, loose) > 0
|
|
||||||
module.exports = gt
|
|
||||||
3
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/gte.js
generated
vendored
3
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/gte.js
generated
vendored
@ -1,3 +0,0 @@
|
|||||||
const compare = require('./compare')
|
|
||||||
const gte = (a, b, loose) => compare(a, b, loose) >= 0
|
|
||||||
module.exports = gte
|
|
||||||
15
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/inc.js
generated
vendored
15
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/inc.js
generated
vendored
@ -1,15 +0,0 @@
|
|||||||
const SemVer = require('../classes/semver')
|
|
||||||
|
|
||||||
const inc = (version, release, options, identifier) => {
|
|
||||||
if (typeof (options) === 'string') {
|
|
||||||
identifier = options
|
|
||||||
options = undefined
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
return new SemVer(version, options).inc(release, identifier).version
|
|
||||||
} catch (er) {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
module.exports = inc
|
|
||||||
3
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/lt.js
generated
vendored
3
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/lt.js
generated
vendored
@ -1,3 +0,0 @@
|
|||||||
const compare = require('./compare')
|
|
||||||
const lt = (a, b, loose) => compare(a, b, loose) < 0
|
|
||||||
module.exports = lt
|
|
||||||
3
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/lte.js
generated
vendored
3
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/lte.js
generated
vendored
@ -1,3 +0,0 @@
|
|||||||
const compare = require('./compare')
|
|
||||||
const lte = (a, b, loose) => compare(a, b, loose) <= 0
|
|
||||||
module.exports = lte
|
|
||||||
3
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/major.js
generated
vendored
3
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/major.js
generated
vendored
@ -1,3 +0,0 @@
|
|||||||
const SemVer = require('../classes/semver')
|
|
||||||
const major = (a, loose) => new SemVer(a, loose).major
|
|
||||||
module.exports = major
|
|
||||||
3
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/minor.js
generated
vendored
3
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/minor.js
generated
vendored
@ -1,3 +0,0 @@
|
|||||||
const SemVer = require('../classes/semver')
|
|
||||||
const minor = (a, loose) => new SemVer(a, loose).minor
|
|
||||||
module.exports = minor
|
|
||||||
3
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/neq.js
generated
vendored
3
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/neq.js
generated
vendored
@ -1,3 +0,0 @@
|
|||||||
const compare = require('./compare')
|
|
||||||
const neq = (a, b, loose) => compare(a, b, loose) !== 0
|
|
||||||
module.exports = neq
|
|
||||||
33
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/parse.js
generated
vendored
33
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/parse.js
generated
vendored
@ -1,33 +0,0 @@
|
|||||||
const {MAX_LENGTH} = require('../internal/constants')
|
|
||||||
const { re, t } = require('../internal/re')
|
|
||||||
const SemVer = require('../classes/semver')
|
|
||||||
|
|
||||||
const parseOptions = require('../internal/parse-options')
|
|
||||||
const parse = (version, options) => {
|
|
||||||
options = parseOptions(options)
|
|
||||||
|
|
||||||
if (version instanceof SemVer) {
|
|
||||||
return version
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof version !== 'string') {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
if (version.length > MAX_LENGTH) {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
const r = options.loose ? re[t.LOOSE] : re[t.FULL]
|
|
||||||
if (!r.test(version)) {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
return new SemVer(version, options)
|
|
||||||
} catch (er) {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = parse
|
|
||||||
3
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/patch.js
generated
vendored
3
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/patch.js
generated
vendored
@ -1,3 +0,0 @@
|
|||||||
const SemVer = require('../classes/semver')
|
|
||||||
const patch = (a, loose) => new SemVer(a, loose).patch
|
|
||||||
module.exports = patch
|
|
||||||
6
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/prerelease.js
generated
vendored
6
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/prerelease.js
generated
vendored
@ -1,6 +0,0 @@
|
|||||||
const parse = require('./parse')
|
|
||||||
const prerelease = (version, options) => {
|
|
||||||
const parsed = parse(version, options)
|
|
||||||
return (parsed && parsed.prerelease.length) ? parsed.prerelease : null
|
|
||||||
}
|
|
||||||
module.exports = prerelease
|
|
||||||
3
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/rcompare.js
generated
vendored
3
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/rcompare.js
generated
vendored
@ -1,3 +0,0 @@
|
|||||||
const compare = require('./compare')
|
|
||||||
const rcompare = (a, b, loose) => compare(b, a, loose)
|
|
||||||
module.exports = rcompare
|
|
||||||
3
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/rsort.js
generated
vendored
3
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/rsort.js
generated
vendored
@ -1,3 +0,0 @@
|
|||||||
const compareBuild = require('./compare-build')
|
|
||||||
const rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose))
|
|
||||||
module.exports = rsort
|
|
||||||
10
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/satisfies.js
generated
vendored
10
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/satisfies.js
generated
vendored
@ -1,10 +0,0 @@
|
|||||||
const Range = require('../classes/range')
|
|
||||||
const satisfies = (version, range, options) => {
|
|
||||||
try {
|
|
||||||
range = new Range(range, options)
|
|
||||||
} catch (er) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return range.test(version)
|
|
||||||
}
|
|
||||||
module.exports = satisfies
|
|
||||||
3
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/sort.js
generated
vendored
3
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/sort.js
generated
vendored
@ -1,3 +0,0 @@
|
|||||||
const compareBuild = require('./compare-build')
|
|
||||||
const sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose))
|
|
||||||
module.exports = sort
|
|
||||||
6
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/valid.js
generated
vendored
6
test/integration/test-fixtures/yarn-lock/node_modules/semver/functions/valid.js
generated
vendored
@ -1,6 +0,0 @@
|
|||||||
const parse = require('./parse')
|
|
||||||
const valid = (version, options) => {
|
|
||||||
const v = parse(version, options)
|
|
||||||
return v ? v.version : null
|
|
||||||
}
|
|
||||||
module.exports = valid
|
|
||||||
48
test/integration/test-fixtures/yarn-lock/node_modules/semver/index.js
generated
vendored
48
test/integration/test-fixtures/yarn-lock/node_modules/semver/index.js
generated
vendored
@ -1,48 +0,0 @@
|
|||||||
// just pre-load all the stuff that index.js lazily exports
|
|
||||||
const internalRe = require('./internal/re')
|
|
||||||
module.exports = {
|
|
||||||
re: internalRe.re,
|
|
||||||
src: internalRe.src,
|
|
||||||
tokens: internalRe.t,
|
|
||||||
SEMVER_SPEC_VERSION: require('./internal/constants').SEMVER_SPEC_VERSION,
|
|
||||||
SemVer: require('./classes/semver'),
|
|
||||||
compareIdentifiers: require('./internal/identifiers').compareIdentifiers,
|
|
||||||
rcompareIdentifiers: require('./internal/identifiers').rcompareIdentifiers,
|
|
||||||
parse: require('./functions/parse'),
|
|
||||||
valid: require('./functions/valid'),
|
|
||||||
clean: require('./functions/clean'),
|
|
||||||
inc: require('./functions/inc'),
|
|
||||||
diff: require('./functions/diff'),
|
|
||||||
major: require('./functions/major'),
|
|
||||||
minor: require('./functions/minor'),
|
|
||||||
patch: require('./functions/patch'),
|
|
||||||
prerelease: require('./functions/prerelease'),
|
|
||||||
compare: require('./functions/compare'),
|
|
||||||
rcompare: require('./functions/rcompare'),
|
|
||||||
compareLoose: require('./functions/compare-loose'),
|
|
||||||
compareBuild: require('./functions/compare-build'),
|
|
||||||
sort: require('./functions/sort'),
|
|
||||||
rsort: require('./functions/rsort'),
|
|
||||||
gt: require('./functions/gt'),
|
|
||||||
lt: require('./functions/lt'),
|
|
||||||
eq: require('./functions/eq'),
|
|
||||||
neq: require('./functions/neq'),
|
|
||||||
gte: require('./functions/gte'),
|
|
||||||
lte: require('./functions/lte'),
|
|
||||||
cmp: require('./functions/cmp'),
|
|
||||||
coerce: require('./functions/coerce'),
|
|
||||||
Comparator: require('./classes/comparator'),
|
|
||||||
Range: require('./classes/range'),
|
|
||||||
satisfies: require('./functions/satisfies'),
|
|
||||||
toComparators: require('./ranges/to-comparators'),
|
|
||||||
maxSatisfying: require('./ranges/max-satisfying'),
|
|
||||||
minSatisfying: require('./ranges/min-satisfying'),
|
|
||||||
minVersion: require('./ranges/min-version'),
|
|
||||||
validRange: require('./ranges/valid'),
|
|
||||||
outside: require('./ranges/outside'),
|
|
||||||
gtr: require('./ranges/gtr'),
|
|
||||||
ltr: require('./ranges/ltr'),
|
|
||||||
intersects: require('./ranges/intersects'),
|
|
||||||
simplifyRange: require('./ranges/simplify'),
|
|
||||||
subset: require('./ranges/subset'),
|
|
||||||
}
|
|
||||||
17
test/integration/test-fixtures/yarn-lock/node_modules/semver/internal/constants.js
generated
vendored
17
test/integration/test-fixtures/yarn-lock/node_modules/semver/internal/constants.js
generated
vendored
@ -1,17 +0,0 @@
|
|||||||
// Note: this is the semver.org version of the spec that it implements
|
|
||||||
// Not necessarily the package version of this code.
|
|
||||||
const SEMVER_SPEC_VERSION = '2.0.0'
|
|
||||||
|
|
||||||
const MAX_LENGTH = 256
|
|
||||||
const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||
|
|
||||||
/* istanbul ignore next */ 9007199254740991
|
|
||||||
|
|
||||||
// Max safe segment length for coercion.
|
|
||||||
const MAX_SAFE_COMPONENT_LENGTH = 16
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
SEMVER_SPEC_VERSION,
|
|
||||||
MAX_LENGTH,
|
|
||||||
MAX_SAFE_INTEGER,
|
|
||||||
MAX_SAFE_COMPONENT_LENGTH
|
|
||||||
}
|
|
||||||
9
test/integration/test-fixtures/yarn-lock/node_modules/semver/internal/debug.js
generated
vendored
9
test/integration/test-fixtures/yarn-lock/node_modules/semver/internal/debug.js
generated
vendored
@ -1,9 +0,0 @@
|
|||||||
const debug = (
|
|
||||||
typeof process === 'object' &&
|
|
||||||
process.env &&
|
|
||||||
process.env.NODE_DEBUG &&
|
|
||||||
/\bsemver\b/i.test(process.env.NODE_DEBUG)
|
|
||||||
) ? (...args) => console.error('SEMVER', ...args)
|
|
||||||
: () => {}
|
|
||||||
|
|
||||||
module.exports = debug
|
|
||||||
23
test/integration/test-fixtures/yarn-lock/node_modules/semver/internal/identifiers.js
generated
vendored
23
test/integration/test-fixtures/yarn-lock/node_modules/semver/internal/identifiers.js
generated
vendored
@ -1,23 +0,0 @@
|
|||||||
const numeric = /^[0-9]+$/
|
|
||||||
const compareIdentifiers = (a, b) => {
|
|
||||||
const anum = numeric.test(a)
|
|
||||||
const bnum = numeric.test(b)
|
|
||||||
|
|
||||||
if (anum && bnum) {
|
|
||||||
a = +a
|
|
||||||
b = +b
|
|
||||||
}
|
|
||||||
|
|
||||||
return a === b ? 0
|
|
||||||
: (anum && !bnum) ? -1
|
|
||||||
: (bnum && !anum) ? 1
|
|
||||||
: a < b ? -1
|
|
||||||
: 1
|
|
||||||
}
|
|
||||||
|
|
||||||
const rcompareIdentifiers = (a, b) => compareIdentifiers(b, a)
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
compareIdentifiers,
|
|
||||||
rcompareIdentifiers
|
|
||||||
}
|
|
||||||
11
test/integration/test-fixtures/yarn-lock/node_modules/semver/internal/parse-options.js
generated
vendored
11
test/integration/test-fixtures/yarn-lock/node_modules/semver/internal/parse-options.js
generated
vendored
@ -1,11 +0,0 @@
|
|||||||
// parse out just the options we care about so we always get a consistent
|
|
||||||
// obj with keys in a consistent order.
|
|
||||||
const opts = ['includePrerelease', 'loose', 'rtl']
|
|
||||||
const parseOptions = options =>
|
|
||||||
!options ? {}
|
|
||||||
: typeof options !== 'object' ? { loose: true }
|
|
||||||
: opts.filter(k => options[k]).reduce((options, k) => {
|
|
||||||
options[k] = true
|
|
||||||
return options
|
|
||||||
}, {})
|
|
||||||
module.exports = parseOptions
|
|
||||||
182
test/integration/test-fixtures/yarn-lock/node_modules/semver/internal/re.js
generated
vendored
182
test/integration/test-fixtures/yarn-lock/node_modules/semver/internal/re.js
generated
vendored
@ -1,182 +0,0 @@
|
|||||||
const { MAX_SAFE_COMPONENT_LENGTH } = require('./constants')
|
|
||||||
const debug = require('./debug')
|
|
||||||
exports = module.exports = {}
|
|
||||||
|
|
||||||
// The actual regexps go on exports.re
|
|
||||||
const re = exports.re = []
|
|
||||||
const src = exports.src = []
|
|
||||||
const t = exports.t = {}
|
|
||||||
let R = 0
|
|
||||||
|
|
||||||
const createToken = (name, value, isGlobal) => {
|
|
||||||
const index = R++
|
|
||||||
debug(index, value)
|
|
||||||
t[name] = index
|
|
||||||
src[index] = value
|
|
||||||
re[index] = new RegExp(value, isGlobal ? 'g' : undefined)
|
|
||||||
}
|
|
||||||
|
|
||||||
// The following Regular Expressions can be used for tokenizing,
|
|
||||||
// validating, and parsing SemVer version strings.
|
|
||||||
|
|
||||||
// ## Numeric Identifier
|
|
||||||
// A single `0`, or a non-zero digit followed by zero or more digits.
|
|
||||||
|
|
||||||
createToken('NUMERICIDENTIFIER', '0|[1-9]\\d*')
|
|
||||||
createToken('NUMERICIDENTIFIERLOOSE', '[0-9]+')
|
|
||||||
|
|
||||||
// ## Non-numeric Identifier
|
|
||||||
// Zero or more digits, followed by a letter or hyphen, and then zero or
|
|
||||||
// more letters, digits, or hyphens.
|
|
||||||
|
|
||||||
createToken('NONNUMERICIDENTIFIER', '\\d*[a-zA-Z-][a-zA-Z0-9-]*')
|
|
||||||
|
|
||||||
// ## Main Version
|
|
||||||
// Three dot-separated numeric identifiers.
|
|
||||||
|
|
||||||
createToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\.` +
|
|
||||||
`(${src[t.NUMERICIDENTIFIER]})\\.` +
|
|
||||||
`(${src[t.NUMERICIDENTIFIER]})`)
|
|
||||||
|
|
||||||
createToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` +
|
|
||||||
`(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` +
|
|
||||||
`(${src[t.NUMERICIDENTIFIERLOOSE]})`)
|
|
||||||
|
|
||||||
// ## Pre-release Version Identifier
|
|
||||||
// A numeric identifier, or a non-numeric identifier.
|
|
||||||
|
|
||||||
createToken('PRERELEASEIDENTIFIER', `(?:${src[t.NUMERICIDENTIFIER]
|
|
||||||
}|${src[t.NONNUMERICIDENTIFIER]})`)
|
|
||||||
|
|
||||||
createToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NUMERICIDENTIFIERLOOSE]
|
|
||||||
}|${src[t.NONNUMERICIDENTIFIER]})`)
|
|
||||||
|
|
||||||
// ## Pre-release Version
|
|
||||||
// Hyphen, followed by one or more dot-separated pre-release version
|
|
||||||
// identifiers.
|
|
||||||
|
|
||||||
createToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER]
|
|
||||||
}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`)
|
|
||||||
|
|
||||||
createToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]
|
|
||||||
}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`)
|
|
||||||
|
|
||||||
// ## Build Metadata Identifier
|
|
||||||
// Any combination of digits, letters, or hyphens.
|
|
||||||
|
|
||||||
createToken('BUILDIDENTIFIER', '[0-9A-Za-z-]+')
|
|
||||||
|
|
||||||
// ## Build Metadata
|
|
||||||
// Plus sign, followed by one or more period-separated build metadata
|
|
||||||
// identifiers.
|
|
||||||
|
|
||||||
createToken('BUILD', `(?:\\+(${src[t.BUILDIDENTIFIER]
|
|
||||||
}(?:\\.${src[t.BUILDIDENTIFIER]})*))`)
|
|
||||||
|
|
||||||
// ## Full Version String
|
|
||||||
// A main version, followed optionally by a pre-release version and
|
|
||||||
// build metadata.
|
|
||||||
|
|
||||||
// Note that the only major, minor, patch, and pre-release sections of
|
|
||||||
// the version string are capturing groups. The build metadata is not a
|
|
||||||
// capturing group, because it should not ever be used in version
|
|
||||||
// comparison.
|
|
||||||
|
|
||||||
createToken('FULLPLAIN', `v?${src[t.MAINVERSION]
|
|
||||||
}${src[t.PRERELEASE]}?${
|
|
||||||
src[t.BUILD]}?`)
|
|
||||||
|
|
||||||
createToken('FULL', `^${src[t.FULLPLAIN]}$`)
|
|
||||||
|
|
||||||
// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.
|
|
||||||
// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty
|
|
||||||
// common in the npm registry.
|
|
||||||
createToken('LOOSEPLAIN', `[v=\\s]*${src[t.MAINVERSIONLOOSE]
|
|
||||||
}${src[t.PRERELEASELOOSE]}?${
|
|
||||||
src[t.BUILD]}?`)
|
|
||||||
|
|
||||||
createToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`)
|
|
||||||
|
|
||||||
createToken('GTLT', '((?:<|>)?=?)')
|
|
||||||
|
|
||||||
// Something like "2.*" or "1.2.x".
|
|
||||||
// Note that "x.x" is a valid xRange identifer, meaning "any version"
|
|
||||||
// Only the first item is strictly required.
|
|
||||||
createToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`)
|
|
||||||
createToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`)
|
|
||||||
|
|
||||||
createToken('XRANGEPLAIN', `[v=\\s]*(${src[t.XRANGEIDENTIFIER]})` +
|
|
||||||
`(?:\\.(${src[t.XRANGEIDENTIFIER]})` +
|
|
||||||
`(?:\\.(${src[t.XRANGEIDENTIFIER]})` +
|
|
||||||
`(?:${src[t.PRERELEASE]})?${
|
|
||||||
src[t.BUILD]}?` +
|
|
||||||
`)?)?`)
|
|
||||||
|
|
||||||
createToken('XRANGEPLAINLOOSE', `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` +
|
|
||||||
`(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +
|
|
||||||
`(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +
|
|
||||||
`(?:${src[t.PRERELEASELOOSE]})?${
|
|
||||||
src[t.BUILD]}?` +
|
|
||||||
`)?)?`)
|
|
||||||
|
|
||||||
createToken('XRANGE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`)
|
|
||||||
createToken('XRANGELOOSE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`)
|
|
||||||
|
|
||||||
// Coercion.
|
|
||||||
// Extract anything that could conceivably be a part of a valid semver
|
|
||||||
createToken('COERCE', `${'(^|[^\\d])' +
|
|
||||||
'(\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` +
|
|
||||||
`(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +
|
|
||||||
`(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +
|
|
||||||
`(?:$|[^\\d])`)
|
|
||||||
createToken('COERCERTL', src[t.COERCE], true)
|
|
||||||
|
|
||||||
// Tilde ranges.
|
|
||||||
// Meaning is "reasonably at or greater than"
|
|
||||||
createToken('LONETILDE', '(?:~>?)')
|
|
||||||
|
|
||||||
createToken('TILDETRIM', `(\\s*)${src[t.LONETILDE]}\\s+`, true)
|
|
||||||
exports.tildeTrimReplace = '$1~'
|
|
||||||
|
|
||||||
createToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`)
|
|
||||||
createToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`)
|
|
||||||
|
|
||||||
// Caret ranges.
|
|
||||||
// Meaning is "at least and backwards compatible with"
|
|
||||||
createToken('LONECARET', '(?:\\^)')
|
|
||||||
|
|
||||||
createToken('CARETTRIM', `(\\s*)${src[t.LONECARET]}\\s+`, true)
|
|
||||||
exports.caretTrimReplace = '$1^'
|
|
||||||
|
|
||||||
createToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`)
|
|
||||||
createToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`)
|
|
||||||
|
|
||||||
// A simple gt/lt/eq thing, or just "" to indicate "any version"
|
|
||||||
createToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`)
|
|
||||||
createToken('COMPARATOR', `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`)
|
|
||||||
|
|
||||||
// An expression to strip any whitespace between the gtlt and the thing
|
|
||||||
// it modifies, so that `> 1.2.3` ==> `>1.2.3`
|
|
||||||
createToken('COMPARATORTRIM', `(\\s*)${src[t.GTLT]
|
|
||||||
}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true)
|
|
||||||
exports.comparatorTrimReplace = '$1$2$3'
|
|
||||||
|
|
||||||
// Something like `1.2.3 - 1.2.4`
|
|
||||||
// Note that these all use the loose form, because they'll be
|
|
||||||
// checked against either the strict or loose comparator form
|
|
||||||
// later.
|
|
||||||
createToken('HYPHENRANGE', `^\\s*(${src[t.XRANGEPLAIN]})` +
|
|
||||||
`\\s+-\\s+` +
|
|
||||||
`(${src[t.XRANGEPLAIN]})` +
|
|
||||||
`\\s*$`)
|
|
||||||
|
|
||||||
createToken('HYPHENRANGELOOSE', `^\\s*(${src[t.XRANGEPLAINLOOSE]})` +
|
|
||||||
`\\s+-\\s+` +
|
|
||||||
`(${src[t.XRANGEPLAINLOOSE]})` +
|
|
||||||
`\\s*$`)
|
|
||||||
|
|
||||||
// Star ranges basically just allow anything at all.
|
|
||||||
createToken('STAR', '(<|>)?=?\\s*\\*')
|
|
||||||
// >=0.0.0 is like a star
|
|
||||||
createToken('GTE0', '^\\s*>=\\s*0\.0\.0\\s*$')
|
|
||||||
createToken('GTE0PRE', '^\\s*>=\\s*0\.0\.0-0\\s*$')
|
|
||||||
41
test/integration/test-fixtures/yarn-lock/node_modules/semver/package.json
generated
vendored
41
test/integration/test-fixtures/yarn-lock/node_modules/semver/package.json
generated
vendored
@ -1,41 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "semver",
|
|
||||||
"version": "7.3.5",
|
|
||||||
"description": "The semantic version parser used by npm.",
|
|
||||||
"main": "index.js",
|
|
||||||
"scripts": {
|
|
||||||
"test": "tap",
|
|
||||||
"snap": "tap",
|
|
||||||
"preversion": "npm test",
|
|
||||||
"postversion": "npm publish",
|
|
||||||
"postpublish": "git push origin --follow-tags"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"tap": "^14.10.7"
|
|
||||||
},
|
|
||||||
"license": "ISC",
|
|
||||||
"repository": "https://github.com/npm/node-semver",
|
|
||||||
"bin": {
|
|
||||||
"semver": "bin/semver.js"
|
|
||||||
},
|
|
||||||
"files": [
|
|
||||||
"bin/**/*.js",
|
|
||||||
"range.bnf",
|
|
||||||
"classes/**/*.js",
|
|
||||||
"functions/**/*.js",
|
|
||||||
"internal/**/*.js",
|
|
||||||
"ranges/**/*.js",
|
|
||||||
"index.js",
|
|
||||||
"preload.js"
|
|
||||||
],
|
|
||||||
"tap": {
|
|
||||||
"check-coverage": true,
|
|
||||||
"coverage-map": "map.js"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=10"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"lru-cache": "^6.0.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
2
test/integration/test-fixtures/yarn-lock/node_modules/semver/preload.js
generated
vendored
2
test/integration/test-fixtures/yarn-lock/node_modules/semver/preload.js
generated
vendored
@ -1,2 +0,0 @@
|
|||||||
// XXX remove in v8 or beyond
|
|
||||||
module.exports = require('./index.js')
|
|
||||||
16
test/integration/test-fixtures/yarn-lock/node_modules/semver/range.bnf
generated
vendored
16
test/integration/test-fixtures/yarn-lock/node_modules/semver/range.bnf
generated
vendored
@ -1,16 +0,0 @@
|
|||||||
range-set ::= range ( logical-or range ) *
|
|
||||||
logical-or ::= ( ' ' ) * '||' ( ' ' ) *
|
|
||||||
range ::= hyphen | simple ( ' ' simple ) * | ''
|
|
||||||
hyphen ::= partial ' - ' partial
|
|
||||||
simple ::= primitive | partial | tilde | caret
|
|
||||||
primitive ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial
|
|
||||||
partial ::= xr ( '.' xr ( '.' xr qualifier ? )? )?
|
|
||||||
xr ::= 'x' | 'X' | '*' | nr
|
|
||||||
nr ::= '0' | [1-9] ( [0-9] ) *
|
|
||||||
tilde ::= '~' partial
|
|
||||||
caret ::= '^' partial
|
|
||||||
qualifier ::= ( '-' pre )? ( '+' build )?
|
|
||||||
pre ::= parts
|
|
||||||
build ::= parts
|
|
||||||
parts ::= part ( '.' part ) *
|
|
||||||
part ::= nr | [-0-9A-Za-z]+
|
|
||||||
4
test/integration/test-fixtures/yarn-lock/node_modules/semver/ranges/gtr.js
generated
vendored
4
test/integration/test-fixtures/yarn-lock/node_modules/semver/ranges/gtr.js
generated
vendored
@ -1,4 +0,0 @@
|
|||||||
// Determine if version is greater than all the versions possible in the range.
|
|
||||||
const outside = require('./outside')
|
|
||||||
const gtr = (version, range, options) => outside(version, range, '>', options)
|
|
||||||
module.exports = gtr
|
|
||||||
7
test/integration/test-fixtures/yarn-lock/node_modules/semver/ranges/intersects.js
generated
vendored
7
test/integration/test-fixtures/yarn-lock/node_modules/semver/ranges/intersects.js
generated
vendored
@ -1,7 +0,0 @@
|
|||||||
const Range = require('../classes/range')
|
|
||||||
const intersects = (r1, r2, options) => {
|
|
||||||
r1 = new Range(r1, options)
|
|
||||||
r2 = new Range(r2, options)
|
|
||||||
return r1.intersects(r2)
|
|
||||||
}
|
|
||||||
module.exports = intersects
|
|
||||||
4
test/integration/test-fixtures/yarn-lock/node_modules/semver/ranges/ltr.js
generated
vendored
4
test/integration/test-fixtures/yarn-lock/node_modules/semver/ranges/ltr.js
generated
vendored
@ -1,4 +0,0 @@
|
|||||||
const outside = require('./outside')
|
|
||||||
// Determine if version is less than all the versions possible in the range
|
|
||||||
const ltr = (version, range, options) => outside(version, range, '<', options)
|
|
||||||
module.exports = ltr
|
|
||||||
25
test/integration/test-fixtures/yarn-lock/node_modules/semver/ranges/max-satisfying.js
generated
vendored
25
test/integration/test-fixtures/yarn-lock/node_modules/semver/ranges/max-satisfying.js
generated
vendored
@ -1,25 +0,0 @@
|
|||||||
const SemVer = require('../classes/semver')
|
|
||||||
const Range = require('../classes/range')
|
|
||||||
|
|
||||||
const maxSatisfying = (versions, range, options) => {
|
|
||||||
let max = null
|
|
||||||
let maxSV = null
|
|
||||||
let rangeObj = null
|
|
||||||
try {
|
|
||||||
rangeObj = new Range(range, options)
|
|
||||||
} catch (er) {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
versions.forEach((v) => {
|
|
||||||
if (rangeObj.test(v)) {
|
|
||||||
// satisfies(v, range, options)
|
|
||||||
if (!max || maxSV.compare(v) === -1) {
|
|
||||||
// compare(max, v, true)
|
|
||||||
max = v
|
|
||||||
maxSV = new SemVer(max, options)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
return max
|
|
||||||
}
|
|
||||||
module.exports = maxSatisfying
|
|
||||||
24
test/integration/test-fixtures/yarn-lock/node_modules/semver/ranges/min-satisfying.js
generated
vendored
24
test/integration/test-fixtures/yarn-lock/node_modules/semver/ranges/min-satisfying.js
generated
vendored
@ -1,24 +0,0 @@
|
|||||||
const SemVer = require('../classes/semver')
|
|
||||||
const Range = require('../classes/range')
|
|
||||||
const minSatisfying = (versions, range, options) => {
|
|
||||||
let min = null
|
|
||||||
let minSV = null
|
|
||||||
let rangeObj = null
|
|
||||||
try {
|
|
||||||
rangeObj = new Range(range, options)
|
|
||||||
} catch (er) {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
versions.forEach((v) => {
|
|
||||||
if (rangeObj.test(v)) {
|
|
||||||
// satisfies(v, range, options)
|
|
||||||
if (!min || minSV.compare(v) === 1) {
|
|
||||||
// compare(min, v, true)
|
|
||||||
min = v
|
|
||||||
minSV = new SemVer(min, options)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
return min
|
|
||||||
}
|
|
||||||
module.exports = minSatisfying
|
|
||||||
60
test/integration/test-fixtures/yarn-lock/node_modules/semver/ranges/min-version.js
generated
vendored
60
test/integration/test-fixtures/yarn-lock/node_modules/semver/ranges/min-version.js
generated
vendored
@ -1,60 +0,0 @@
|
|||||||
const SemVer = require('../classes/semver')
|
|
||||||
const Range = require('../classes/range')
|
|
||||||
const gt = require('../functions/gt')
|
|
||||||
|
|
||||||
const minVersion = (range, loose) => {
|
|
||||||
range = new Range(range, loose)
|
|
||||||
|
|
||||||
let minver = new SemVer('0.0.0')
|
|
||||||
if (range.test(minver)) {
|
|
||||||
return minver
|
|
||||||
}
|
|
||||||
|
|
||||||
minver = new SemVer('0.0.0-0')
|
|
||||||
if (range.test(minver)) {
|
|
||||||
return minver
|
|
||||||
}
|
|
||||||
|
|
||||||
minver = null
|
|
||||||
for (let i = 0; i < range.set.length; ++i) {
|
|
||||||
const comparators = range.set[i]
|
|
||||||
|
|
||||||
let setMin = null
|
|
||||||
comparators.forEach((comparator) => {
|
|
||||||
// Clone to avoid manipulating the comparator's semver object.
|
|
||||||
const compver = new SemVer(comparator.semver.version)
|
|
||||||
switch (comparator.operator) {
|
|
||||||
case '>':
|
|
||||||
if (compver.prerelease.length === 0) {
|
|
||||||
compver.patch++
|
|
||||||
} else {
|
|
||||||
compver.prerelease.push(0)
|
|
||||||
}
|
|
||||||
compver.raw = compver.format()
|
|
||||||
/* fallthrough */
|
|
||||||
case '':
|
|
||||||
case '>=':
|
|
||||||
if (!setMin || gt(compver, setMin)) {
|
|
||||||
setMin = compver
|
|
||||||
}
|
|
||||||
break
|
|
||||||
case '<':
|
|
||||||
case '<=':
|
|
||||||
/* Ignore maximum versions */
|
|
||||||
break
|
|
||||||
/* istanbul ignore next */
|
|
||||||
default:
|
|
||||||
throw new Error(`Unexpected operation: ${comparator.operator}`)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
if (setMin && (!minver || gt(minver, setMin)))
|
|
||||||
minver = setMin
|
|
||||||
}
|
|
||||||
|
|
||||||
if (minver && range.test(minver)) {
|
|
||||||
return minver
|
|
||||||
}
|
|
||||||
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
module.exports = minVersion
|
|
||||||
80
test/integration/test-fixtures/yarn-lock/node_modules/semver/ranges/outside.js
generated
vendored
80
test/integration/test-fixtures/yarn-lock/node_modules/semver/ranges/outside.js
generated
vendored
@ -1,80 +0,0 @@
|
|||||||
const SemVer = require('../classes/semver')
|
|
||||||
const Comparator = require('../classes/comparator')
|
|
||||||
const {ANY} = Comparator
|
|
||||||
const Range = require('../classes/range')
|
|
||||||
const satisfies = require('../functions/satisfies')
|
|
||||||
const gt = require('../functions/gt')
|
|
||||||
const lt = require('../functions/lt')
|
|
||||||
const lte = require('../functions/lte')
|
|
||||||
const gte = require('../functions/gte')
|
|
||||||
|
|
||||||
const outside = (version, range, hilo, options) => {
|
|
||||||
version = new SemVer(version, options)
|
|
||||||
range = new Range(range, options)
|
|
||||||
|
|
||||||
let gtfn, ltefn, ltfn, comp, ecomp
|
|
||||||
switch (hilo) {
|
|
||||||
case '>':
|
|
||||||
gtfn = gt
|
|
||||||
ltefn = lte
|
|
||||||
ltfn = lt
|
|
||||||
comp = '>'
|
|
||||||
ecomp = '>='
|
|
||||||
break
|
|
||||||
case '<':
|
|
||||||
gtfn = lt
|
|
||||||
ltefn = gte
|
|
||||||
ltfn = gt
|
|
||||||
comp = '<'
|
|
||||||
ecomp = '<='
|
|
||||||
break
|
|
||||||
default:
|
|
||||||
throw new TypeError('Must provide a hilo val of "<" or ">"')
|
|
||||||
}
|
|
||||||
|
|
||||||
// If it satisfies the range it is not outside
|
|
||||||
if (satisfies(version, range, options)) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// From now on, variable terms are as if we're in "gtr" mode.
|
|
||||||
// but note that everything is flipped for the "ltr" function.
|
|
||||||
|
|
||||||
for (let i = 0; i < range.set.length; ++i) {
|
|
||||||
const comparators = range.set[i]
|
|
||||||
|
|
||||||
let high = null
|
|
||||||
let low = null
|
|
||||||
|
|
||||||
comparators.forEach((comparator) => {
|
|
||||||
if (comparator.semver === ANY) {
|
|
||||||
comparator = new Comparator('>=0.0.0')
|
|
||||||
}
|
|
||||||
high = high || comparator
|
|
||||||
low = low || comparator
|
|
||||||
if (gtfn(comparator.semver, high.semver, options)) {
|
|
||||||
high = comparator
|
|
||||||
} else if (ltfn(comparator.semver, low.semver, options)) {
|
|
||||||
low = comparator
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
// If the edge version comparator has a operator then our version
|
|
||||||
// isn't outside it
|
|
||||||
if (high.operator === comp || high.operator === ecomp) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the lowest version comparator has an operator and our version
|
|
||||||
// is less than it then it isn't higher than the range
|
|
||||||
if ((!low.operator || low.operator === comp) &&
|
|
||||||
ltefn(version, low.semver)) {
|
|
||||||
return false
|
|
||||||
} else if (low.operator === ecomp && ltfn(version, low.semver)) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = outside
|
|
||||||
44
test/integration/test-fixtures/yarn-lock/node_modules/semver/ranges/simplify.js
generated
vendored
44
test/integration/test-fixtures/yarn-lock/node_modules/semver/ranges/simplify.js
generated
vendored
@ -1,44 +0,0 @@
|
|||||||
// given a set of versions and a range, create a "simplified" range
|
|
||||||
// that includes the same versions that the original range does
|
|
||||||
// If the original range is shorter than the simplified one, return that.
|
|
||||||
const satisfies = require('../functions/satisfies.js')
|
|
||||||
const compare = require('../functions/compare.js')
|
|
||||||
module.exports = (versions, range, options) => {
|
|
||||||
const set = []
|
|
||||||
let min = null
|
|
||||||
let prev = null
|
|
||||||
const v = versions.sort((a, b) => compare(a, b, options))
|
|
||||||
for (const version of v) {
|
|
||||||
const included = satisfies(version, range, options)
|
|
||||||
if (included) {
|
|
||||||
prev = version
|
|
||||||
if (!min)
|
|
||||||
min = version
|
|
||||||
} else {
|
|
||||||
if (prev) {
|
|
||||||
set.push([min, prev])
|
|
||||||
}
|
|
||||||
prev = null
|
|
||||||
min = null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (min)
|
|
||||||
set.push([min, null])
|
|
||||||
|
|
||||||
const ranges = []
|
|
||||||
for (const [min, max] of set) {
|
|
||||||
if (min === max)
|
|
||||||
ranges.push(min)
|
|
||||||
else if (!max && min === v[0])
|
|
||||||
ranges.push('*')
|
|
||||||
else if (!max)
|
|
||||||
ranges.push(`>=${min}`)
|
|
||||||
else if (min === v[0])
|
|
||||||
ranges.push(`<=${max}`)
|
|
||||||
else
|
|
||||||
ranges.push(`${min} - ${max}`)
|
|
||||||
}
|
|
||||||
const simplified = ranges.join(' || ')
|
|
||||||
const original = typeof range.raw === 'string' ? range.raw : String(range)
|
|
||||||
return simplified.length < original.length ? simplified : range
|
|
||||||
}
|
|
||||||
222
test/integration/test-fixtures/yarn-lock/node_modules/semver/ranges/subset.js
generated
vendored
222
test/integration/test-fixtures/yarn-lock/node_modules/semver/ranges/subset.js
generated
vendored
@ -1,222 +0,0 @@
|
|||||||
const Range = require('../classes/range.js')
|
|
||||||
const Comparator = require('../classes/comparator.js')
|
|
||||||
const { ANY } = Comparator
|
|
||||||
const satisfies = require('../functions/satisfies.js')
|
|
||||||
const compare = require('../functions/compare.js')
|
|
||||||
|
|
||||||
// Complex range `r1 || r2 || ...` is a subset of `R1 || R2 || ...` iff:
|
|
||||||
// - Every simple range `r1, r2, ...` is a null set, OR
|
|
||||||
// - Every simple range `r1, r2, ...` which is not a null set is a subset of
|
|
||||||
// some `R1, R2, ...`
|
|
||||||
//
|
|
||||||
// Simple range `c1 c2 ...` is a subset of simple range `C1 C2 ...` iff:
|
|
||||||
// - If c is only the ANY comparator
|
|
||||||
// - If C is only the ANY comparator, return true
|
|
||||||
// - Else if in prerelease mode, return false
|
|
||||||
// - else replace c with `[>=0.0.0]`
|
|
||||||
// - If C is only the ANY comparator
|
|
||||||
// - if in prerelease mode, return true
|
|
||||||
// - else replace C with `[>=0.0.0]`
|
|
||||||
// - Let EQ be the set of = comparators in c
|
|
||||||
// - If EQ is more than one, return true (null set)
|
|
||||||
// - Let GT be the highest > or >= comparator in c
|
|
||||||
// - Let LT be the lowest < or <= comparator in c
|
|
||||||
// - If GT and LT, and GT.semver > LT.semver, return true (null set)
|
|
||||||
// - If any C is a = range, and GT or LT are set, return false
|
|
||||||
// - If EQ
|
|
||||||
// - If GT, and EQ does not satisfy GT, return true (null set)
|
|
||||||
// - If LT, and EQ does not satisfy LT, return true (null set)
|
|
||||||
// - If EQ satisfies every C, return true
|
|
||||||
// - Else return false
|
|
||||||
// - If GT
|
|
||||||
// - If GT.semver is lower than any > or >= comp in C, return false
|
|
||||||
// - If GT is >=, and GT.semver does not satisfy every C, return false
|
|
||||||
// - If GT.semver has a prerelease, and not in prerelease mode
|
|
||||||
// - If no C has a prerelease and the GT.semver tuple, return false
|
|
||||||
// - If LT
|
|
||||||
// - If LT.semver is greater than any < or <= comp in C, return false
|
|
||||||
// - If LT is <=, and LT.semver does not satisfy every C, return false
|
|
||||||
// - If GT.semver has a prerelease, and not in prerelease mode
|
|
||||||
// - If no C has a prerelease and the LT.semver tuple, return false
|
|
||||||
// - Else return true
|
|
||||||
|
|
||||||
const subset = (sub, dom, options = {}) => {
|
|
||||||
if (sub === dom)
|
|
||||||
return true
|
|
||||||
|
|
||||||
sub = new Range(sub, options)
|
|
||||||
dom = new Range(dom, options)
|
|
||||||
let sawNonNull = false
|
|
||||||
|
|
||||||
OUTER: for (const simpleSub of sub.set) {
|
|
||||||
for (const simpleDom of dom.set) {
|
|
||||||
const isSub = simpleSubset(simpleSub, simpleDom, options)
|
|
||||||
sawNonNull = sawNonNull || isSub !== null
|
|
||||||
if (isSub)
|
|
||||||
continue OUTER
|
|
||||||
}
|
|
||||||
// the null set is a subset of everything, but null simple ranges in
|
|
||||||
// a complex range should be ignored. so if we saw a non-null range,
|
|
||||||
// then we know this isn't a subset, but if EVERY simple range was null,
|
|
||||||
// then it is a subset.
|
|
||||||
if (sawNonNull)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
const simpleSubset = (sub, dom, options) => {
|
|
||||||
if (sub === dom)
|
|
||||||
return true
|
|
||||||
|
|
||||||
if (sub.length === 1 && sub[0].semver === ANY) {
|
|
||||||
if (dom.length === 1 && dom[0].semver === ANY)
|
|
||||||
return true
|
|
||||||
else if (options.includePrerelease)
|
|
||||||
sub = [ new Comparator('>=0.0.0-0') ]
|
|
||||||
else
|
|
||||||
sub = [ new Comparator('>=0.0.0') ]
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dom.length === 1 && dom[0].semver === ANY) {
|
|
||||||
if (options.includePrerelease)
|
|
||||||
return true
|
|
||||||
else
|
|
||||||
dom = [ new Comparator('>=0.0.0') ]
|
|
||||||
}
|
|
||||||
|
|
||||||
const eqSet = new Set()
|
|
||||||
let gt, lt
|
|
||||||
for (const c of sub) {
|
|
||||||
if (c.operator === '>' || c.operator === '>=')
|
|
||||||
gt = higherGT(gt, c, options)
|
|
||||||
else if (c.operator === '<' || c.operator === '<=')
|
|
||||||
lt = lowerLT(lt, c, options)
|
|
||||||
else
|
|
||||||
eqSet.add(c.semver)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (eqSet.size > 1)
|
|
||||||
return null
|
|
||||||
|
|
||||||
let gtltComp
|
|
||||||
if (gt && lt) {
|
|
||||||
gtltComp = compare(gt.semver, lt.semver, options)
|
|
||||||
if (gtltComp > 0)
|
|
||||||
return null
|
|
||||||
else if (gtltComp === 0 && (gt.operator !== '>=' || lt.operator !== '<='))
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
// will iterate one or zero times
|
|
||||||
for (const eq of eqSet) {
|
|
||||||
if (gt && !satisfies(eq, String(gt), options))
|
|
||||||
return null
|
|
||||||
|
|
||||||
if (lt && !satisfies(eq, String(lt), options))
|
|
||||||
return null
|
|
||||||
|
|
||||||
for (const c of dom) {
|
|
||||||
if (!satisfies(eq, String(c), options))
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
let higher, lower
|
|
||||||
let hasDomLT, hasDomGT
|
|
||||||
// if the subset has a prerelease, we need a comparator in the superset
|
|
||||||
// with the same tuple and a prerelease, or it's not a subset
|
|
||||||
let needDomLTPre = lt &&
|
|
||||||
!options.includePrerelease &&
|
|
||||||
lt.semver.prerelease.length ? lt.semver : false
|
|
||||||
let needDomGTPre = gt &&
|
|
||||||
!options.includePrerelease &&
|
|
||||||
gt.semver.prerelease.length ? gt.semver : false
|
|
||||||
// exception: <1.2.3-0 is the same as <1.2.3
|
|
||||||
if (needDomLTPre && needDomLTPre.prerelease.length === 1 &&
|
|
||||||
lt.operator === '<' && needDomLTPre.prerelease[0] === 0) {
|
|
||||||
needDomLTPre = false
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const c of dom) {
|
|
||||||
hasDomGT = hasDomGT || c.operator === '>' || c.operator === '>='
|
|
||||||
hasDomLT = hasDomLT || c.operator === '<' || c.operator === '<='
|
|
||||||
if (gt) {
|
|
||||||
if (needDomGTPre) {
|
|
||||||
if (c.semver.prerelease && c.semver.prerelease.length &&
|
|
||||||
c.semver.major === needDomGTPre.major &&
|
|
||||||
c.semver.minor === needDomGTPre.minor &&
|
|
||||||
c.semver.patch === needDomGTPre.patch) {
|
|
||||||
needDomGTPre = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (c.operator === '>' || c.operator === '>=') {
|
|
||||||
higher = higherGT(gt, c, options)
|
|
||||||
if (higher === c && higher !== gt)
|
|
||||||
return false
|
|
||||||
} else if (gt.operator === '>=' && !satisfies(gt.semver, String(c), options))
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if (lt) {
|
|
||||||
if (needDomLTPre) {
|
|
||||||
if (c.semver.prerelease && c.semver.prerelease.length &&
|
|
||||||
c.semver.major === needDomLTPre.major &&
|
|
||||||
c.semver.minor === needDomLTPre.minor &&
|
|
||||||
c.semver.patch === needDomLTPre.patch) {
|
|
||||||
needDomLTPre = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (c.operator === '<' || c.operator === '<=') {
|
|
||||||
lower = lowerLT(lt, c, options)
|
|
||||||
if (lower === c && lower !== lt)
|
|
||||||
return false
|
|
||||||
} else if (lt.operator === '<=' && !satisfies(lt.semver, String(c), options))
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if (!c.operator && (lt || gt) && gtltComp !== 0)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// if there was a < or >, and nothing in the dom, then must be false
|
|
||||||
// UNLESS it was limited by another range in the other direction.
|
|
||||||
// Eg, >1.0.0 <1.0.1 is still a subset of <2.0.0
|
|
||||||
if (gt && hasDomLT && !lt && gtltComp !== 0)
|
|
||||||
return false
|
|
||||||
|
|
||||||
if (lt && hasDomGT && !gt && gtltComp !== 0)
|
|
||||||
return false
|
|
||||||
|
|
||||||
// we needed a prerelease range in a specific tuple, but didn't get one
|
|
||||||
// then this isn't a subset. eg >=1.2.3-pre is not a subset of >=1.0.0,
|
|
||||||
// because it includes prereleases in the 1.2.3 tuple
|
|
||||||
if (needDomGTPre || needDomLTPre)
|
|
||||||
return false
|
|
||||||
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// >=1.2.3 is lower than >1.2.3
|
|
||||||
const higherGT = (a, b, options) => {
|
|
||||||
if (!a)
|
|
||||||
return b
|
|
||||||
const comp = compare(a.semver, b.semver, options)
|
|
||||||
return comp > 0 ? a
|
|
||||||
: comp < 0 ? b
|
|
||||||
: b.operator === '>' && a.operator === '>=' ? b
|
|
||||||
: a
|
|
||||||
}
|
|
||||||
|
|
||||||
// <=1.2.3 is higher than <1.2.3
|
|
||||||
const lowerLT = (a, b, options) => {
|
|
||||||
if (!a)
|
|
||||||
return b
|
|
||||||
const comp = compare(a.semver, b.semver, options)
|
|
||||||
return comp < 0 ? a
|
|
||||||
: comp > 0 ? b
|
|
||||||
: b.operator === '<' && a.operator === '<=' ? b
|
|
||||||
: a
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = subset
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
const Range = require('../classes/range')
|
|
||||||
|
|
||||||
// Mostly just for testing and legacy API reasons
|
|
||||||
const toComparators = (range, options) =>
|
|
||||||
new Range(range, options).set
|
|
||||||
.map(comp => comp.map(c => c.value).join(' ').trim().split(' '))
|
|
||||||
|
|
||||||
module.exports = toComparators
|
|
||||||
11
test/integration/test-fixtures/yarn-lock/node_modules/semver/ranges/valid.js
generated
vendored
11
test/integration/test-fixtures/yarn-lock/node_modules/semver/ranges/valid.js
generated
vendored
@ -1,11 +0,0 @@
|
|||||||
const Range = require('../classes/range')
|
|
||||||
const validRange = (range, options) => {
|
|
||||||
try {
|
|
||||||
// Return '*' instead of '' so that truthiness works.
|
|
||||||
// This will throw if it's invalid anyway
|
|
||||||
return new Range(range, options).range || '*'
|
|
||||||
} catch (er) {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
module.exports = validRange
|
|
||||||
22
test/integration/test-fixtures/yarn-lock/node_modules/should-type/LICENSE
generated
vendored
Normal file
22
test/integration/test-fixtures/yarn-lock/node_modules/should-type/LICENSE
generated
vendored
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2014
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
38
test/integration/test-fixtures/yarn-lock/node_modules/should-type/package.json
generated
vendored
Normal file
38
test/integration/test-fixtures/yarn-lock/node_modules/should-type/package.json
generated
vendored
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
{
|
||||||
|
"name": "should-type",
|
||||||
|
"version": "1.3.0",
|
||||||
|
"description": "Simple module to get instance type. Like a bit more advanced version of typeof",
|
||||||
|
"main": "cjs/should-type.js",
|
||||||
|
"jsnext:main": "es6/should-type.js",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/shouldjs/type.git"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"should",
|
||||||
|
"type"
|
||||||
|
],
|
||||||
|
"files": [
|
||||||
|
"cjs/*",
|
||||||
|
"es6/*",
|
||||||
|
"README.md",
|
||||||
|
"LICENSE"
|
||||||
|
],
|
||||||
|
"scripts": {
|
||||||
|
"cjs": "rollup --format=cjs --output=cjs/should-type.js index.js",
|
||||||
|
"es6": "rollup --format=es --output=es6/should-type.js index.js",
|
||||||
|
"build": "npm run cjs && npm run es6",
|
||||||
|
"prepublish": "npm run build"
|
||||||
|
},
|
||||||
|
"author": "Denis Bardadym <bardadymchik@gmail.com>",
|
||||||
|
"license": "MIT",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/shouldjs/type/issues"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/shouldjs/type",
|
||||||
|
"devDependencies": {
|
||||||
|
"eslint": "^3.0.0",
|
||||||
|
"eslint-config-shouldjs": "^1.0.2",
|
||||||
|
"rollup": "^0.34.3"
|
||||||
|
}
|
||||||
|
}
|
||||||
15
test/integration/test-fixtures/yarn-lock/node_modules/yallist/LICENSE
generated
vendored
15
test/integration/test-fixtures/yarn-lock/node_modules/yallist/LICENSE
generated
vendored
@ -1,15 +0,0 @@
|
|||||||
The ISC License
|
|
||||||
|
|
||||||
Copyright (c) Isaac Z. Schlueter and Contributors
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
|
||||||
copyright notice and this permission notice appear in all copies.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
|
|
||||||
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
204
test/integration/test-fixtures/yarn-lock/node_modules/yallist/README.md
generated
vendored
204
test/integration/test-fixtures/yarn-lock/node_modules/yallist/README.md
generated
vendored
@ -1,204 +0,0 @@
|
|||||||
# yallist
|
|
||||||
|
|
||||||
Yet Another Linked List
|
|
||||||
|
|
||||||
There are many doubly-linked list implementations like it, but this
|
|
||||||
one is mine.
|
|
||||||
|
|
||||||
For when an array would be too big, and a Map can't be iterated in
|
|
||||||
reverse order.
|
|
||||||
|
|
||||||
|
|
||||||
[](https://travis-ci.org/isaacs/yallist) [](https://coveralls.io/github/isaacs/yallist)
|
|
||||||
|
|
||||||
## basic usage
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
var yallist = require('yallist')
|
|
||||||
var myList = yallist.create([1, 2, 3])
|
|
||||||
myList.push('foo')
|
|
||||||
myList.unshift('bar')
|
|
||||||
// of course pop() and shift() are there, too
|
|
||||||
console.log(myList.toArray()) // ['bar', 1, 2, 3, 'foo']
|
|
||||||
myList.forEach(function (k) {
|
|
||||||
// walk the list head to tail
|
|
||||||
})
|
|
||||||
myList.forEachReverse(function (k, index, list) {
|
|
||||||
// walk the list tail to head
|
|
||||||
})
|
|
||||||
var myDoubledList = myList.map(function (k) {
|
|
||||||
return k + k
|
|
||||||
})
|
|
||||||
// now myDoubledList contains ['barbar', 2, 4, 6, 'foofoo']
|
|
||||||
// mapReverse is also a thing
|
|
||||||
var myDoubledListReverse = myList.mapReverse(function (k) {
|
|
||||||
return k + k
|
|
||||||
}) // ['foofoo', 6, 4, 2, 'barbar']
|
|
||||||
|
|
||||||
var reduced = myList.reduce(function (set, entry) {
|
|
||||||
set += entry
|
|
||||||
return set
|
|
||||||
}, 'start')
|
|
||||||
console.log(reduced) // 'startfoo123bar'
|
|
||||||
```
|
|
||||||
|
|
||||||
## api
|
|
||||||
|
|
||||||
The whole API is considered "public".
|
|
||||||
|
|
||||||
Functions with the same name as an Array method work more or less the
|
|
||||||
same way.
|
|
||||||
|
|
||||||
There's reverse versions of most things because that's the point.
|
|
||||||
|
|
||||||
### Yallist
|
|
||||||
|
|
||||||
Default export, the class that holds and manages a list.
|
|
||||||
|
|
||||||
Call it with either a forEach-able (like an array) or a set of
|
|
||||||
arguments, to initialize the list.
|
|
||||||
|
|
||||||
The Array-ish methods all act like you'd expect. No magic length,
|
|
||||||
though, so if you change that it won't automatically prune or add
|
|
||||||
empty spots.
|
|
||||||
|
|
||||||
### Yallist.create(..)
|
|
||||||
|
|
||||||
Alias for Yallist function. Some people like factories.
|
|
||||||
|
|
||||||
#### yallist.head
|
|
||||||
|
|
||||||
The first node in the list
|
|
||||||
|
|
||||||
#### yallist.tail
|
|
||||||
|
|
||||||
The last node in the list
|
|
||||||
|
|
||||||
#### yallist.length
|
|
||||||
|
|
||||||
The number of nodes in the list. (Change this at your peril. It is
|
|
||||||
not magic like Array length.)
|
|
||||||
|
|
||||||
#### yallist.toArray()
|
|
||||||
|
|
||||||
Convert the list to an array.
|
|
||||||
|
|
||||||
#### yallist.forEach(fn, [thisp])
|
|
||||||
|
|
||||||
Call a function on each item in the list.
|
|
||||||
|
|
||||||
#### yallist.forEachReverse(fn, [thisp])
|
|
||||||
|
|
||||||
Call a function on each item in the list, in reverse order.
|
|
||||||
|
|
||||||
#### yallist.get(n)
|
|
||||||
|
|
||||||
Get the data at position `n` in the list. If you use this a lot,
|
|
||||||
probably better off just using an Array.
|
|
||||||
|
|
||||||
#### yallist.getReverse(n)
|
|
||||||
|
|
||||||
Get the data at position `n`, counting from the tail.
|
|
||||||
|
|
||||||
#### yallist.map(fn, thisp)
|
|
||||||
|
|
||||||
Create a new Yallist with the result of calling the function on each
|
|
||||||
item.
|
|
||||||
|
|
||||||
#### yallist.mapReverse(fn, thisp)
|
|
||||||
|
|
||||||
Same as `map`, but in reverse.
|
|
||||||
|
|
||||||
#### yallist.pop()
|
|
||||||
|
|
||||||
Get the data from the list tail, and remove the tail from the list.
|
|
||||||
|
|
||||||
#### yallist.push(item, ...)
|
|
||||||
|
|
||||||
Insert one or more items to the tail of the list.
|
|
||||||
|
|
||||||
#### yallist.reduce(fn, initialValue)
|
|
||||||
|
|
||||||
Like Array.reduce.
|
|
||||||
|
|
||||||
#### yallist.reduceReverse
|
|
||||||
|
|
||||||
Like Array.reduce, but in reverse.
|
|
||||||
|
|
||||||
#### yallist.reverse
|
|
||||||
|
|
||||||
Reverse the list in place.
|
|
||||||
|
|
||||||
#### yallist.shift()
|
|
||||||
|
|
||||||
Get the data from the list head, and remove the head from the list.
|
|
||||||
|
|
||||||
#### yallist.slice([from], [to])
|
|
||||||
|
|
||||||
Just like Array.slice, but returns a new Yallist.
|
|
||||||
|
|
||||||
#### yallist.sliceReverse([from], [to])
|
|
||||||
|
|
||||||
Just like yallist.slice, but the result is returned in reverse.
|
|
||||||
|
|
||||||
#### yallist.toArray()
|
|
||||||
|
|
||||||
Create an array representation of the list.
|
|
||||||
|
|
||||||
#### yallist.toArrayReverse()
|
|
||||||
|
|
||||||
Create a reversed array representation of the list.
|
|
||||||
|
|
||||||
#### yallist.unshift(item, ...)
|
|
||||||
|
|
||||||
Insert one or more items to the head of the list.
|
|
||||||
|
|
||||||
#### yallist.unshiftNode(node)
|
|
||||||
|
|
||||||
Move a Node object to the front of the list. (That is, pull it out of
|
|
||||||
wherever it lives, and make it the new head.)
|
|
||||||
|
|
||||||
If the node belongs to a different list, then that list will remove it
|
|
||||||
first.
|
|
||||||
|
|
||||||
#### yallist.pushNode(node)
|
|
||||||
|
|
||||||
Move a Node object to the end of the list. (That is, pull it out of
|
|
||||||
wherever it lives, and make it the new tail.)
|
|
||||||
|
|
||||||
If the node belongs to a list already, then that list will remove it
|
|
||||||
first.
|
|
||||||
|
|
||||||
#### yallist.removeNode(node)
|
|
||||||
|
|
||||||
Remove a node from the list, preserving referential integrity of head
|
|
||||||
and tail and other nodes.
|
|
||||||
|
|
||||||
Will throw an error if you try to have a list remove a node that
|
|
||||||
doesn't belong to it.
|
|
||||||
|
|
||||||
### Yallist.Node
|
|
||||||
|
|
||||||
The class that holds the data and is actually the list.
|
|
||||||
|
|
||||||
Call with `var n = new Node(value, previousNode, nextNode)`
|
|
||||||
|
|
||||||
Note that if you do direct operations on Nodes themselves, it's very
|
|
||||||
easy to get into weird states where the list is broken. Be careful :)
|
|
||||||
|
|
||||||
#### node.next
|
|
||||||
|
|
||||||
The next node in the list.
|
|
||||||
|
|
||||||
#### node.prev
|
|
||||||
|
|
||||||
The previous node in the list.
|
|
||||||
|
|
||||||
#### node.value
|
|
||||||
|
|
||||||
The data the node contains.
|
|
||||||
|
|
||||||
#### node.list
|
|
||||||
|
|
||||||
The list to which this node belongs. (Null if it does not belong to
|
|
||||||
any list.)
|
|
||||||
8
test/integration/test-fixtures/yarn-lock/node_modules/yallist/iterator.js
generated
vendored
8
test/integration/test-fixtures/yarn-lock/node_modules/yallist/iterator.js
generated
vendored
@ -1,8 +0,0 @@
|
|||||||
'use strict'
|
|
||||||
module.exports = function (Yallist) {
|
|
||||||
Yallist.prototype[Symbol.iterator] = function* () {
|
|
||||||
for (let walker = this.head; walker; walker = walker.next) {
|
|
||||||
yield walker.value
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
29
test/integration/test-fixtures/yarn-lock/node_modules/yallist/package.json
generated
vendored
29
test/integration/test-fixtures/yarn-lock/node_modules/yallist/package.json
generated
vendored
@ -1,29 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "yallist",
|
|
||||||
"version": "4.0.0",
|
|
||||||
"description": "Yet Another Linked List",
|
|
||||||
"main": "yallist.js",
|
|
||||||
"directories": {
|
|
||||||
"test": "test"
|
|
||||||
},
|
|
||||||
"files": [
|
|
||||||
"yallist.js",
|
|
||||||
"iterator.js"
|
|
||||||
],
|
|
||||||
"dependencies": {},
|
|
||||||
"devDependencies": {
|
|
||||||
"tap": "^12.1.0"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"test": "tap test/*.js --100",
|
|
||||||
"preversion": "npm test",
|
|
||||||
"postversion": "npm publish",
|
|
||||||
"postpublish": "git push origin --all; git push origin --tags"
|
|
||||||
},
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+https://github.com/isaacs/yallist.git"
|
|
||||||
},
|
|
||||||
"author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
|
|
||||||
"license": "ISC"
|
|
||||||
}
|
|
||||||
426
test/integration/test-fixtures/yarn-lock/node_modules/yallist/yallist.js
generated
vendored
426
test/integration/test-fixtures/yarn-lock/node_modules/yallist/yallist.js
generated
vendored
@ -1,426 +0,0 @@
|
|||||||
'use strict'
|
|
||||||
module.exports = Yallist
|
|
||||||
|
|
||||||
Yallist.Node = Node
|
|
||||||
Yallist.create = Yallist
|
|
||||||
|
|
||||||
function Yallist (list) {
|
|
||||||
var self = this
|
|
||||||
if (!(self instanceof Yallist)) {
|
|
||||||
self = new Yallist()
|
|
||||||
}
|
|
||||||
|
|
||||||
self.tail = null
|
|
||||||
self.head = null
|
|
||||||
self.length = 0
|
|
||||||
|
|
||||||
if (list && typeof list.forEach === 'function') {
|
|
||||||
list.forEach(function (item) {
|
|
||||||
self.push(item)
|
|
||||||
})
|
|
||||||
} else if (arguments.length > 0) {
|
|
||||||
for (var i = 0, l = arguments.length; i < l; i++) {
|
|
||||||
self.push(arguments[i])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return self
|
|
||||||
}
|
|
||||||
|
|
||||||
Yallist.prototype.removeNode = function (node) {
|
|
||||||
if (node.list !== this) {
|
|
||||||
throw new Error('removing node which does not belong to this list')
|
|
||||||
}
|
|
||||||
|
|
||||||
var next = node.next
|
|
||||||
var prev = node.prev
|
|
||||||
|
|
||||||
if (next) {
|
|
||||||
next.prev = prev
|
|
||||||
}
|
|
||||||
|
|
||||||
if (prev) {
|
|
||||||
prev.next = next
|
|
||||||
}
|
|
||||||
|
|
||||||
if (node === this.head) {
|
|
||||||
this.head = next
|
|
||||||
}
|
|
||||||
if (node === this.tail) {
|
|
||||||
this.tail = prev
|
|
||||||
}
|
|
||||||
|
|
||||||
node.list.length--
|
|
||||||
node.next = null
|
|
||||||
node.prev = null
|
|
||||||
node.list = null
|
|
||||||
|
|
||||||
return next
|
|
||||||
}
|
|
||||||
|
|
||||||
Yallist.prototype.unshiftNode = function (node) {
|
|
||||||
if (node === this.head) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if (node.list) {
|
|
||||||
node.list.removeNode(node)
|
|
||||||
}
|
|
||||||
|
|
||||||
var head = this.head
|
|
||||||
node.list = this
|
|
||||||
node.next = head
|
|
||||||
if (head) {
|
|
||||||
head.prev = node
|
|
||||||
}
|
|
||||||
|
|
||||||
this.head = node
|
|
||||||
if (!this.tail) {
|
|
||||||
this.tail = node
|
|
||||||
}
|
|
||||||
this.length++
|
|
||||||
}
|
|
||||||
|
|
||||||
Yallist.prototype.pushNode = function (node) {
|
|
||||||
if (node === this.tail) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if (node.list) {
|
|
||||||
node.list.removeNode(node)
|
|
||||||
}
|
|
||||||
|
|
||||||
var tail = this.tail
|
|
||||||
node.list = this
|
|
||||||
node.prev = tail
|
|
||||||
if (tail) {
|
|
||||||
tail.next = node
|
|
||||||
}
|
|
||||||
|
|
||||||
this.tail = node
|
|
||||||
if (!this.head) {
|
|
||||||
this.head = node
|
|
||||||
}
|
|
||||||
this.length++
|
|
||||||
}
|
|
||||||
|
|
||||||
Yallist.prototype.push = function () {
|
|
||||||
for (var i = 0, l = arguments.length; i < l; i++) {
|
|
||||||
push(this, arguments[i])
|
|
||||||
}
|
|
||||||
return this.length
|
|
||||||
}
|
|
||||||
|
|
||||||
Yallist.prototype.unshift = function () {
|
|
||||||
for (var i = 0, l = arguments.length; i < l; i++) {
|
|
||||||
unshift(this, arguments[i])
|
|
||||||
}
|
|
||||||
return this.length
|
|
||||||
}
|
|
||||||
|
|
||||||
Yallist.prototype.pop = function () {
|
|
||||||
if (!this.tail) {
|
|
||||||
return undefined
|
|
||||||
}
|
|
||||||
|
|
||||||
var res = this.tail.value
|
|
||||||
this.tail = this.tail.prev
|
|
||||||
if (this.tail) {
|
|
||||||
this.tail.next = null
|
|
||||||
} else {
|
|
||||||
this.head = null
|
|
||||||
}
|
|
||||||
this.length--
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
Yallist.prototype.shift = function () {
|
|
||||||
if (!this.head) {
|
|
||||||
return undefined
|
|
||||||
}
|
|
||||||
|
|
||||||
var res = this.head.value
|
|
||||||
this.head = this.head.next
|
|
||||||
if (this.head) {
|
|
||||||
this.head.prev = null
|
|
||||||
} else {
|
|
||||||
this.tail = null
|
|
||||||
}
|
|
||||||
this.length--
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
Yallist.prototype.forEach = function (fn, thisp) {
|
|
||||||
thisp = thisp || this
|
|
||||||
for (var walker = this.head, i = 0; walker !== null; i++) {
|
|
||||||
fn.call(thisp, walker.value, i, this)
|
|
||||||
walker = walker.next
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Yallist.prototype.forEachReverse = function (fn, thisp) {
|
|
||||||
thisp = thisp || this
|
|
||||||
for (var walker = this.tail, i = this.length - 1; walker !== null; i--) {
|
|
||||||
fn.call(thisp, walker.value, i, this)
|
|
||||||
walker = walker.prev
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Yallist.prototype.get = function (n) {
|
|
||||||
for (var i = 0, walker = this.head; walker !== null && i < n; i++) {
|
|
||||||
// abort out of the list early if we hit a cycle
|
|
||||||
walker = walker.next
|
|
||||||
}
|
|
||||||
if (i === n && walker !== null) {
|
|
||||||
return walker.value
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Yallist.prototype.getReverse = function (n) {
|
|
||||||
for (var i = 0, walker = this.tail; walker !== null && i < n; i++) {
|
|
||||||
// abort out of the list early if we hit a cycle
|
|
||||||
walker = walker.prev
|
|
||||||
}
|
|
||||||
if (i === n && walker !== null) {
|
|
||||||
return walker.value
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Yallist.prototype.map = function (fn, thisp) {
|
|
||||||
thisp = thisp || this
|
|
||||||
var res = new Yallist()
|
|
||||||
for (var walker = this.head; walker !== null;) {
|
|
||||||
res.push(fn.call(thisp, walker.value, this))
|
|
||||||
walker = walker.next
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
Yallist.prototype.mapReverse = function (fn, thisp) {
|
|
||||||
thisp = thisp || this
|
|
||||||
var res = new Yallist()
|
|
||||||
for (var walker = this.tail; walker !== null;) {
|
|
||||||
res.push(fn.call(thisp, walker.value, this))
|
|
||||||
walker = walker.prev
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
Yallist.prototype.reduce = function (fn, initial) {
|
|
||||||
var acc
|
|
||||||
var walker = this.head
|
|
||||||
if (arguments.length > 1) {
|
|
||||||
acc = initial
|
|
||||||
} else if (this.head) {
|
|
||||||
walker = this.head.next
|
|
||||||
acc = this.head.value
|
|
||||||
} else {
|
|
||||||
throw new TypeError('Reduce of empty list with no initial value')
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var i = 0; walker !== null; i++) {
|
|
||||||
acc = fn(acc, walker.value, i)
|
|
||||||
walker = walker.next
|
|
||||||
}
|
|
||||||
|
|
||||||
return acc
|
|
||||||
}
|
|
||||||
|
|
||||||
Yallist.prototype.reduceReverse = function (fn, initial) {
|
|
||||||
var acc
|
|
||||||
var walker = this.tail
|
|
||||||
if (arguments.length > 1) {
|
|
||||||
acc = initial
|
|
||||||
} else if (this.tail) {
|
|
||||||
walker = this.tail.prev
|
|
||||||
acc = this.tail.value
|
|
||||||
} else {
|
|
||||||
throw new TypeError('Reduce of empty list with no initial value')
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var i = this.length - 1; walker !== null; i--) {
|
|
||||||
acc = fn(acc, walker.value, i)
|
|
||||||
walker = walker.prev
|
|
||||||
}
|
|
||||||
|
|
||||||
return acc
|
|
||||||
}
|
|
||||||
|
|
||||||
Yallist.prototype.toArray = function () {
|
|
||||||
var arr = new Array(this.length)
|
|
||||||
for (var i = 0, walker = this.head; walker !== null; i++) {
|
|
||||||
arr[i] = walker.value
|
|
||||||
walker = walker.next
|
|
||||||
}
|
|
||||||
return arr
|
|
||||||
}
|
|
||||||
|
|
||||||
Yallist.prototype.toArrayReverse = function () {
|
|
||||||
var arr = new Array(this.length)
|
|
||||||
for (var i = 0, walker = this.tail; walker !== null; i++) {
|
|
||||||
arr[i] = walker.value
|
|
||||||
walker = walker.prev
|
|
||||||
}
|
|
||||||
return arr
|
|
||||||
}
|
|
||||||
|
|
||||||
Yallist.prototype.slice = function (from, to) {
|
|
||||||
to = to || this.length
|
|
||||||
if (to < 0) {
|
|
||||||
to += this.length
|
|
||||||
}
|
|
||||||
from = from || 0
|
|
||||||
if (from < 0) {
|
|
||||||
from += this.length
|
|
||||||
}
|
|
||||||
var ret = new Yallist()
|
|
||||||
if (to < from || to < 0) {
|
|
||||||
return ret
|
|
||||||
}
|
|
||||||
if (from < 0) {
|
|
||||||
from = 0
|
|
||||||
}
|
|
||||||
if (to > this.length) {
|
|
||||||
to = this.length
|
|
||||||
}
|
|
||||||
for (var i = 0, walker = this.head; walker !== null && i < from; i++) {
|
|
||||||
walker = walker.next
|
|
||||||
}
|
|
||||||
for (; walker !== null && i < to; i++, walker = walker.next) {
|
|
||||||
ret.push(walker.value)
|
|
||||||
}
|
|
||||||
return ret
|
|
||||||
}
|
|
||||||
|
|
||||||
Yallist.prototype.sliceReverse = function (from, to) {
|
|
||||||
to = to || this.length
|
|
||||||
if (to < 0) {
|
|
||||||
to += this.length
|
|
||||||
}
|
|
||||||
from = from || 0
|
|
||||||
if (from < 0) {
|
|
||||||
from += this.length
|
|
||||||
}
|
|
||||||
var ret = new Yallist()
|
|
||||||
if (to < from || to < 0) {
|
|
||||||
return ret
|
|
||||||
}
|
|
||||||
if (from < 0) {
|
|
||||||
from = 0
|
|
||||||
}
|
|
||||||
if (to > this.length) {
|
|
||||||
to = this.length
|
|
||||||
}
|
|
||||||
for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) {
|
|
||||||
walker = walker.prev
|
|
||||||
}
|
|
||||||
for (; walker !== null && i > from; i--, walker = walker.prev) {
|
|
||||||
ret.push(walker.value)
|
|
||||||
}
|
|
||||||
return ret
|
|
||||||
}
|
|
||||||
|
|
||||||
Yallist.prototype.splice = function (start, deleteCount, ...nodes) {
|
|
||||||
if (start > this.length) {
|
|
||||||
start = this.length - 1
|
|
||||||
}
|
|
||||||
if (start < 0) {
|
|
||||||
start = this.length + start;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var i = 0, walker = this.head; walker !== null && i < start; i++) {
|
|
||||||
walker = walker.next
|
|
||||||
}
|
|
||||||
|
|
||||||
var ret = []
|
|
||||||
for (var i = 0; walker && i < deleteCount; i++) {
|
|
||||||
ret.push(walker.value)
|
|
||||||
walker = this.removeNode(walker)
|
|
||||||
}
|
|
||||||
if (walker === null) {
|
|
||||||
walker = this.tail
|
|
||||||
}
|
|
||||||
|
|
||||||
if (walker !== this.head && walker !== this.tail) {
|
|
||||||
walker = walker.prev
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var i = 0; i < nodes.length; i++) {
|
|
||||||
walker = insert(this, walker, nodes[i])
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
Yallist.prototype.reverse = function () {
|
|
||||||
var head = this.head
|
|
||||||
var tail = this.tail
|
|
||||||
for (var walker = head; walker !== null; walker = walker.prev) {
|
|
||||||
var p = walker.prev
|
|
||||||
walker.prev = walker.next
|
|
||||||
walker.next = p
|
|
||||||
}
|
|
||||||
this.head = tail
|
|
||||||
this.tail = head
|
|
||||||
return this
|
|
||||||
}
|
|
||||||
|
|
||||||
function insert (self, node, value) {
|
|
||||||
var inserted = node === self.head ?
|
|
||||||
new Node(value, null, node, self) :
|
|
||||||
new Node(value, node, node.next, self)
|
|
||||||
|
|
||||||
if (inserted.next === null) {
|
|
||||||
self.tail = inserted
|
|
||||||
}
|
|
||||||
if (inserted.prev === null) {
|
|
||||||
self.head = inserted
|
|
||||||
}
|
|
||||||
|
|
||||||
self.length++
|
|
||||||
|
|
||||||
return inserted
|
|
||||||
}
|
|
||||||
|
|
||||||
function push (self, item) {
|
|
||||||
self.tail = new Node(item, self.tail, null, self)
|
|
||||||
if (!self.head) {
|
|
||||||
self.head = self.tail
|
|
||||||
}
|
|
||||||
self.length++
|
|
||||||
}
|
|
||||||
|
|
||||||
function unshift (self, item) {
|
|
||||||
self.head = new Node(item, null, self.head, self)
|
|
||||||
if (!self.tail) {
|
|
||||||
self.tail = self.head
|
|
||||||
}
|
|
||||||
self.length++
|
|
||||||
}
|
|
||||||
|
|
||||||
function Node (value, prev, next, list) {
|
|
||||||
if (!(this instanceof Node)) {
|
|
||||||
return new Node(value, prev, next, list)
|
|
||||||
}
|
|
||||||
|
|
||||||
this.list = list
|
|
||||||
this.value = value
|
|
||||||
|
|
||||||
if (prev) {
|
|
||||||
prev.next = this
|
|
||||||
this.prev = prev
|
|
||||||
} else {
|
|
||||||
this.prev = null
|
|
||||||
}
|
|
||||||
|
|
||||||
if (next) {
|
|
||||||
next.prev = this
|
|
||||||
this.next = next
|
|
||||||
} else {
|
|
||||||
this.next = null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
// add if support for Symbol.iterator is present
|
|
||||||
require('./iterator.js')(Yallist)
|
|
||||||
} catch (er) {}
|
|
||||||
1601
test/integration/test-fixtures/yarn-lock/node_modules/yallist/yarn.lock
generated
vendored
1601
test/integration/test-fixtures/yarn-lock/node_modules/yallist/yarn.lock
generated
vendored
File diff suppressed because it is too large
Load Diff
@ -3,11 +3,17 @@
|
|||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"private": true,
|
||||||
|
"workspaces": {
|
||||||
|
"packages": [
|
||||||
|
"packages/*"
|
||||||
|
]
|
||||||
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"collapse-white-space": "^2.0.0",
|
"async": "^3.2.3"
|
||||||
"semver": "^7.3.5"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"merge-objects": "^1.0.5"
|
"merge-objects": "^1.0.5",
|
||||||
|
"should-type": "https://github.com/shouldjs/type.git#1.3.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
19
test/integration/test-fixtures/yarn-lock/packages/nested-package/node_modules/async/LICENSE
generated
vendored
Normal file
19
test/integration/test-fixtures/yarn-lock/packages/nested-package/node_modules/async/LICENSE
generated
vendored
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
Copyright (c) 2010-2014 Caolan McMahon
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
38
test/integration/test-fixtures/yarn-lock/packages/nested-package/node_modules/async/bower.json
generated
vendored
Normal file
38
test/integration/test-fixtures/yarn-lock/packages/nested-package/node_modules/async/bower.json
generated
vendored
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
{
|
||||||
|
"name": "async",
|
||||||
|
"description": "Higher-order functions and common patterns for asynchronous code",
|
||||||
|
"version": "0.9.2",
|
||||||
|
"main": "lib/async.js",
|
||||||
|
"keywords": [
|
||||||
|
"async",
|
||||||
|
"callback",
|
||||||
|
"utility",
|
||||||
|
"module"
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/caolan/async.git"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"nodeunit": ">0.0.0",
|
||||||
|
"uglify-js": "1.2.x",
|
||||||
|
"nodelint": ">0.0.0",
|
||||||
|
"lodash": ">=2.4.1"
|
||||||
|
},
|
||||||
|
"moduleType": [
|
||||||
|
"amd",
|
||||||
|
"globals",
|
||||||
|
"node"
|
||||||
|
],
|
||||||
|
"ignore": [
|
||||||
|
"**/.*",
|
||||||
|
"node_modules",
|
||||||
|
"bower_components",
|
||||||
|
"test",
|
||||||
|
"tests"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
"Caolan McMahon"
|
||||||
|
]
|
||||||
|
}
|
||||||
16
test/integration/test-fixtures/yarn-lock/packages/nested-package/node_modules/async/component.json
generated
vendored
Normal file
16
test/integration/test-fixtures/yarn-lock/packages/nested-package/node_modules/async/component.json
generated
vendored
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"name": "async",
|
||||||
|
"description": "Higher-order functions and common patterns for asynchronous code",
|
||||||
|
"version": "0.9.2",
|
||||||
|
"keywords": [
|
||||||
|
"async",
|
||||||
|
"callback",
|
||||||
|
"utility",
|
||||||
|
"module"
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"repository": "caolan/async",
|
||||||
|
"scripts": [
|
||||||
|
"lib/async.js"
|
||||||
|
]
|
||||||
|
}
|
||||||
54
test/integration/test-fixtures/yarn-lock/packages/nested-package/node_modules/async/package.json
generated
vendored
Normal file
54
test/integration/test-fixtures/yarn-lock/packages/nested-package/node_modules/async/package.json
generated
vendored
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"name": "async",
|
||||||
|
"description": "Higher-order functions and common patterns for asynchronous code",
|
||||||
|
"main": "lib/async.js",
|
||||||
|
"author": "Caolan McMahon",
|
||||||
|
"version": "0.9.2",
|
||||||
|
"keywords": [
|
||||||
|
"async",
|
||||||
|
"callback",
|
||||||
|
"utility",
|
||||||
|
"module"
|
||||||
|
],
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/caolan/async.git"
|
||||||
|
},
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/caolan/async/issues"
|
||||||
|
},
|
||||||
|
"license": "MIT",
|
||||||
|
"devDependencies": {
|
||||||
|
"nodeunit": ">0.0.0",
|
||||||
|
"uglify-js": "1.2.x",
|
||||||
|
"nodelint": ">0.0.0",
|
||||||
|
"lodash": ">=2.4.1"
|
||||||
|
},
|
||||||
|
"jam": {
|
||||||
|
"main": "lib/async.js",
|
||||||
|
"include": [
|
||||||
|
"lib/async.js",
|
||||||
|
"README.md",
|
||||||
|
"LICENSE"
|
||||||
|
],
|
||||||
|
"categories": [
|
||||||
|
"Utilities"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"test": "nodeunit test/test-async.js"
|
||||||
|
},
|
||||||
|
"spm": {
|
||||||
|
"main": "lib/async.js"
|
||||||
|
},
|
||||||
|
"volo": {
|
||||||
|
"main": "lib/async.js",
|
||||||
|
"ignore": [
|
||||||
|
"**/.*",
|
||||||
|
"node_modules",
|
||||||
|
"bower_components",
|
||||||
|
"test",
|
||||||
|
"tests"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"name": "yarn-lock-nested-package",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"main": "index.js",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"async": "0.9.2",
|
||||||
|
"resize-observer-polyfill": "^1.5.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -2,31 +2,27 @@
|
|||||||
# yarn lockfile v1
|
# yarn lockfile v1
|
||||||
|
|
||||||
|
|
||||||
collapse-white-space@^2.0.0:
|
async@0.9.2:
|
||||||
version "2.0.0"
|
version "0.9.2"
|
||||||
resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-2.0.0.tgz#37d8521344cdd36635db180a7c83e9d515ac281b"
|
resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d"
|
||||||
integrity sha512-eh9krktAIMDL0KHuN7WTBJ/0PMv8KUvfQRBkIlGmW61idRM2DJjgd1qXEPr4wyk2PimZZeNww3RVYo6CMvDGlg==
|
integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=
|
||||||
|
|
||||||
lru-cache@^6.0.0:
|
async@^3.2.3:
|
||||||
version "6.0.0"
|
version "3.2.3"
|
||||||
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
|
resolved "https://registry.yarnpkg.com/async/-/async-3.2.3.tgz#ac53dafd3f4720ee9e8a160628f18ea91df196c9"
|
||||||
integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
|
integrity sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==
|
||||||
dependencies:
|
|
||||||
yallist "^4.0.0"
|
|
||||||
|
|
||||||
merge-objects@^1.0.5:
|
merge-objects@^1.0.5:
|
||||||
version "1.0.5"
|
version "1.0.5"
|
||||||
resolved "https://registry.yarnpkg.com/merge-objects/-/merge-objects-1.0.5.tgz#ad923ff3910091acc1438f53eb75b8f37d862a86"
|
resolved "https://registry.yarnpkg.com/merge-objects/-/merge-objects-1.0.5.tgz#ad923ff3910091acc1438f53eb75b8f37d862a86"
|
||||||
integrity sha1-rZI/85EAkazBQ49T63W4832GKoY=
|
integrity sha1-rZI/85EAkazBQ49T63W4832GKoY=
|
||||||
|
|
||||||
semver@^7.3.5:
|
resize-observer-polyfill@^1.5.1:
|
||||||
version "7.3.5"
|
name "resize-observer-polyfill"
|
||||||
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
|
version "1.5.2"
|
||||||
integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
|
resolved "https://registry.yarnpkg.com/@4lolo/resize-observer-polyfill/-/resize-observer-polyfill-1.5.2.tgz#58868fc7224506236b5550d0c68357f0a874b84b"
|
||||||
dependencies:
|
integrity sha512-HY4JYLITsWBOdeqCF/x3q7Aa2PVl/BmfkPv4H/Qzplc4Lrn9cKmWz6jHyAREH9tFuD0xELjJVgX3JaEmdcXu3g==
|
||||||
lru-cache "^6.0.0"
|
|
||||||
|
|
||||||
yallist@^4.0.0:
|
"should-type@https://github.com/shouldjs/type.git#1.3.0":
|
||||||
version "4.0.0"
|
version "1.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
|
resolved "https://github.com/shouldjs/type.git#31d26945cb3b4ad21d2308776e4442c461666390"
|
||||||
integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user