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

github.com/npm/cli.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/ci.yml41
l---------node_modules/libnpmdiff1
-rw-r--r--package-lock.json64
-rw-r--r--package.json3
-rw-r--r--packages/libnpmdiff/.eslintrc.json207
-rw-r--r--packages/libnpmdiff/.gitignore99
-rw-r--r--packages/libnpmdiff/CHANGELOG.md30
-rw-r--r--packages/libnpmdiff/LICENSE (renamed from node_modules/libnpmdiff/LICENSE)0
-rw-r--r--packages/libnpmdiff/README.md98
-rw-r--r--packages/libnpmdiff/index.js (renamed from node_modules/libnpmdiff/index.js)0
-rw-r--r--packages/libnpmdiff/lib/format-diff.js (renamed from node_modules/libnpmdiff/lib/format-diff.js)0
-rw-r--r--packages/libnpmdiff/lib/should-print-patch.js (renamed from node_modules/libnpmdiff/lib/should-print-patch.js)0
-rw-r--r--packages/libnpmdiff/lib/tarball.js (renamed from node_modules/libnpmdiff/lib/tarball.js)0
-rw-r--r--packages/libnpmdiff/lib/untar.js (renamed from node_modules/libnpmdiff/lib/untar.js)0
-rw-r--r--packages/libnpmdiff/package.json (renamed from node_modules/libnpmdiff/package.json)12
-rw-r--r--packages/libnpmdiff/tap-snapshots/test/format-diff.js.test.cjs152
-rw-r--r--packages/libnpmdiff/tap-snapshots/test/index.js.test.cjs115
-rw-r--r--packages/libnpmdiff/tap-snapshots/test/untar.js.test.cjs134
-rw-r--r--packages/libnpmdiff/test/fixtures/archive.tgzbin0 -> 74564 bytes
-rw-r--r--packages/libnpmdiff/test/fixtures/ruyadorno-simplistic-pkg-with-folders-1.0.0.tgzbin0 -> 573 bytes
-rw-r--r--packages/libnpmdiff/test/fixtures/simple-output-2.2.1.tgzbin0 -> 2227 bytes
-rw-r--r--packages/libnpmdiff/test/format-diff.js483
-rw-r--r--packages/libnpmdiff/test/index.js147
-rw-r--r--packages/libnpmdiff/test/should-print-patch.js28
-rw-r--r--packages/libnpmdiff/test/tarball.js96
-rw-r--r--packages/libnpmdiff/test/untar.js231
-rw-r--r--scripts/bundle-and-gitignore-deps.js5
27 files changed, 1912 insertions, 34 deletions
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 78c2926af..3b622ed82 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -79,6 +79,47 @@ jobs:
env:
DEPLOY_VERSION: testing
+ workspaces-tests:
+ strategy:
+ fail-fast: false
+ matrix:
+ node-version: [10.x, 12.x, 14.x, 16.x]
+ platform:
+ - os: ubuntu-latest
+ shell: bash
+ - os: macos-latest
+ shell: bash
+ - os: windows-latest
+ shell: bash
+ - os: windows-latest
+ shell: powershell
+
+ runs-on: ${{ matrix.platform.os }}
+ defaults:
+ run:
+ shell: ${{ matrix.platform.shell }}
+
+ steps:
+ # Checkout the npm/cli repo
+ - uses: actions/checkout@v2
+
+ # Installs the specific version of Node.js
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v1
+ with:
+ node-version: ${{ matrix.node-version }}
+
+ # Run the installer script
+ - name: Install dependencies
+ run: |
+ node . install --ignore-scripts --no-audit
+ node . rebuild
+
+ - name: Run workspaces tests
+ run: node . test -w ./packages -- --no-check-coverage -t600 -Rbase -c
+ env:
+ DEPLOY_VERSION: testing
+
build:
strategy:
fail-fast: false
diff --git a/node_modules/libnpmdiff b/node_modules/libnpmdiff
new file mode 120000
index 000000000..ae8dd6289
--- /dev/null
+++ b/node_modules/libnpmdiff
@@ -0,0 +1 @@
+../packages/libnpmdiff \ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index b393b7e3f..3f3d1bf0f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -78,7 +78,8 @@
],
"license": "Artistic-2.0",
"workspaces": [
- "docs"
+ "docs",
+ "packages/*"
],
"dependencies": {
"@npmcli/arborist": "^2.6.1",
@@ -798,7 +799,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@npmcli/disparity-colors/-/disparity-colors-1.0.1.tgz",
"integrity": "sha512-kQ1aCTTU45mPXN+pdAaRxlxr3OunkyztjbbxDY/aIcPS5CnCUrx+1+NvA6pTcYR7wmLZe37+Mi5v3nfbwPxq3A==",
- "inBundle": true,
"dependencies": {
"ansi-styles": "^4.3.0"
},
@@ -1380,7 +1380,6 @@
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
"integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
- "inBundle": true,
"engines": {
"node": ">=8"
}
@@ -2236,7 +2235,6 @@
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
"integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
- "inBundle": true,
"engines": {
"node": ">=0.3.1"
}
@@ -4632,23 +4630,8 @@
}
},
"node_modules/libnpmdiff": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/libnpmdiff/-/libnpmdiff-2.0.4.tgz",
- "integrity": "sha512-q3zWePOJLHwsLEUjZw3Kyu/MJMYfl4tWCg78Vl6QGSfm4aXBUSVzMzjJ6jGiyarsT4d+1NH4B1gxfs62/+y9iQ==",
- "inBundle": true,
- "dependencies": {
- "@npmcli/disparity-colors": "^1.0.1",
- "@npmcli/installed-package-contents": "^1.0.7",
- "binary-extensions": "^2.2.0",
- "diff": "^5.0.0",
- "minimatch": "^3.0.4",
- "npm-package-arg": "^8.1.1",
- "pacote": "^11.3.0",
- "tar": "^6.1.0"
- },
- "engines": {
- "node": ">=10"
- }
+ "resolved": "packages/libnpmdiff",
+ "link": true
},
"node_modules/libnpmexec": {
"version": "1.2.0",
@@ -10377,6 +10360,31 @@
"type": "github",
"url": "https://github.com/sponsors/wooorm"
}
+ },
+ "packages/libnpmdiff": {
+ "version": "2.0.4",
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/disparity-colors": "^1.0.1",
+ "@npmcli/installed-package-contents": "^1.0.7",
+ "binary-extensions": "^2.2.0",
+ "diff": "^5.0.0",
+ "minimatch": "^3.0.4",
+ "npm-package-arg": "^8.1.4",
+ "pacote": "^11.3.4",
+ "tar": "^6.1.0"
+ },
+ "devDependencies": {
+ "eslint": "^7.28.0",
+ "eslint-plugin-import": "^2.23.4",
+ "eslint-plugin-node": "^11.1.0",
+ "eslint-plugin-promise": "^5.1.0",
+ "eslint-plugin-standard": "^5.0.0",
+ "tap": "^15.0.9"
+ },
+ "engines": {
+ "node": ">=10"
+ }
}
},
"dependencies": {
@@ -13706,17 +13714,21 @@
}
},
"libnpmdiff": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/libnpmdiff/-/libnpmdiff-2.0.4.tgz",
- "integrity": "sha512-q3zWePOJLHwsLEUjZw3Kyu/MJMYfl4tWCg78Vl6QGSfm4aXBUSVzMzjJ6jGiyarsT4d+1NH4B1gxfs62/+y9iQ==",
+ "version": "file:packages/libnpmdiff",
"requires": {
"@npmcli/disparity-colors": "^1.0.1",
"@npmcli/installed-package-contents": "^1.0.7",
"binary-extensions": "^2.2.0",
"diff": "^5.0.0",
+ "eslint": "^7.28.0",
+ "eslint-plugin-import": "^2.23.4",
+ "eslint-plugin-node": "^11.1.0",
+ "eslint-plugin-promise": "^5.1.0",
+ "eslint-plugin-standard": "^5.0.0",
"minimatch": "^3.0.4",
- "npm-package-arg": "^8.1.1",
- "pacote": "^11.3.0",
+ "npm-package-arg": "^8.1.4",
+ "pacote": "^11.3.4",
+ "tap": "^15.0.9",
"tar": "^6.1.0"
}
},
diff --git a/package.json b/package.json
index 645681858..a1f515960 100644
--- a/package.json
+++ b/package.json
@@ -3,7 +3,8 @@
"name": "npm",
"description": "a package manager for JavaScript",
"workspaces": [
- "docs"
+ "docs",
+ "packages/*"
],
"files": [
"bin",
diff --git a/packages/libnpmdiff/.eslintrc.json b/packages/libnpmdiff/.eslintrc.json
new file mode 100644
index 000000000..6232a8f82
--- /dev/null
+++ b/packages/libnpmdiff/.eslintrc.json
@@ -0,0 +1,207 @@
+{
+ "parserOptions": {
+ "ecmaVersion": 2018,
+ "ecmaFeatures": {},
+ "sourceType": "script"
+ },
+
+ "env": {
+ "es6": true,
+ "node": true
+ },
+
+ "plugins": [
+ "import",
+ "node",
+ "promise",
+ "standard"
+ ],
+
+ "globals": {
+ "document": "readonly",
+ "navigator": "readonly",
+ "window": "readonly"
+ },
+
+ "rules": {
+ "accessor-pairs": "error",
+ "array-bracket-spacing": ["error", "never"],
+ "arrow-spacing": ["error", { "before": true, "after": true }],
+ "block-spacing": ["error", "always"],
+ "brace-style": ["error", "1tbs", { "allowSingleLine": false }],
+ "camelcase": ["error", { "properties": "never" }],
+ "comma-dangle": ["error", {
+ "arrays": "always-multiline",
+ "objects": "always-multiline",
+ "imports": "always-multiline",
+ "exports": "always-multiline",
+ "functions": "never"
+ }],
+ "comma-spacing": ["error", { "before": false, "after": true }],
+ "comma-style": ["error", "last"],
+ "computed-property-spacing": ["error", "never"],
+ "constructor-super": "error",
+ "curly": ["error", "multi-or-nest"],
+ "dot-location": ["error", "property"],
+ "dot-notation": ["error", { "allowKeywords": true }],
+ "eol-last": "error",
+ "eqeqeq": ["error", "always", { "null": "ignore" }],
+ "func-call-spacing": ["error", "never"],
+ "generator-star-spacing": ["error", { "before": true, "after": true }],
+ "handle-callback-err": ["error", "^(err|error)$" ],
+ "indent": ["error", 2, {
+ "SwitchCase": 1,
+ "VariableDeclarator": 1,
+ "outerIIFEBody": 1,
+ "MemberExpression": 1,
+ "FunctionDeclaration": { "parameters": 1, "body": 1 },
+ "FunctionExpression": { "parameters": 1, "body": 1 },
+ "CallExpression": { "arguments": 1 },
+ "ArrayExpression": 1,
+ "ObjectExpression": 1,
+ "ImportDeclaration": 1,
+ "flatTernaryExpressions": true,
+ "ignoreComments": false,
+ "ignoredNodes": ["TemplateLiteral *"]
+ }],
+ "key-spacing": ["error", { "beforeColon": false, "afterColon": true }],
+ "keyword-spacing": ["error", { "before": true, "after": true }],
+ "lines-between-class-members": ["error", "always", { "exceptAfterSingleLine": true }],
+ "new-cap": ["error", { "newIsCap": true, "capIsNew": false, "properties": true }],
+ "new-parens": "error",
+ "no-array-constructor": "error",
+ "no-async-promise-executor": "error",
+ "no-caller": "error",
+ "no-case-declarations": "error",
+ "no-class-assign": "error",
+ "no-compare-neg-zero": "error",
+ "no-cond-assign": "off",
+ "no-const-assign": "error",
+ "no-constant-condition": ["error", { "checkLoops": false }],
+ "no-control-regex": "error",
+ "no-debugger": "error",
+ "no-delete-var": "error",
+ "no-dupe-args": "error",
+ "no-dupe-class-members": "error",
+ "no-dupe-keys": "error",
+ "no-duplicate-case": "error",
+ "no-empty-character-class": "error",
+ "no-empty-pattern": "error",
+ "no-eval": "error",
+ "no-ex-assign": "error",
+ "no-extend-native": "error",
+ "no-extra-bind": "error",
+ "no-extra-boolean-cast": "error",
+ "no-extra-parens": ["error", "functions"],
+ "no-fallthrough": "error",
+ "no-floating-decimal": "error",
+ "no-func-assign": "error",
+ "no-global-assign": "error",
+ "no-implied-eval": "error",
+ "no-inner-declarations": ["error", "functions"],
+ "no-invalid-regexp": "error",
+ "no-irregular-whitespace": "error",
+ "no-iterator": "error",
+ "no-labels": ["error", { "allowLoop": true, "allowSwitch": false }],
+ "no-lone-blocks": "error",
+ "no-misleading-character-class": "error",
+ "no-prototype-builtins": "error",
+ "no-useless-catch": "error",
+ "no-mixed-operators": "off",
+ "no-mixed-spaces-and-tabs": "error",
+ "no-multi-spaces": "error",
+ "no-multi-str": "error",
+ "no-multiple-empty-lines": ["error", { "max": 1, "maxEOF": 0 }],
+ "no-negated-in-lhs": "error",
+ "no-new": "off",
+ "no-new-func": "error",
+ "no-new-object": "error",
+ "no-new-require": "error",
+ "no-new-symbol": "error",
+ "no-new-wrappers": "error",
+ "no-obj-calls": "error",
+ "no-octal": "error",
+ "no-octal-escape": "error",
+ "no-path-concat": "error",
+ "no-proto": "error",
+ "no-redeclare": ["error", { "builtinGlobals": false }],
+ "no-regex-spaces": "error",
+ "no-return-assign": "off",
+ "no-self-assign": "off",
+ "no-self-compare": "error",
+ "no-sequences": "error",
+ "no-shadow-restricted-names": "error",
+ "no-sparse-arrays": "error",
+ "no-tabs": "error",
+ "no-template-curly-in-string": "error",
+ "no-this-before-super": "error",
+ "no-throw-literal": "off",
+ "no-trailing-spaces": "error",
+ "no-undef": "error",
+ "no-undef-init": "error",
+ "no-unexpected-multiline": "error",
+ "no-unmodified-loop-condition": "error",
+ "no-unneeded-ternary": ["error", { "defaultAssignment": false }],
+ "no-unreachable": "error",
+ "no-unsafe-finally": 0,
+ "no-unsafe-negation": "error",
+ "no-unused-expressions": ["error", { "allowShortCircuit": true, "allowTernary": true, "allowTaggedTemplates": true }],
+ "no-unused-vars": ["error", { "vars": "all", "args": "none", "ignoreRestSiblings": true }],
+ "no-use-before-define": ["error", { "functions": false, "classes": false, "variables": false }],
+ "no-useless-call": "error",
+ "no-useless-computed-key": "error",
+ "no-useless-constructor": "error",
+ "no-useless-escape": "error",
+ "no-useless-rename": "error",
+ "no-useless-return": "error",
+ "no-void": "error",
+ "no-whitespace-before-property": "error",
+ "no-with": "error",
+ "nonblock-statement-body-position": [2, "below"],
+ "object-curly-newline": "off",
+ "object-curly-spacing": "off",
+ "object-property-newline": ["error", { "allowMultiplePropertiesPerLine": true }],
+ "one-var": ["error", { "initialized": "never" }],
+ "operator-linebreak": "off",
+ "padded-blocks": ["error", { "blocks": "never", "switches": "never", "classes": "never" }],
+ "prefer-const": ["error", {"destructuring": "all"}],
+ "prefer-promise-reject-errors": "error",
+ "quote-props": ["error", "as-needed"],
+ "quotes": ["error", "single", { "avoidEscape": true, "allowTemplateLiterals": true }],
+ "rest-spread-spacing": ["error", "never"],
+ "semi": ["error", "never"],
+ "semi-spacing": ["error", { "before": false, "after": true }],
+ "space-before-blocks": ["error", "always"],
+ "space-before-function-paren": ["error", "always"],
+ "space-in-parens": ["error", "never"],
+ "space-infix-ops": "error",
+ "space-unary-ops": ["error", { "words": true, "nonwords": false }],
+ "spaced-comment": ["error", "always", {
+ "line": { "markers": ["*package", "!", "/", ",", "="] },
+ "block": { "balanced": true, "markers": ["*package", "!", ",", ":", "::", "flow-include"], "exceptions": ["*"] }
+ }],
+ "symbol-description": "error",
+ "template-curly-spacing": ["error", "never"],
+ "template-tag-spacing": ["error", "never"],
+ "unicode-bom": ["error", "never"],
+ "use-isnan": "error",
+ "valid-typeof": ["error", { "requireStringLiterals": true }],
+ "wrap-iife": ["error", "any", { "functionPrototypeMethods": true }],
+ "yield-star-spacing": ["error", "both"],
+ "yoda": ["error", "never"],
+
+ "import/export": "error",
+ "import/first": "error",
+ "import/no-absolute-path": ["error", { "esmodule": true, "commonjs": true, "amd": false }],
+ "import/no-duplicates": "error",
+ "import/no-named-default": "error",
+ "import/no-webpack-loader-syntax": "error",
+
+ "node/no-deprecated-api": "error",
+ "node/process-exit-as-throw": "error",
+
+ "promise/param-names": "off",
+
+ "standard/no-callback-literal": "error"
+ }
+}
diff --git a/packages/libnpmdiff/.gitignore b/packages/libnpmdiff/.gitignore
new file mode 100644
index 000000000..0aba557bf
--- /dev/null
+++ b/packages/libnpmdiff/.gitignore
@@ -0,0 +1,99 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+lerna-debug.log*
+
+# Diagnostic reports (https://nodejs.org/api/report.html)
+report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
+
+# Runtime data
+pids
+*.pid
+*.seed
+*.pid.lock
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+*.lcov
+
+# nyc test coverage
+.nyc_output
+
+# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# Bower dependency directory (https://bower.io/)
+bower_components
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (https://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directories
+node_modules/
+jspm_packages/
+
+# TypeScript v1 declaration files
+typings/
+
+# TypeScript cache
+*.tsbuildinfo
+
+# Optional npm cache directory
+.npm
+
+# Optional eslint cache
+.eslintcache
+
+# Microbundle cache
+.rpt2_cache/
+.rts2_cache_cjs/
+.rts2_cache_es/
+.rts2_cache_umd/
+
+# Optional REPL history
+.node_repl_history
+
+# Output of 'npm pack'
+*.tgz
+
+# Yarn Integrity file
+.yarn-integrity
+
+# dotenv environment variables file
+.env
+.env.test
+
+# parcel-bundler cache (https://parceljs.org/)
+.cache
+
+# next.js build output
+.next
+
+# nuxt.js build output
+.nuxt
+
+# gatsby files
+.cache/
+public
+
+# vuepress build output
+.vuepress/dist
+
+# Serverless directories
+.serverless/
+
+# FuseBox cache
+.fusebox/
+
+# DynamoDB Local files
+.dynamodb/
+
+# Editors
+Session.vim
diff --git a/packages/libnpmdiff/CHANGELOG.md b/packages/libnpmdiff/CHANGELOG.md
new file mode 100644
index 000000000..b93b15b7b
--- /dev/null
+++ b/packages/libnpmdiff/CHANGELOG.md
@@ -0,0 +1,30 @@
+# Changelog
+
+## 2.0.3
+
+- fix name of options sent by the npm cli
+
+## 2.0.2
+
+- fix matching basename file filter
+
+## 2.0.1
+
+- fix for tarballs not listing folder names
+
+## 2.0.0
+
+- API rewrite:
+ - normalized all options
+ - specs to compare are now an array
+- fix context=0
+- added support to filtering by folder names
+
+## 1.0.1
+
+- fixed nameOnly option
+
+## 1.0.0
+
+- Initial release
+
diff --git a/node_modules/libnpmdiff/LICENSE b/packages/libnpmdiff/LICENSE
index d3a1cdfd2..d3a1cdfd2 100644
--- a/node_modules/libnpmdiff/LICENSE
+++ b/packages/libnpmdiff/LICENSE
diff --git a/packages/libnpmdiff/README.md b/packages/libnpmdiff/README.md
new file mode 100644
index 000000000..bc260ad15
--- /dev/null
+++ b/packages/libnpmdiff/README.md
@@ -0,0 +1,98 @@
+# libnpmdiff
+
+[![npm version](https://img.shields.io/npm/v/libnpmdiff.svg)](https://npm.im/libnpmdiff)
+[![license](https://img.shields.io/npm/l/libnpmdiff.svg)](https://npm.im/libnpmdiff)
+[![GitHub Actions](https://github.com/npm/libnpmdiff/workflows/node-ci/badge.svg)](https://github.com/npm/libnpmdiff/actions?query=workflow%3Anode-ci)
+[![Coverage Status](https://coveralls.io/repos/github/npm/libnpmdiff/badge.svg?branch=main)](https://coveralls.io/github/npm/libnpmdiff?branch=main)
+
+The registry diff lib.
+
+## Table of Contents
+
+* [Example](#example)
+* [Install](#install)
+* [Contributing](#contributing)
+* [API](#api)
+* [LICENSE](#license)
+
+## Example
+
+```js
+const libdiff = require('libnpmdiff')
+
+const patch = await libdiff([
+ 'abbrev@1.1.0',
+ 'abbrev@1.1.1'
+])
+console.log(
+ patch
+)
+```
+
+Returns:
+
+```patch
+diff --git a/package.json b/package.json
+index v1.1.0..v1.1.1 100644
+--- a/package.json
++++ b/package.json
+@@ -1,6 +1,6 @@
+ {
+ "name": "abbrev",
+- "version": "1.1.0",
++ "version": "1.1.1",
+ "description": "Like ruby's abbrev module, but in js",
+ "author": "Isaac Z. Schlueter <i@izs.me>",
+ "main": "abbrev.js",
+
+```
+
+## Install
+
+`$ npm install libnpmdiff`
+
+### Contributing
+
+The npm team enthusiastically welcomes contributions and project participation!
+There's a bunch of things you can do if you want to contribute! The
+[Contributor Guide](https://github.com/npm/cli/blob/latest/CONTRIBUTING.md)
+outlines the process for community interaction and contribution. Please don't
+hesitate to jump in if you'd like to, or even ask us questions if something
+isn't clear.
+
+All participants and maintainers in this project are expected to follow the
+[npm Code of Conduct](https://www.npmjs.com/policies/conduct), and just
+generally be excellent to each other.
+
+Please refer to the [Changelog](CHANGELOG.md) for project history details, too.
+
+Happy hacking!
+
+### API
+
+#### `> libnpmdif([ a, b ], [opts]) -> Promise<String>`
+
+Fetches the registry tarballs and compare files between a spec `a` and spec `b`. **npm** spec types are usually described in `<pkg-name>@<version>` form but multiple other types are alsos supported, for more info on valid specs take a look at [`npm-package-arg`](https://github.com/npm/npm-package-arg).
+
+**Options**:
+
+- `color <Boolean>`: Should add ANSI colors to string output? Defaults to `false`.
+- `tagVersionPrefix <Sring>`: What prefix should be used to define version numbers. Defaults to `v`
+- `diffUnified <Number>`: How many lines of code to print before/after each diff. Defaults to `3`.
+- `diffFiles <Array<String>>`: If set only prints patches for the files listed in this array (also accepts globs). Defaults to `undefined`.
+- `diffIgnoreAllSpace <Boolean>`: Whether or not should ignore changes in whitespace (very useful to avoid indentation changes extra diff lines). Defaults to `false`.
+- `diffNameOnly <Boolean>`: Prints only file names and no patch diffs. Defaults to `false`.
+- `diffNoPrefix <Boolean>`: If true then skips printing any prefixes in filenames. Defaults to `false`.
+- `diffSrcPrefix <String>`: Prefix to be used in the filenames from `a`. Defaults to `a/`.
+- `diffDstPrefix <String>`: Prefix to be used in the filenames from `b`. Defaults to `b/`.
+- `diffText <Boolean>`: Should treat all files as text and try to print diff for binary files. Defaults to `false`.
+- ...`cache`, `registry`, `where` and other common options accepted by [pacote](https://github.com/npm/pacote#options)
+
+Returns a `Promise` that fullfils with a `String` containing the resulting patch diffs.
+
+Throws an error if either `a` or `b` are missing or if trying to diff more than two specs.
+
+## LICENSE
+
+[ISC](./LICENSE)
+
diff --git a/node_modules/libnpmdiff/index.js b/packages/libnpmdiff/index.js
index 73dc3ee64..73dc3ee64 100644
--- a/node_modules/libnpmdiff/index.js
+++ b/packages/libnpmdiff/index.js
diff --git a/node_modules/libnpmdiff/lib/format-diff.js b/packages/libnpmdiff/lib/format-diff.js
index 979ce8873..979ce8873 100644
--- a/node_modules/libnpmdiff/lib/format-diff.js
+++ b/packages/libnpmdiff/lib/format-diff.js
diff --git a/node_modules/libnpmdiff/lib/should-print-patch.js b/packages/libnpmdiff/lib/should-print-patch.js
index aeb015c1a..aeb015c1a 100644
--- a/node_modules/libnpmdiff/lib/should-print-patch.js
+++ b/packages/libnpmdiff/lib/should-print-patch.js
diff --git a/node_modules/libnpmdiff/lib/tarball.js b/packages/libnpmdiff/lib/tarball.js
index 0c8fb177a..0c8fb177a 100644
--- a/node_modules/libnpmdiff/lib/tarball.js
+++ b/packages/libnpmdiff/lib/tarball.js
diff --git a/node_modules/libnpmdiff/lib/untar.js b/packages/libnpmdiff/lib/untar.js
index 16b69ab8f..16b69ab8f 100644
--- a/node_modules/libnpmdiff/lib/untar.js
+++ b/packages/libnpmdiff/lib/untar.js
diff --git a/node_modules/libnpmdiff/package.json b/packages/libnpmdiff/package.json
index aa13954c6..53fd5d4be 100644
--- a/node_modules/libnpmdiff/package.json
+++ b/packages/libnpmdiff/package.json
@@ -46,12 +46,12 @@
]
},
"devDependencies": {
- "eslint": "^7.18.0",
- "eslint-plugin-import": "^2.22.1",
+ "eslint": "^7.28.0",
+ "eslint-plugin-import": "^2.23.4",
"eslint-plugin-node": "^11.1.0",
- "eslint-plugin-promise": "^4.2.1",
+ "eslint-plugin-promise": "^5.1.0",
"eslint-plugin-standard": "^5.0.0",
- "tap": "^14.11.0"
+ "tap": "^15.0.9"
},
"dependencies": {
"@npmcli/disparity-colors": "^1.0.1",
@@ -59,8 +59,8 @@
"binary-extensions": "^2.2.0",
"diff": "^5.0.0",
"minimatch": "^3.0.4",
- "npm-package-arg": "^8.1.1",
- "pacote": "^11.3.0",
+ "npm-package-arg": "^8.1.4",
+ "pacote": "^11.3.4",
"tar": "^6.1.0"
}
}
diff --git a/packages/libnpmdiff/tap-snapshots/test/format-diff.js.test.cjs b/packages/libnpmdiff/tap-snapshots/test/format-diff.js.test.cjs
new file mode 100644
index 000000000..f735d8925
--- /dev/null
+++ b/packages/libnpmdiff/tap-snapshots/test/format-diff.js.test.cjs
@@ -0,0 +1,152 @@
+/* IMPORTANT
+ * This snapshot file is auto-generated, but designed for humans.
+ * It should be checked into source control and tracked carefully.
+ * Re-generate by setting TAP_SNAPSHOT=1 and running tests.
+ * Make sure to inspect the output below. Do not ignore changes!
+ */
+'use strict'
+exports[`test/format-diff.js TAP added file > should output expected added file diff result 1`] = `
+diff --git a/foo.js b/foo.js
+new file mode 100755
+index v1.0.0..v2.0.0
+--- a/foo.js
++++ b/foo.js
+@@ -0,0 +1,2 @@
++"use strict"
++module.exports = "foo"
+`
+
+exports[`test/format-diff.js TAP binary file > should output expected bin file diff result 1`] = `
+diff --git a/foo.jpg b/foo.jpg
+index v1.0.0..v2.0.0 100644
+--- a/foo.jpg
++++ b/foo.jpg
+`
+
+exports[`test/format-diff.js TAP changed file mode > should output expected changed file mode diff result 1`] = `
+diff --git a/foo.js b/foo.js
+old mode 100644
+new mode 100755
+index v1.0.0..v2.0.0
+--- a/foo.js
++++ b/foo.js
+`
+
+exports[`test/format-diff.js TAP colored output > should output expected colored diff result 1`] = `
+diff --git a/foo.js b/foo.js
+index v1.0.0..v2.0.0 100644
+--- a/foo.js
++++ b/foo.js
+@@ -1,2 +1,2 @@
+ "use strict"
+-module.exports = "foo"
++module.exports = "foobar"
+`
+
+exports[`test/format-diff.js TAP diff options > should output expected diff result 1`] = `
+diff --git before/foo.js after/foo.js
+index v1.0.0..v2.0.0 100644
+--- before/foo.js
++++ after/foo.js
+@@ -4,4 +4,6 @@
+ const c = "c"
++const d = "d"
+ module.exports = () => a+
+ b+
+-c
++c+
++d
+`
+
+exports[`test/format-diff.js TAP diffUnified=0 > should output no context lines in output 1`] = `
+diff --git a/foo.js b/foo.js
+index v1.0.0..v2.0.0 100644
+--- a/foo.js
++++ b/foo.js
+@@ -3,2 +3,3 @@
+-const b = "b"
+-const c = "c"
++ const b = "b"
++ const c = "c"
++ const d = "d"
+@@ -7,1 +8,2 @@
+-c
++c+
++d
+`
+
+exports[`test/format-diff.js TAP format multiple files patch > should output expected result for multiple files 1`] = `
+diff --git a/foo.js b/foo.js
+index v1.0.0..v1.1.1 100644
+--- a/foo.js
++++ b/foo.js
+@@ -1,2 +1,2 @@
+ "use strict"
+-module.exports = "foo"
++module.exports = "foobar"
+diff --git a/lib/utils.js b/lib/utils.js
+index v1.0.0..v1.1.1 100644
+--- a/lib/utils.js
++++ b/lib/utils.js
+@@ -1,3 +1,4 @@
+ "use strict"
+ const bar = require("./bar.js")
+-module.exports = () => bar
++module.exports =
++ () => bar + "util"
+`
+
+exports[`test/format-diff.js TAP format removed file > should output expected removed file diff result 1`] = `
+diff --git a/foo.js b/foo.js
+deleted file mode 100644
+index v1.0.0..v2.0.0
+--- a/foo.js
++++ b/foo.js
+@@ -1,2 +0,0 @@
+-"use strict"
+-module.exports = "foo"
+/ No newline at end of file
+`
+
+exports[`test/format-diff.js TAP format simple diff > should output expected diff result 1`] = `
+diff --git a/foo.js b/foo.js
+index v1.0.0..v2.0.0 100644
+--- a/foo.js
++++ b/foo.js
+@@ -1,2 +1,2 @@
+ "use strict"
+-module.exports = "foo"
++module.exports = "foobar"
+`
+
+exports[`test/format-diff.js TAP noPrefix > should output result with no prefixes 1`] = `
+diff --git foo.js foo.js
+index v1.0.0..v2.0.0 100644
+Index: foo.js
+--- foo.js
++++ foo.js
+@@ -1,2 +1,2 @@
+ "use strict"
+-module.exports = "foo"
++module.exports = "foobar"
+`
+
+exports[`test/format-diff.js TAP nothing to diff > should output empty result 1`] = `
+
+`
+
+exports[`test/format-diff.js TAP respect --tag-version-prefix option > should output expected diff result 1`] = `
+diff --git a/foo.js b/foo.js
+index b1.0.0..b2.0.0 100644
+--- a/foo.js
++++ b/foo.js
+@@ -1,2 +1,2 @@
+ "use strict"
+-module.exports = "foo"
++module.exports = "foobar"
+`
+
+exports[`test/format-diff.js TAP using --name-only option > should output expected diff result 1`] = `
+foo.js
+lib/utils.js
+`
diff --git a/packages/libnpmdiff/tap-snapshots/test/index.js.test.cjs b/packages/libnpmdiff/tap-snapshots/test/index.js.test.cjs
new file mode 100644
index 000000000..21db3deac
--- /dev/null
+++ b/packages/libnpmdiff/tap-snapshots/test/index.js.test.cjs
@@ -0,0 +1,115 @@
+/* IMPORTANT
+ * This snapshot file is auto-generated, but designed for humans.
+ * It should be checked into source control and tracked carefully.
+ * Re-generate by setting TAP_SNAPSHOT=1 and running tests.
+ * Make sure to inspect the output below. Do not ignore changes!
+ */
+'use strict'
+exports[`test/index.js TAP compare two diff specs > should output expected diff 1`] = `
+diff --git a/index.js b/index.js
+index v1.0.0..v2.0.0 100644
+--- a/index.js
++++ b/index.js
+@@ -1,2 +1,2 @@
+ module.exports =
+- "a1"
++ "a2"
+diff --git a/package.json b/package.json
+index v1.0.0..v2.0.0 100644
+--- a/package.json
++++ b/package.json
+@@ -1,4 +1,4 @@
+ {
+ "name": "a",
+- "version": "1.0.0"
++ "version": "2.0.0"
+ }
+`
+
+exports[`test/index.js TAP folder in node_modules nested, absolute path > should output expected diff 1`] = `
+diff --git a/package.json b/package.json
+index v2.0.0..v2.0.1 100644
+--- a/package.json
++++ b/package.json
+@@ -1,6 +1,6 @@
+ {
+ "name": "b",
+- "version": "2.0.0",
++ "version": "2.0.1",
+ "scripts": {
+ "prepare": "node prepare.js"
+ }
+diff --git a/prepare.js b/prepare.js
+index v2.0.0..v2.0.1 100644
+--- a/prepare.js
++++ b/prepare.js
+@@ -1,1 +0,0 @@
+-throw new Error("ERR")
+/ No newline at end of file
+`
+
+exports[`test/index.js TAP folder in node_modules nested, relative path > should output expected diff 1`] = `
+diff --git a/package.json b/package.json
+index v2.0.0..v2.0.1 100644
+--- a/package.json
++++ b/package.json
+@@ -1,6 +1,6 @@
+ {
+ "name": "b",
+- "version": "2.0.0",
++ "version": "2.0.1",
+ "scripts": {
+ "prepare": "node prepare.js"
+ }
+diff --git a/prepare.js b/prepare.js
+index v2.0.0..v2.0.1 100644
+--- a/prepare.js
++++ b/prepare.js
+@@ -1,1 +0,0 @@
+-throw new Error("ERR")
+/ No newline at end of file
+`
+
+exports[`test/index.js TAP folder in node_modules top-level, absolute path > should output expected diff 1`] = `
+diff --git a/package.json b/package.json
+index v1.0.0..v1.0.1 100644
+--- a/package.json
++++ b/package.json
+@@ -1,6 +1,6 @@
+ {
+ "name": "a",
+- "version": "1.0.0",
++ "version": "1.0.1",
+ "scripts": {
+ "prepare": "node prepare.js"
+ }
+diff --git a/prepare.js b/prepare.js
+index v1.0.0..v1.0.1 100644
+--- a/prepare.js
++++ b/prepare.js
+@@ -1,1 +0,0 @@
+-throw new Error("ERR")
+/ No newline at end of file
+`
+
+exports[`test/index.js TAP folder in node_modules top-level, relative path > should output expected diff 1`] = `
+diff --git a/package.json b/package.json
+index v1.0.0..v1.0.1 100644
+--- a/package.json
++++ b/package.json
+@@ -1,6 +1,6 @@
+ {
+ "name": "a",
+- "version": "1.0.0",
++ "version": "1.0.1",
+ "scripts": {
+ "prepare": "node prepare.js"
+ }
+diff --git a/prepare.js b/prepare.js
+index v1.0.0..v1.0.1 100644
+--- a/prepare.js
++++ b/prepare.js
+@@ -1,1 +0,0 @@
+-throw new Error("ERR")
+/ No newline at end of file
+`
diff --git a/packages/libnpmdiff/tap-snapshots/test/untar.js.test.cjs b/packages/libnpmdiff/tap-snapshots/test/untar.js.test.cjs
new file mode 100644
index 000000000..b1092feb6
--- /dev/null
+++ b/packages/libnpmdiff/tap-snapshots/test/untar.js.test.cjs
@@ -0,0 +1,134 @@
+/* IMPORTANT
+ * This snapshot file is auto-generated, but designed for humans.
+ * It should be checked into source control and tracked carefully.
+ * Re-generate by setting TAP_SNAPSHOT=1 and running tests.
+ * Make sure to inspect the output below. Do not ignore changes!
+ */
+'use strict'
+exports[`test/untar.js TAP filter files > should return list of filenames 1`] = `
+LICENSE
+README.md
+`
+
+exports[`test/untar.js TAP filter files > should return map of filenames with valid contents 1`] = `
+a/LICENSE: true
+a/README.md: true
+`
+
+exports[`test/untar.js TAP filter files by exact filename > should return no filenames 1`] = `
+
+`
+
+exports[`test/untar.js TAP filter files by exact filename > should return no filenames 2`] = `
+
+`
+
+exports[`test/untar.js TAP filter files using glob expressions > should return list of filenames 1`] = `
+lib/index.js
+lib/utils/b.js
+package-lock.json
+test/index.js
+`
+
+exports[`test/untar.js TAP filter files using glob expressions > should return map of filenames with valid contents 1`] = `
+a/lib/index.js: true
+a/lib/utils/b.js: true
+a/package-lock.json: true
+a/test/index.js: true
+`
+
+exports[`test/untar.js TAP match files by end of filename > should return list of filenames 1`] = `
+lib/index.js
+lib/utils/b.js
+test/index.js
+test/utils/b.js
+`
+
+exports[`test/untar.js TAP match files by end of filename > should return map of filenames with valid contents 1`] = `
+a/lib/index.js: true
+a/lib/utils/b.js: true
+a/test/index.js: true
+a/test/utils/b.js: true
+`
+
+exports[`test/untar.js TAP match files by simple folder name > should return list of filenames 1`] = `
+lib/index.js
+lib/utils/b.js
+`
+
+exports[`test/untar.js TAP match files by simple folder name > should return map of filenames with valid contents 1`] = `
+a/lib/index.js: true
+a/lib/utils/b.js: true
+`
+
+exports[`test/untar.js TAP match files by simple folder name variation > should return list of filenames 1`] = `
+test/index.js
+test/utils/b.js
+`
+
+exports[`test/untar.js TAP match files by simple folder name variation > should return map of filenames with valid contents 1`] = `
+a/test/index.js: true
+a/test/utils/b.js: true
+`
+
+exports[`test/untar.js TAP untar package with folders > should have read contents 1`] = `
+module.exports = 'b'
+
+`
+
+exports[`test/untar.js TAP untar package with folders > should return list of filenames 1`] = `
+lib/index.js
+lib/utils/b.js
+package-lock.json
+package.json
+test/index.js
+test/utils/b.js
+`
+
+exports[`test/untar.js TAP untar package with folders > should return map of filenames to its contents 1`] = `
+a/lib/index.js: true
+a/lib/utils/b.js: true
+a/package-lock.json: true
+a/package.json: true
+a/test/index.js: true
+a/test/utils/b.js: true
+`
+
+exports[`test/untar.js TAP untar simple package > should have read contents 1`] = `
+The MIT License (MIT)
+
+Copyright (c) Ruy Adorno (ruyadorno.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.
+
+`
+
+exports[`test/untar.js TAP untar simple package > should return list of filenames 1`] = `
+LICENSE
+index.js
+package.json
+README.md
+`
+
+exports[`test/untar.js TAP untar simple package > should return map of filenames to its contents 1`] = `
+a/LICENSE: true
+a/index.js: true
+a/package.json: true
+a/README.md: true
+`
diff --git a/packages/libnpmdiff/test/fixtures/archive.tgz b/packages/libnpmdiff/test/fixtures/archive.tgz
new file mode 100644
index 000000000..843a61123
--- /dev/null
+++ b/packages/libnpmdiff/test/fixtures/archive.tgz
Binary files differ
diff --git a/packages/libnpmdiff/test/fixtures/ruyadorno-simplistic-pkg-with-folders-1.0.0.tgz b/packages/libnpmdiff/test/fixtures/ruyadorno-simplistic-pkg-with-folders-1.0.0.tgz
new file mode 100644
index 000000000..11bbb44c4
--- /dev/null
+++ b/packages/libnpmdiff/test/fixtures/ruyadorno-simplistic-pkg-with-folders-1.0.0.tgz
Binary files differ
diff --git a/packages/libnpmdiff/test/fixtures/simple-output-2.2.1.tgz b/packages/libnpmdiff/test/fixtures/simple-output-2.2.1.tgz
new file mode 100644
index 000000000..8d442f4c1
--- /dev/null
+++ b/packages/libnpmdiff/test/fixtures/simple-output-2.2.1.tgz
Binary files differ
diff --git a/packages/libnpmdiff/test/format-diff.js b/packages/libnpmdiff/test/format-diff.js
new file mode 100644
index 000000000..f2fc7c77d
--- /dev/null
+++ b/packages/libnpmdiff/test/format-diff.js
@@ -0,0 +1,483 @@
+const t = require('tap')
+
+const formatDiff = require('../lib/format-diff.js')
+
+const normalizeWin = (str) => str
+ .replace(/\\+/g, '/')
+ .replace(/\r\n/g, '\n')
+
+t.cleanSnapshot = (str) => normalizeWin(str)
+
+t.test('format simple diff', t => {
+ const files = new Set([
+ 'foo.js',
+ ])
+ const refs = new Map(Object.entries({
+ 'a/foo.js': {
+ content: '"use strict"\nmodule.exports = "foo"\n',
+ mode: '100644',
+ },
+ 'b/foo.js': {
+ content: '"use strict"\nmodule.exports = "foobar"\n',
+ mode: '100644',
+ },
+ }))
+ const versions = {
+ a: '1.0.0',
+ b: '2.0.0',
+ }
+
+ t.matchSnapshot(
+ formatDiff({
+ files,
+ refs,
+ versions,
+ }),
+ 'should output expected diff result'
+ )
+ t.end()
+})
+
+t.test('nothing to diff', t => {
+ const files = new Set([
+ 'foo.js',
+ ])
+ const refs = new Map(Object.entries({
+ 'a/foo.js': {
+ content: '"use strict"\nmodule.exports = "foo"\n',
+ mode: '100644',
+ },
+ 'b/foo.js': {
+ content: '"use strict"\nmodule.exports = "foo"\n',
+ mode: '100644',
+ },
+ }))
+ const versions = {
+ a: '1.0.0',
+ b: '1.0.0',
+ }
+
+ t.matchSnapshot(
+ formatDiff({
+ files,
+ refs,
+ versions,
+ }),
+ 'should output empty result'
+ )
+ t.end()
+})
+
+t.test('format removed file', t => {
+ const files = new Set([
+ 'foo.js',
+ ])
+ const refs = new Map(Object.entries({
+ 'a/foo.js': {
+ content: '"use strict"\nmodule.exports = "foo"\n',
+ mode: '100644',
+ },
+ }))
+ const versions = {
+ a: '1.0.0',
+ b: '2.0.0',
+ }
+
+ t.matchSnapshot(
+ formatDiff({
+ files,
+ refs,
+ versions,
+ }),
+ 'should output expected removed file diff result'
+ )
+ t.end()
+})
+
+t.test('changed file mode', t => {
+ const files = new Set([
+ 'foo.js',
+ ])
+ const refs = new Map(Object.entries({
+ 'a/foo.js': {
+ content: '"use strict"\nmodule.exports = "foo"\n',
+ mode: '100644',
+ },
+ 'b/foo.js': {
+ content: '"use strict"\nmodule.exports = "foo"\n',
+ mode: '100755',
+ },
+ }))
+ const versions = {
+ a: '1.0.0',
+ b: '2.0.0',
+ }
+
+ t.matchSnapshot(
+ formatDiff({
+ files,
+ refs,
+ versions,
+ }),
+ 'should output expected changed file mode diff result'
+ )
+ t.end()
+})
+
+t.test('added file', t => {
+ const files = new Set([
+ 'foo.js',
+ ])
+ const refs = new Map(Object.entries({
+ 'b/foo.js': {
+ content: '"use strict"\nmodule.exports = "foo"\n',
+ mode: '100755',
+ },
+ }))
+ const versions = {
+ a: '1.0.0',
+ b: '2.0.0',
+ }
+
+ t.matchSnapshot(
+ formatDiff({
+ files,
+ refs,
+ versions,
+ }),
+ 'should output expected added file diff result'
+ )
+ t.end()
+})
+
+t.test('binary file', t => {
+ const files = new Set([
+ 'foo.jpg',
+ ])
+ const refs = new Map(Object.entries({
+ 'a/foo.jpg': {
+ content: Buffer.from(''),
+ mode: '100644',
+ },
+ 'b/foo.jpg': {
+ content: Buffer.from(''),
+ mode: '100644',
+ },
+ }))
+ const versions = {
+ a: '1.0.0',
+ b: '2.0.0',
+ }
+
+ t.matchSnapshot(
+ formatDiff({
+ files,
+ refs,
+ versions,
+ }),
+ 'should output expected bin file diff result'
+ )
+ t.end()
+})
+
+t.test('nothing to compare', t => {
+ const files = new Set([
+ 'foo.jpg',
+ ])
+ const refs = new Map(Object.entries({
+ 'a/foo.jpg': {},
+ 'b/foo.jpg': {},
+ }))
+ const versions = {
+ a: '1.0.0',
+ b: '2.0.0',
+ }
+
+ t.equal(
+ formatDiff({
+ files,
+ refs,
+ versions,
+ }),
+ '',
+ 'should have no output'
+ )
+ t.end()
+})
+
+t.test('colored output', t => {
+ const files = new Set([
+ 'foo.js',
+ ])
+ const refs = new Map(Object.entries({
+ 'a/foo.js': {
+ content: '"use strict"\nmodule.exports = "foo"\n',
+ mode: '100644',
+ },
+ 'b/foo.js': {
+ content: '"use strict"\nmodule.exports = "foobar"\n',
+ mode: '100644',
+ },
+ }))
+ const versions = {
+ a: '1.0.0',
+ b: '2.0.0',
+ }
+
+ t.matchSnapshot(
+ formatDiff({
+ files,
+ refs,
+ versions,
+ opts: {
+ color: true,
+ },
+ }),
+ 'should output expected colored diff result'
+ )
+ t.end()
+})
+
+t.test('using --name-only option', t => {
+ const files = new Set([
+ 'foo.js',
+ 'lib/bar.js',
+ 'lib/utils.js',
+ ])
+ const refs = new Map(Object.entries({
+ 'a/foo.js': {
+ content: '"use strict"\nmodule.exports = "foo"\n',
+ mode: '100644',
+ },
+ 'b/foo.js': {
+ content: '"use strict"\nmodule.exports = "foobar"\n',
+ mode: '100644',
+ },
+ 'a/lib/bar.js': {
+ content: '"use strict"\nmodule.exports = "bar"\n',
+ mode: '100644',
+ },
+ 'b/lib/bar.js': {
+ content: '"use strict"\nmodule.exports = "bar"\n',
+ mode: '100644',
+ },
+ 'a/lib/utils.js': {
+ content: '"use strict"\nconst bar = require("./bar.js")\n'
+ + 'module.exports = () => bar\n',
+ mode: '100644',
+ },
+ 'b/lib/utils.js': {
+ content: '"use strict"\nconst bar = require("./bar.js")\n'
+ + 'module.exports =\n () => bar + "util"\n',
+ mode: '100644',
+ },
+ }))
+ const versions = {
+ a: '1.0.0',
+ b: '2.0.0',
+ }
+
+ t.matchSnapshot(
+ formatDiff({
+ files,
+ refs,
+ versions,
+ opts: {
+ diffNameOnly: true,
+ },
+ }),
+ 'should output expected diff result'
+ )
+ t.end()
+})
+
+t.test('respect --tag-version-prefix option', t => {
+ const files = new Set([
+ 'foo.js',
+ ])
+ const refs = new Map(Object.entries({
+ 'a/foo.js': {
+ content: '"use strict"\nmodule.exports = "foo"\n',
+ mode: '100644',
+ },
+ 'b/foo.js': {
+ content: '"use strict"\nmodule.exports = "foobar"\n',
+ mode: '100644',
+ },
+ }))
+ const versions = {
+ a: '1.0.0',
+ b: '2.0.0',
+ }
+
+ t.matchSnapshot(
+ formatDiff({
+ files,
+ refs,
+ versions,
+ opts: {
+ tagVersionPrefix: 'b',
+ },
+ }),
+ 'should output expected diff result'
+ )
+ t.end()
+})
+
+t.test('diff options', t => {
+ const files = new Set([
+ 'foo.js',
+ ])
+ const refs = new Map(Object.entries({
+ 'a/foo.js': {
+ content: '"use strict"\nconst a = "a"\nconst b = "b"\n'
+ + 'const c = "c"\nmodule.exports = () => a+\nb+\nc\n',
+ mode: '100644',
+ },
+ 'b/foo.js': {
+ content: '"use strict"\nconst a = "a"\n const b = "b"\n'
+ + ' const c = "c"\n const d = "d"\n'
+ + 'module.exports = () => a+\nb+\nc+\nd\n',
+ mode: '100644',
+ },
+ }))
+ const versions = {
+ a: '1.0.0',
+ b: '2.0.0',
+ }
+
+ t.matchSnapshot(
+ formatDiff({
+ files,
+ refs,
+ versions,
+ opts: {
+ diffUnified: 1,
+ diffIgnoreAllSpace: true,
+ diffSrcPrefix: 'before/',
+ diffDstPrefix: 'after/',
+ },
+ }),
+ 'should output expected diff result'
+ )
+ t.end()
+})
+
+t.test('diffUnified=0', t => {
+ const files = new Set([
+ 'foo.js',
+ ])
+ const refs = new Map(Object.entries({
+ 'a/foo.js': {
+ content: '"use strict"\nconst a = "a"\nconst b = "b"\n'
+ + 'const c = "c"\nmodule.exports = () => a+\nb+\nc\n',
+ mode: '100644',
+ },
+ 'b/foo.js': {
+ content: '"use strict"\nconst a = "a"\n const b = "b"\n'
+ + ' const c = "c"\n const d = "d"\n'
+ + 'module.exports = () => a+\nb+\nc+\nd\n',
+ mode: '100644',
+ },
+ }))
+ const versions = {
+ a: '1.0.0',
+ b: '2.0.0',
+ }
+
+ t.matchSnapshot(
+ formatDiff({
+ files,
+ refs,
+ versions,
+ opts: {
+ diffUnified: 0,
+ },
+ }),
+ 'should output no context lines in output'
+ )
+ t.end()
+})
+
+t.test('noPrefix', t => {
+ const files = new Set([
+ 'foo.js',
+ ])
+ const refs = new Map(Object.entries({
+ 'a/foo.js': {
+ content: '"use strict"\nmodule.exports = "foo"\n',
+ mode: '100644',
+ },
+ 'b/foo.js': {
+ content: '"use strict"\nmodule.exports = "foobar"\n',
+ mode: '100644',
+ },
+ }))
+ const versions = {
+ a: '1.0.0',
+ b: '2.0.0',
+ }
+
+ t.matchSnapshot(
+ formatDiff({
+ files,
+ refs,
+ versions,
+ opts: {
+ diffNoPrefix: true,
+ },
+ }),
+ 'should output result with no prefixes'
+ )
+ t.end()
+})
+
+t.test('format multiple files patch', t => {
+ const files = new Set([
+ 'foo.js',
+ 'lib/bar.js',
+ 'lib/utils.js',
+ ])
+ const refs = new Map(Object.entries({
+ 'a/foo.js': {
+ content: '"use strict"\nmodule.exports = "foo"\n',
+ mode: '100644',
+ },
+ 'b/foo.js': {
+ content: '"use strict"\nmodule.exports = "foobar"\n',
+ mode: '100644',
+ },
+ 'a/lib/bar.js': {
+ content: '"use strict"\nmodule.exports = "bar"\n',
+ mode: '100644',
+ },
+ 'b/lib/bar.js': {
+ content: '"use strict"\nmodule.exports = "bar"\n',
+ mode: '100644',
+ },
+ 'a/lib/utils.js': {
+ content: '"use strict"\nconst bar = require("./bar.js")\n'
+ + 'module.exports = () => bar\n',
+ mode: '100644',
+ },
+ 'b/lib/utils.js': {
+ content: '"use strict"\nconst bar = require("./bar.js")\n'
+ + 'module.exports =\n () => bar + "util"\n',
+ mode: '100644',
+ },
+ }))
+ const versions = {
+ a: '1.0.0',
+ b: '1.1.1',
+ }
+
+ t.matchSnapshot(
+ formatDiff({
+ files,
+ refs,
+ versions,
+ }),
+ 'should output expected result for multiple files'
+ )
+ t.end()
+})
diff --git a/packages/libnpmdiff/test/index.js b/packages/libnpmdiff/test/index.js
new file mode 100644
index 000000000..88b474c11
--- /dev/null
+++ b/packages/libnpmdiff/test/index.js
@@ -0,0 +1,147 @@
+const { resolve } = require('path')
+
+const t = require('tap')
+
+const diff = require('../index.js')
+
+const normalizePath = p => p
+ .replace(/\\+/g, '/')
+ .replace(/\r\n/g, '\n')
+
+t.cleanSnapshot = (str) => normalizePath(str)
+ .replace(normalizePath(process.execPath), 'node')
+
+const json = (obj) => `${JSON.stringify(obj, null, 2)}\n`
+
+t.test('compare two diff specs', async t => {
+ const path = t.testdir({
+ a1: {
+ 'package.json': json({
+ name: 'a',
+ version: '1.0.0',
+ }),
+ 'index.js': 'module.exports =\n "a1"\n',
+ },
+ a2: {
+ 'package.json': json({
+ name: 'a',
+ version: '2.0.0',
+ }),
+ 'index.js': 'module.exports =\n "a2"\n',
+ },
+ })
+
+ const a = `file:${resolve(path, 'a1')}`
+ const b = `file:${resolve(path, 'a2')}`
+
+ t.resolveMatchSnapshot(diff([a, b], {}), 'should output expected diff')
+})
+
+t.test('using single arg', async t => {
+ await t.rejects(
+ diff(['abbrev@1.0.3']),
+ /libnpmdiff needs two arguments to compare/,
+ 'should throw EDIFFARGS error'
+ )
+})
+
+t.test('too many args', async t => {
+ const args = ['abbrev@1.0.3', 'abbrev@1.0.4', 'abbrev@1.0.5']
+ await t.rejects(
+ diff(args),
+ /libnpmdiff needs two arguments to compare/,
+ 'should output diff against cwd files'
+ )
+})
+
+t.test('folder in node_modules', async t => {
+ const path = t.testdir({
+ node_modules: {
+ a: {
+ 'package.json': json({
+ name: 'a',
+ version: '1.0.0',
+ scripts: {
+ prepare: `${process.execPath} prepare.js`,
+ },
+ }),
+ 'prepare.js': 'throw new Error("ERR")',
+ node_modules: {
+ b: {
+ 'package.json': json({
+ name: 'b',
+ version: '2.0.0',
+ scripts: {
+ prepare: `${process.execPath} prepare.js`,
+ },
+ }),
+ 'prepare.js': 'throw new Error("ERR")',
+ },
+ },
+ },
+ },
+ packages: {
+ a: {
+ 'package.json': json({
+ name: 'a',
+ version: '1.0.1',
+ scripts: {
+ prepare: `${process.execPath} prepare.js`,
+ },
+ }),
+ 'prepare.js': '',
+ },
+ b: {
+ 'package.json': json({
+ name: 'b',
+ version: '2.0.1',
+ scripts: {
+ prepare: `${process.execPath} prepare.js`,
+ },
+ }),
+ 'prepare.js': '',
+ },
+ },
+ 'package.json': json({
+ name: 'my-project',
+ version: '1.0.0',
+ }),
+ })
+
+ t.test('top-level, absolute path', async t => {
+ t.resolveMatchSnapshot(diff([
+ `file:${resolve(path, 'node_modules/a')}`,
+ `file:${resolve(path, 'packages/a')}`,
+ ], { where: path }), 'should output expected diff')
+ })
+ t.test('top-level, relative path', async t => {
+ const _cwd = process.cwd()
+ process.chdir(path)
+ t.teardown(() => {
+ process.chdir(_cwd)
+ })
+
+ t.resolveMatchSnapshot(diff([
+ 'file:./node_modules/a',
+ 'file:./packages/a',
+ ], { where: path }), 'should output expected diff')
+ })
+ t.test('nested, absolute path', async t => {
+ t.resolveMatchSnapshot(diff([
+ `file:${resolve(path, 'node_modules/a/node_modules/b')}`,
+ `file:${resolve(path, 'packages/b')}`,
+ ], { where: path}), 'should output expected diff')
+ })
+ t.test('nested, relative path', async t => {
+ const _cwd = process.cwd()
+ process.chdir(path)
+ t.teardown(() => {
+ process.chdir(_cwd)
+ })
+
+ t.resolveMatchSnapshot(diff([
+ 'file:./node_modules/a/node_modules/b',
+ 'file:./packages/b',
+ ], { where: path }), 'should output expected diff')
+ })
+})
diff --git a/packages/libnpmdiff/test/should-print-patch.js b/packages/libnpmdiff/test/should-print-patch.js
new file mode 100644
index 000000000..97b15787d
--- /dev/null
+++ b/packages/libnpmdiff/test/should-print-patch.js
@@ -0,0 +1,28 @@
+const t = require('tap')
+const shouldPrintPatch = require('../lib/should-print-patch.js')
+
+t.test('valid filenames', t => {
+ t.ok(shouldPrintPatch('LICENSE'))
+ t.ok(shouldPrintPatch('.gitignore'))
+ t.ok(shouldPrintPatch('foo.md'))
+ t.ok(shouldPrintPatch('./bar.txt'))
+ t.ok(shouldPrintPatch('/a/b/c/bar.html'))
+ t.end()
+})
+
+t.test('invalid filenames', t => {
+ t.notOk(shouldPrintPatch('foo.exe'))
+ t.notOk(shouldPrintPatch('./foo.jpg'))
+ t.notOk(shouldPrintPatch('/a/b/c/bar.bin'))
+ t.end()
+})
+
+t.test('using --text/-a option', t => {
+ const opts = {
+ diffText: true,
+ }
+ t.ok(shouldPrintPatch('foo.exe', opts))
+ t.ok(shouldPrintPatch('./foo.jpg', opts))
+ t.ok(shouldPrintPatch('/a/b/c/bar.bin', opts))
+ t.end()
+})
diff --git a/packages/libnpmdiff/test/tarball.js b/packages/libnpmdiff/test/tarball.js
new file mode 100644
index 000000000..3a959be6e
--- /dev/null
+++ b/packages/libnpmdiff/test/tarball.js
@@ -0,0 +1,96 @@
+const { resolve } = require('path')
+
+const t = require('tap')
+const tar = require('tar')
+const pacote = require('pacote')
+pacote.tarball = () => {
+ throw new Error('Failed to detect node_modules tarball')
+}
+
+const tarball = require('../lib/tarball.js')
+
+const json = (obj) => `${JSON.stringify(obj, null, 2)}\n`
+
+t.test('returns a tarball from node_modules', t => {
+ t.plan(2)
+
+ const path = t.testdir({
+ node_modules: {
+ a: {
+ 'package.json': json({
+ name: 'a',
+ version: '1.0.0',
+ bin: { a: 'index.js' },
+ }),
+ 'index.js': '',
+ },
+ },
+ })
+
+ const _cwd = process.cwd()
+ process.chdir(path)
+ t.teardown(() => {
+ process.chdir(_cwd)
+ })
+
+ tarball({ bin: { a: 'index.js' }, _resolved: resolve(path, 'node_modules/a') }, { where: path })
+ .then(res => {
+ tar.list({
+ filter: path => {
+ t.match(
+ path,
+ /package.json|index.js/,
+ 'should return tarball with expected files'
+ )
+ },
+ })
+ .on('error', e => {
+ throw e
+ })
+ .end(res)
+ })
+})
+
+t.test('node_modules folder within a linked dir', async t => {
+ const path = t.testdir({
+ node_modules: {
+ a: t.fixture('symlink', '../packages/a'),
+ },
+ packages: {
+ a: {
+ node_modules: {
+ b: {
+ 'package.json': json({
+ name: 'a',
+ version: '1.0.0',
+ }),
+ },
+ },
+ },
+ },
+ })
+
+ const link = await tarball({ _resolved: resolve(path, 'node_modules/a/node_modules/b') }, {})
+ t.ok(link, 'should retrieve tarball from reading link')
+
+ const target = await tarball({ _resolved: resolve(path, 'packages/a/node_modules/b') }, {})
+ t.ok(target, 'should retrieve tarball from reading target')
+})
+
+t.test('pkg not in a node_modules folder', async t => {
+ const path = t.testdir({
+ packages: {
+ a: {
+ 'package.json': json({
+ name: 'a',
+ version: '1.0.0',
+ }),
+ },
+ },
+ })
+
+ t.throws(
+ () => tarball({ _resolved: resolve(path, 'packages/a') }, {}),
+ 'should call regular pacote.tarball method instead'
+ )
+})
diff --git a/packages/libnpmdiff/test/untar.js b/packages/libnpmdiff/test/untar.js
new file mode 100644
index 000000000..62be1c6ba
--- /dev/null
+++ b/packages/libnpmdiff/test/untar.js
@@ -0,0 +1,231 @@
+const { resolve } = require('path')
+const t = require('tap')
+const pacote = require('pacote')
+const untar = require('../lib/untar.js')
+
+t.test('untar simple package', async t => {
+ const item =
+ await pacote.tarball(resolve('./test/fixtures/simple-output-2.2.1.tgz'))
+
+ const {
+ files,
+ refs,
+ } = await untar({
+ item,
+ prefix: 'a/',
+ })
+
+ t.matchSnapshot([...files].join('\n'), 'should return list of filenames')
+ t.matchSnapshot(
+ [...refs.entries()].map(([k, v]) => `${k}: ${!!v}`).join('\n'),
+ 'should return map of filenames to its contents'
+ )
+ t.matchSnapshot(refs.get('a/LICENSE').content, 'should have read contents')
+})
+
+t.test('untar package with folders', async t => {
+ const item =
+ await pacote.tarball(resolve('./test/fixtures/archive.tgz'))
+
+ const {
+ files,
+ refs,
+ } = await untar({
+ item,
+ prefix: 'a/',
+ })
+
+ t.matchSnapshot([...files].join('\n'), 'should return list of filenames')
+ t.matchSnapshot(
+ [...refs.entries()].map(([k, v]) => `${k}: ${!!v}`).join('\n'),
+ 'should return map of filenames to its contents'
+ )
+ t.matchSnapshot(
+ refs.get('a/lib/utils/b.js').content,
+ 'should have read contents'
+ )
+})
+
+t.test('filter files', async t => {
+ const item =
+ await pacote.tarball(resolve('./test/fixtures/simple-output-2.2.1.tgz'))
+
+ const {
+ files,
+ refs,
+ } = await untar({
+ item,
+ prefix: 'a/',
+ }, {
+ diffFiles: [
+ './LICENSE',
+ 'missing-file',
+ 'README.md',
+ ],
+ })
+
+ t.matchSnapshot([...files].join('\n'), 'should return list of filenames')
+ t.matchSnapshot(
+ [...refs.entries()].map(([k, v]) => `${k}: ${!!v.content}`).join('\n'),
+ 'should return map of filenames with valid contents'
+ )
+})
+
+t.test('filter files using glob expressions', async t => {
+ const item =
+ await pacote.tarball(resolve('./test/fixtures/archive.tgz'))
+ const cwd = t.testdir({
+ lib: {
+ 'index.js': '',
+ utils: {
+ '/b.js': '',
+ },
+ },
+ 'package-lock.json': '',
+ 'package.json': '',
+ test: {
+ '/index.js': '',
+ utils: {
+ 'b.js': '',
+ },
+ },
+ })
+
+ const _cwd = process.cwd()
+ process.chdir(cwd)
+ t.teardown(() => {
+ process.chdir(_cwd)
+ })
+
+ const {
+ files,
+ refs,
+ } = await untar({
+ item,
+ prefix: 'a/',
+ }, {
+ diffFiles: [
+ './lib/**',
+ '*-lock.json',
+ 'test\\*', // windows-style sep should be normalized
+ ],
+ })
+
+ t.matchSnapshot([...files].join('\n'), 'should return list of filenames')
+ t.matchSnapshot(
+ [...refs.entries()].map(([k, v]) => `${k}: ${!!v.content}`).join('\n'),
+ 'should return map of filenames with valid contents'
+ )
+})
+
+t.test('match files by end of filename', async t => {
+ const item =
+ await pacote.tarball(resolve('./test/fixtures/archive.tgz'))
+
+ const {
+ files,
+ refs,
+ } = await untar({
+ item,
+ prefix: 'a/',
+ }, {
+ diffFiles: [
+ '*.js',
+ ],
+ })
+
+ t.matchSnapshot([...files].join('\n'), 'should return list of filenames')
+ t.matchSnapshot(
+ [...refs.entries()].map(([k, v]) => `${k}: ${!!v.content}`).join('\n'),
+ 'should return map of filenames with valid contents'
+ )
+})
+
+t.test('filter files by exact filename', async t => {
+ const item =
+ await pacote.tarball(resolve('./test/fixtures/archive.tgz'))
+
+ const {
+ files,
+ refs,
+ } = await untar({
+ item,
+ prefix: 'a/',
+ }, {
+ diffFiles: [
+ 'index.js',
+ ],
+ })
+
+ t.matchSnapshot([...files].join('\n'), 'should return no filenames')
+ t.matchSnapshot(
+ [...refs.entries()].map(([k, v]) => `${k}: ${!!v.content}`).join('\n'),
+ 'should return no filenames'
+ )
+})
+
+t.test('match files by simple folder name', async t => {
+ const item =
+ await pacote.tarball(resolve('./test/fixtures/archive.tgz'))
+
+ const {
+ files,
+ refs,
+ } = await untar({
+ item,
+ prefix: 'a/',
+ }, {
+ diffFiles: [
+ 'lib',
+ ],
+ })
+
+ t.matchSnapshot([...files].join('\n'), 'should return list of filenames')
+ t.matchSnapshot(
+ [...refs.entries()].map(([k, v]) => `${k}: ${!!v.content}`).join('\n'),
+ 'should return map of filenames with valid contents'
+ )
+})
+
+t.test('match files by simple folder name variation', async t => {
+ const item =
+ await pacote.tarball(resolve('./test/fixtures/archive.tgz'))
+
+ const {
+ files,
+ refs,
+ } = await untar({
+ item,
+ prefix: 'a/',
+ }, {
+ diffFiles: [
+ './test/',
+ ],
+ })
+
+ t.matchSnapshot([...files].join('\n'), 'should return list of filenames')
+ t.matchSnapshot(
+ [...refs.entries()].map(([k, v]) => `${k}: ${!!v.content}`).join('\n'),
+ 'should return map of filenames with valid contents'
+ )
+})
+
+t.test('filter out all files', async t => {
+ const item =
+ await pacote.tarball(resolve('./test/fixtures/simple-output-2.2.1.tgz'))
+
+ const {
+ files,
+ refs,
+ } = await untar({
+ item,
+ prefix: 'a/',
+ }, {
+ diffFiles: [
+ 'non-matching-pattern',
+ ],
+ })
+
+ t.equal(files.size, 0, 'should have no files')
+ t.equal(refs.size, 0, 'should have no refs')
+})
diff --git a/scripts/bundle-and-gitignore-deps.js b/scripts/bundle-and-gitignore-deps.js
index 84a3ab3ad..407b9e598 100644
--- a/scripts/bundle-and-gitignore-deps.js
+++ b/scripts/bundle-and-gitignore-deps.js
@@ -10,7 +10,10 @@ const shouldIgnore = []
arb.loadVirtual().then(tree => {
for (const node of tree.children.values()) {
- if (node.dev || node.isLink) {
+ const has = (obj, key) => Object.prototype.hasOwnProperty.call(obj, key)
+ const nonProdWorkspace =
+ node.isWorkspace && !(has(tree.package.dependencies, node.name))
+ if (node.dev || nonProdWorkspace) {
console.error('ignore', node.name)
shouldIgnore.push(node.name)
} else if (tree.edgesOut.has(node.name)) {