Compare commits

...

7 Commits

Author SHA1 Message Date
Juan Picado
079faf23ca chore: update versions (6-next) (#3581)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-01-31 08:11:07 +01:00
dependabot[bot]
deec651a7f chore(deps): bump actions/github-script from 6.3.3 to 6.4.0 (#3583)
Bumps [actions/github-script](https://github.com/actions/github-script) from 6.3.3 to 6.4.0.
- [Release notes](https://github.com/actions/github-script/releases)
- [Commits](d556feaca3...98814c53be)

---
updated-dependencies:
- dependency-name: actions/github-script
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-01-31 08:04:46 +01:00
renovate[bot]
7f9db75ff7 fix(deps): update all linting dependencies (#3582)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-01-31 08:04:31 +01:00
verdacciobot
dc2a373bd8 chore: updated static data 2023-01-30 00:12:56 +00:00
Juan Picado
f61747543c chore: update version website 2023-01-29 16:52:37 +01:00
Juan Picado
a1986e098d feat: expose middleware utils (#3580)
* feat: expose middleware utils

* feat: expose middleware utils

* Update antiLoop.ts

* Update e2e-ci.yml
2023-01-29 15:08:50 +01:00
dependabot[bot]
6c3539ca28 chore(deps): bump github/codeql-action from 2.1.38 to 2.2.1 (#3578)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2.1.38 to 2.2.1.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](515828d974...3ebbd71c74)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-01-28 12:54:55 +01:00
98 changed files with 2226 additions and 1402 deletions

View File

@@ -0,0 +1,8 @@
---
'@verdaccio/api': minor
'@verdaccio/middleware': minor
'@verdaccio/utils': minor
'@verdaccio/web': minor
---
feat: expose middleware utils

View File

@@ -60,6 +60,7 @@
"afraid-mice-obey",
"angry-nails-appear",
"big-lobsters-sin",
"big-years-repair",
"brave-seahorses-press",
"bright-poems-obey",
"brown-cycles-laugh",

View File

@@ -34,7 +34,7 @@ jobs:
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@515828d97454b8354517688ddc5b48402b723750 # tag=v2
uses: github/codeql-action/init@3ebbd71c74ef574dbc558c82f70e52732c8b44fe # tag=v2
# Override language selection by uncommenting this and choosing your languages
# with:
@@ -42,7 +42,7 @@ jobs:
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@515828d97454b8354517688ddc5b48402b723750 # tag=v2
uses: github/codeql-action/autobuild@3ebbd71c74ef574dbc558c82f70e52732c8b44fe # tag=v2
# Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
@@ -56,4 +56,4 @@ jobs:
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@515828d97454b8354517688ddc5b48402b723750 # tag=v2
uses: github/codeql-action/analyze@3ebbd71c74ef574dbc558c82f70e52732c8b44fe # tag=v2

View File

@@ -75,14 +75,15 @@ jobs:
strategy:
fail-fast: false
matrix:
pkg: [npm6, npm7, npm8, npm9, pnpm6, pnpm7, yarn1, yarn2, yarn3, yarn4]
name: ${{ matrix.pkg }} / ${{ matrix.os }}
pkg: [npm6, npm7, npm8, npm9, pnpm6, pnpm7, yarn1, yarn2, yarn3, yarn4]
node: [16, 18, 19]
name: ${{ matrix.pkg }}/ ubuntu-latest / ${{ matrix.node }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # tag=v3
- uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # tag=v3
with:
node-version-file: '.nvmrc'
node-version: ${{ matrix.node }}
- name: Install pnpm
run: npm i pnpm@6.32.15 -g
- uses: actions/cache@58c146cc91c5b9e778e71775dfe9bf1442ad9a12 # v3

View File

@@ -109,7 +109,7 @@ jobs:
- name: Format lighthouse score
id: format_lighthouse_score
uses: actions/github-script@d556feaca394842dc55e4734bf3bb9f685482fa0 # tag=v6
uses: actions/github-script@98814c53be79b1d30f795b907e553d8679345975 # tag=v6
with:
github-token: ${{secrets.GITHUB_TOKEN}}
script: |

View File

@@ -5,9 +5,9 @@
"main": "./build/index.js",
"types": "./build/index.d.ts",
"devDependencies": {
"verdaccio": "workspace:6.0.0-6-next.55",
"@verdaccio/core": "workspace:6.0.0-6-next.55",
"@verdaccio/config": "workspace:6.0.0-6-next.55",
"verdaccio": "workspace:6.0.0-6-next.56",
"@verdaccio/core": "workspace:6.0.0-6-next.56",
"@verdaccio/config": "workspace:6.0.0-6-next.56",
"@verdaccio/types": "workspace:11.0.0-6-next.19",
"yaml": "2.2.0",
"debug": "4.3.4",

View File

@@ -3,9 +3,9 @@
"name": "@verdaccio/e2e-ui",
"version": "2.0.0-6-next.3",
"devDependencies": {
"verdaccio": "workspace:6.0.0-6-next.55",
"@verdaccio/core": "workspace:6.0.0-6-next.55",
"@verdaccio/config": "workspace:6.0.0-6-next.55",
"verdaccio": "workspace:6.0.0-6-next.56",
"@verdaccio/core": "workspace:6.0.0-6-next.56",
"@verdaccio/config": "workspace:6.0.0-6-next.56",
"@verdaccio/test-helper": "workspace:2.0.0-6-next.6",
"debug": "4.3.4",
"cypress": "11.2.0"

View File

@@ -73,8 +73,8 @@
"@types/react-dom": "18.0.9",
"@types/react-router-dom": "5.3.3",
"@types/react-virtualized": "9.21.21",
"@typescript-eslint/eslint-plugin": "5.47.0",
"@typescript-eslint/parser": "5.47.0",
"@typescript-eslint/eslint-plugin": "5.49.0",
"@typescript-eslint/parser": "5.49.0",
"@verdaccio/crowdin-translations": "workspace:*",
"@verdaccio/eslint-config": "workspace:*",
"@verdaccio/types": "workspace:*",
@@ -90,7 +90,7 @@
"debug": "4.3.4",
"detect-secrets": "1.0.6",
"jest-diff": "29.3.1",
"eslint": "8.30.0",
"eslint": "8.33.0",
"fs-extra": "10.1.0",
"husky": "7.0.4",
"in-publish": "2.0.1",
@@ -105,7 +105,7 @@
"nock": "13.2.9",
"nodemon": "2.0.20",
"npm-run-all": "4.1.5",
"prettier": "2.8.1",
"prettier": "2.8.3",
"rimraf": "3.0.2",
"selfsigned": "1.10.14",
"supertest": "6.3.3",

View File

@@ -1,5 +1,22 @@
# @verdaccio/api
## 6.0.0-6-next.39
### Minor Changes
- a1986e09: feat: expose middleware utils
### Patch Changes
- Updated dependencies [a1986e09]
- @verdaccio/middleware@6.0.0-6-next.35
- @verdaccio/utils@6.0.0-6-next.24
- @verdaccio/auth@6.0.0-6-next.35
- @verdaccio/config@6.0.0-6-next.56
- @verdaccio/store@6.0.0-6-next.36
- @verdaccio/core@6.0.0-6-next.56
- @verdaccio/logger@6.0.0-6-next.24
## 6.0.0-6-next.38
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/api",
"version": "6.0.0-6-next.38",
"version": "6.0.0-6-next.39",
"description": "loaders logic",
"main": "./build/index.js",
"types": "build/index.d.ts",
@@ -39,13 +39,13 @@
},
"license": "MIT",
"dependencies": {
"@verdaccio/auth": "workspace:6.0.0-6-next.34",
"@verdaccio/config": "workspace:6.0.0-6-next.55",
"@verdaccio/core": "workspace:6.0.0-6-next.55",
"@verdaccio/logger": "workspace:6.0.0-6-next.23",
"@verdaccio/middleware": "workspace:6.0.0-6-next.34",
"@verdaccio/store": "workspace:6.0.0-6-next.35",
"@verdaccio/utils": "workspace:6.0.0-6-next.23",
"@verdaccio/auth": "workspace:6.0.0-6-next.35",
"@verdaccio/config": "workspace:6.0.0-6-next.56",
"@verdaccio/core": "workspace:6.0.0-6-next.56",
"@verdaccio/logger": "workspace:6.0.0-6-next.24",
"@verdaccio/middleware": "workspace:6.0.0-6-next.35",
"@verdaccio/store": "workspace:6.0.0-6-next.36",
"@verdaccio/utils": "workspace:6.0.0-6-next.24",
"abortcontroller-polyfill": "1.7.5",
"cookies": "0.8.0",
"debug": "4.3.4",
@@ -57,7 +57,7 @@
},
"devDependencies": {
"@types/node": "16.18.10",
"@verdaccio/server": "workspace:6.0.0-6-next.44",
"@verdaccio/server": "workspace:6.0.0-6-next.45",
"@verdaccio/types": "workspace:11.0.0-6-next.19",
"@verdaccio/test-helper": "workspace:2.0.0-6-next.6",
"supertest": "6.3.3",

View File

@@ -42,7 +42,6 @@ export default function (config: Config, auth: Auth, storage: Storage): Router {
// TODO: For some reason? what reason?
app.param('_rev', match(/^-rev$/));
app.param('org_couchdb_user', match(/^org\.couchdb\.user:/));
app.param('anything', match(/.*/));
app.use(auth.apiJWTmiddleware());
app.use(bodyParser.json({ strict: false, limit: config.max_body_size || '10mb' }));
// @ts-ignore

View File

@@ -1,5 +1,17 @@
# @verdaccio/auth
## 6.0.0-6-next.35
### Patch Changes
- Updated dependencies [a1986e09]
- @verdaccio/utils@6.0.0-6-next.24
- @verdaccio/config@6.0.0-6-next.56
- @verdaccio/loaders@6.0.0-6-next.25
- verdaccio-htpasswd@11.0.0-6-next.26
- @verdaccio/core@6.0.0-6-next.56
- @verdaccio/logger@6.0.0-6-next.24
## 6.0.0-6-next.34
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/auth",
"version": "6.0.0-6-next.34",
"version": "6.0.0-6-next.35",
"description": "logger",
"main": "./build/index.js",
"types": "./build/index.d.ts",
@@ -39,16 +39,16 @@
},
"license": "MIT",
"dependencies": {
"@verdaccio/core": "workspace:6.0.0-6-next.55",
"@verdaccio/config": "workspace:6.0.0-6-next.55",
"@verdaccio/loaders": "workspace:6.0.0-6-next.24",
"@verdaccio/logger": "workspace:6.0.0-6-next.23",
"@verdaccio/utils": "workspace:6.0.0-6-next.23",
"@verdaccio/core": "workspace:6.0.0-6-next.56",
"@verdaccio/config": "workspace:6.0.0-6-next.56",
"@verdaccio/loaders": "workspace:6.0.0-6-next.25",
"@verdaccio/logger": "workspace:6.0.0-6-next.24",
"@verdaccio/utils": "workspace:6.0.0-6-next.24",
"debug": "4.3.4",
"express": "4.18.2",
"jsonwebtoken": "9.0.0",
"lodash": "4.17.21",
"verdaccio-htpasswd": "workspace:11.0.0-6-next.25"
"verdaccio-htpasswd": "workspace:11.0.0-6-next.26"
},
"devDependencies": {
"@verdaccio/types": "workspace:11.0.0-6-next.19"

View File

@@ -1,5 +1,14 @@
# @verdaccio/cli
## 6.0.0-6-next.56
### Patch Changes
- @verdaccio/config@6.0.0-6-next.56
- @verdaccio/node-api@6.0.0-6-next.56
- @verdaccio/core@6.0.0-6-next.56
- @verdaccio/logger@6.0.0-6-next.24
## 6.0.0-6-next.55
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/cli",
"version": "6.0.0-6-next.55",
"version": "6.0.0-6-next.56",
"author": {
"name": "Juan Picado",
"email": "juanpicado19@gmail.com"
@@ -44,10 +44,10 @@
"start": "ts-node src/index.ts"
},
"dependencies": {
"@verdaccio/core": "workspace:6.0.0-6-next.55",
"@verdaccio/config": "workspace:6.0.0-6-next.55",
"@verdaccio/logger": "workspace:6.0.0-6-next.23",
"@verdaccio/node-api": "workspace:6.0.0-6-next.55",
"@verdaccio/core": "workspace:6.0.0-6-next.56",
"@verdaccio/config": "workspace:6.0.0-6-next.56",
"@verdaccio/logger": "workspace:6.0.0-6-next.24",
"@verdaccio/node-api": "workspace:6.0.0-6-next.56",
"clipanion": "3.1.0",
"envinfo": "7.8.1",
"kleur": "3.0.3",

View File

@@ -1,5 +1,13 @@
# @verdaccio/config
## 6.0.0-6-next.56
### Patch Changes
- Updated dependencies [a1986e09]
- @verdaccio/utils@6.0.0-6-next.24
- @verdaccio/core@6.0.0-6-next.56
## 6.0.0-6-next.55
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/config",
"version": "6.0.0-6-next.55",
"version": "6.0.0-6-next.56",
"description": "logger",
"main": "./build/index.js",
"types": "build/index.d.ts",
@@ -38,8 +38,8 @@
"build": "pnpm run build:js && pnpm run build:types"
},
"dependencies": {
"@verdaccio/core": "workspace:6.0.0-6-next.55",
"@verdaccio/utils": "workspace:6.0.0-6-next.23",
"@verdaccio/core": "workspace:6.0.0-6-next.56",
"@verdaccio/utils": "workspace:6.0.0-6-next.24",
"debug": "4.3.4",
"yaml": "2.2.0",
"lodash": "4.17.21",

View File

@@ -1,5 +1,7 @@
# @verdaccio/core
## 6.0.0-6-next.56
## 6.0.0-6-next.55
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/core",
"version": "6.0.0-6-next.55",
"version": "6.0.0-6-next.56",
"description": "core utilities",
"keywords": [
"private",

View File

@@ -1,5 +1,14 @@
# Change Log
## 11.0.0-6-next.25
### Patch Changes
- Updated dependencies [a1986e09]
- @verdaccio/utils@6.0.0-6-next.24
- @verdaccio/core@6.0.0-6-next.56
- @verdaccio/url@11.0.0-6-next.22
## 11.0.0-6-next.24
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/tarball",
"version": "11.0.0-6-next.24",
"version": "11.0.0-6-next.25",
"description": "tarball utilities resolver",
"keywords": [
"private",
@@ -34,9 +34,9 @@
},
"dependencies": {
"debug": "4.3.4",
"@verdaccio/core": "workspace:6.0.0-6-next.55",
"@verdaccio/url": "workspace:11.0.0-6-next.21",
"@verdaccio/utils": "workspace:6.0.0-6-next.23",
"@verdaccio/core": "workspace:6.0.0-6-next.56",
"@verdaccio/url": "workspace:11.0.0-6-next.22",
"@verdaccio/utils": "workspace:6.0.0-6-next.24",
"lodash": "4.17.21"
},
"devDependencies": {

View File

@@ -1,5 +1,11 @@
# Change Log
## 11.0.0-6-next.22
### Patch Changes
- @verdaccio/core@6.0.0-6-next.56
## 11.0.0-6-next.21
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/url",
"version": "11.0.0-6-next.21",
"version": "11.0.0-6-next.22",
"description": "url utilities resolver",
"keywords": [
"private",
@@ -33,7 +33,7 @@
"access": "public"
},
"dependencies": {
"@verdaccio/core": "workspace:6.0.0-6-next.55",
"@verdaccio/core": "workspace:6.0.0-6-next.56",
"debug": "4.3.4",
"lodash": "4.17.21",
"validator": "13.7.0"

View File

@@ -1,5 +1,12 @@
# @verdaccio/hooks
## 6.0.0-6-next.26
### Patch Changes
- @verdaccio/core@6.0.0-6-next.56
- @verdaccio/logger@6.0.0-6-next.24
## 6.0.0-6-next.25
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/hooks",
"version": "6.0.0-6-next.25",
"version": "6.0.0-6-next.26",
"description": "loaders logic",
"main": "./build/index.js",
"types": "build/index.d.ts",
@@ -29,8 +29,8 @@
"node": ">=16"
},
"dependencies": {
"@verdaccio/core": "workspace:6.0.0-6-next.55",
"@verdaccio/logger": "workspace:6.0.0-6-next.23",
"@verdaccio/core": "workspace:6.0.0-6-next.56",
"@verdaccio/logger": "workspace:6.0.0-6-next.24",
"core-js": "3.27.0",
"debug": "4.3.4",
"handlebars": "4.7.7",
@@ -38,8 +38,8 @@
},
"devDependencies": {
"@types/node": "16.18.10",
"@verdaccio/auth": "workspace:6.0.0-6-next.34",
"@verdaccio/config": "workspace:6.0.0-6-next.55",
"@verdaccio/auth": "workspace:6.0.0-6-next.35",
"@verdaccio/config": "workspace:6.0.0-6-next.56",
"@verdaccio/types": "workspace:11.0.0-6-next.19"
},
"scripts": {

View File

@@ -1,5 +1,11 @@
# @verdaccio/loaders
## 6.0.0-6-next.25
### Patch Changes
- @verdaccio/logger@6.0.0-6-next.24
## 6.0.0-6-next.24
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/loaders",
"version": "6.0.0-6-next.24",
"version": "6.0.0-6-next.25",
"description": "loaders logic",
"main": "./build/index.js",
"types": "build/index.d.ts",
@@ -13,13 +13,13 @@
"url": "https://github.com/verdaccio/verdaccio"
},
"dependencies": {
"@verdaccio/logger": "workspace:6.0.0-6-next.23",
"@verdaccio/logger": "workspace:6.0.0-6-next.24",
"debug": "4.3.4",
"lodash": "4.17.21"
},
"devDependencies": {
"@verdaccio/core": "workspace:6.0.0-6-next.55",
"@verdaccio/config": "workspace:6.0.0-6-next.55",
"@verdaccio/core": "workspace:6.0.0-6-next.56",
"@verdaccio/config": "workspace:6.0.0-6-next.56",
"@verdaccio/types": "workspace:11.0.0-6-next.19",
"@verdaccio-scope/verdaccio-auth-foo": "0.0.2",
"verdaccio-auth-memory": "workspace:*",

View File

@@ -1,5 +1,11 @@
# @verdaccio/logger
## 6.0.0-6-next.24
### Patch Changes
- @verdaccio/core@6.0.0-6-next.56
## 6.0.0-6-next.23
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/logger",
"version": "6.0.0-6-next.23",
"version": "6.0.0-6-next.24",
"description": "logger",
"main": "./build/index.js",
"types": "./build/index.d.ts",
@@ -38,7 +38,7 @@
"build": "pnpm run build:js && pnpm run build:types"
},
"dependencies": {
"@verdaccio/core": "workspace:6.0.0-6-next.55",
"@verdaccio/core": "workspace:6.0.0-6-next.56",
"@verdaccio/logger-prettify": "workspace:6.0.0-6-next.8",
"debug": "4.3.4",
"colorette": "2.0.19",

View File

@@ -1,3 +1,14 @@
{
"extends": "../../.babelrc"
"extends": "../../.babelrc",
"presets": [
[
"@babel/env",
{
"targets": {
"node": 12
}
}
],
"@babel/typescript"
]
}

View File

@@ -1,5 +1,18 @@
# @verdaccio/middleware
## 6.0.0-6-next.35
### Minor Changes
- a1986e09: feat: expose middleware utils
### Patch Changes
- Updated dependencies [a1986e09]
- @verdaccio/utils@6.0.0-6-next.24
- @verdaccio/core@6.0.0-6-next.56
- @verdaccio/logger@6.0.0-6-next.24
## 6.0.0-6-next.34
### Patch Changes

View File

@@ -1,3 +1,12 @@
const config = require('../../jest/config');
module.exports = Object.assign({}, config, {});
module.exports = Object.assign({}, config, {
coverageThreshold: {
global: {
lines: 67,
functions: 80,
branches: 56,
statements: 67,
},
},
});

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/middleware",
"version": "6.0.0-6-next.34",
"version": "6.0.0-6-next.35",
"description": "loaders logic",
"main": "./build/index.js",
"types": "build/index.d.ts",
@@ -35,19 +35,23 @@
"build:types": "tsc --emitDeclarationOnly -p tsconfig.build.json",
"build:js": "babel src/ --out-dir build/ --copy-files --extensions \".ts,.tsx\" --source-maps",
"watch": "pnpm build:js -- --watch",
"test": "jest",
"build": "pnpm run build:js && pnpm run build:types"
},
"dependencies": {
"@verdaccio/core": "workspace:6.0.0-6-next.56",
"@verdaccio/logger": "workspace:6.0.0-6-next.24",
"@verdaccio/utils": "workspace:6.0.0-6-next.24",
"debug": "4.3.4",
"body-parser": "1.20.1",
"@verdaccio/auth": "workspace:6.0.0-6-next.34",
"@verdaccio/core": "workspace:6.0.0-6-next.55",
"@verdaccio/logger": "workspace:6.0.0-6-next.23",
"@verdaccio/utils": "workspace:6.0.0-6-next.23",
"lodash": "4.17.21"
"lodash": "4.17.21",
"mime": "2.6.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/verdaccio"
},
"devDependencies": {
"body-parser": "1.20.1",
"supertest": "6.3.3"
}
}

View File

@@ -1 +1,17 @@
export * from './middleware';
export { match } from './middlewares/match';
export { setSecurityWebHeaders } from './middlewares/security-headers';
export { validateName, validatePackage } from './middlewares/validation';
export { media } from './middlewares/media';
export { encodeScopePackage } from './middlewares/encode-pkg';
export { expectJson } from './middlewares/json';
export { antiLoop } from './middlewares/antiLoop';
export { final } from './middlewares/final';
export { allow } from './middlewares/allow';
export { errorReportingMiddleware, handleError } from './middlewares/error';
export {
log,
LOG_STATUS_MESSAGE,
LOG_VERDACCIO_BYTES,
LOG_VERDACCIO_ERROR,
} from './middlewares/log';
export * from './types';

View File

@@ -1,413 +0,0 @@
import buildDebug from 'debug';
import { NextFunction, Request, Response } from 'express';
import { HttpError } from 'http-errors';
import _ from 'lodash';
import { Auth } from '@verdaccio/auth';
import {
API_ERROR,
HEADERS,
HEADER_TYPE,
HTTP_STATUS,
TOKEN_BASIC,
TOKEN_BEARER,
VerdaccioError,
errorUtils,
} from '@verdaccio/core';
import { logger } from '@verdaccio/logger';
import { Config, Logger, Package, RemoteUser } from '@verdaccio/types';
import {
isObject,
stringToMD5,
validateName as utilValidateName,
validatePackage as utilValidatePackage,
} from '@verdaccio/utils';
import { getVersionFromTarball } from './middleware-utils';
export type $RequestExtend = Request & { remote_user?: RemoteUser; log: Logger };
export type $ResponseExtend = Response & { cookies?: any };
export type $NextFunctionVer = NextFunction & any;
const debug = buildDebug('verdaccio:middleware');
export function match(regexp: RegExp): any {
return function (
req: $RequestExtend,
res: $ResponseExtend,
next: $NextFunctionVer,
value: string
): void {
if (regexp.exec(value)) {
next();
} else {
next('route');
}
};
}
// TODO: remove, was relocated to web package
// @ts-deprecated
export function setSecurityWebHeaders(
req: $RequestExtend,
res: $ResponseExtend,
next: $NextFunctionVer
): void {
// disable loading in frames (clickjacking, etc.)
res.header(HEADERS.FRAMES_OPTIONS, 'deny');
// avoid stablish connections outside of domain
res.header(HEADERS.CSP, "connect-src 'self'");
// https://stackoverflow.com/questions/18337630/what-is-x-content-type-options-nosniff
res.header(HEADERS.CTO, 'nosniff');
// https://stackoverflow.com/questions/9090577/what-is-the-http-header-x-xss-protection
res.header(HEADERS.XSS, '1; mode=block');
next();
}
export function validateName(
req: $RequestExtend,
res: $ResponseExtend,
next: $NextFunctionVer,
value: string,
name: string
): void {
if (value === '-') {
// special case in couchdb usually
next('route');
} else if (utilValidateName(value)) {
next();
} else {
next(errorUtils.getForbidden('invalid ' + name));
}
}
export function validatePackage(
req: $RequestExtend,
res: $ResponseExtend,
next: $NextFunctionVer,
value: string,
name: string
): void {
if (value === '-') {
// special case in couchdb usually
next('route');
} else if (utilValidatePackage(value)) {
next();
} else {
next(errorUtils.getForbidden('invalid ' + name));
}
}
export function media(expect: string | null): any {
return function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer): void {
if (req.headers[HEADER_TYPE.CONTENT_TYPE] !== expect) {
next(
errorUtils.getCode(
HTTP_STATUS.UNSUPPORTED_MEDIA,
'wrong content-type, expect: ' + expect + ', got: ' + req.get[HEADER_TYPE.CONTENT_TYPE]
)
);
} else {
next();
}
};
}
export function encodeScopePackage(
req: $RequestExtend,
res: $ResponseExtend,
next: $NextFunctionVer
): void {
if (req.url.indexOf('@') !== -1) {
// e.g.: /@org/pkg/1.2.3 -> /@org%2Fpkg/1.2.3, /@org%2Fpkg/1.2.3 -> /@org%2Fpkg/1.2.3
req.url = req.url.replace(/^(\/@[^\/%]+)\/(?!$)/, '$1%2F');
}
next();
}
export function expectJson(
req: $RequestExtend,
res: $ResponseExtend,
next: $NextFunctionVer
): void {
if (!isObject(req.body)) {
return next(errorUtils.getBadRequest("can't parse incoming json"));
}
next();
}
export function antiLoop(config: Config): Function {
return function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer): void {
if (req?.headers?.via != null) {
const arr = req.headers.via.split(',');
for (let i = 0; i < arr.length; i++) {
const m = arr[i].match(/\s*(\S+)\s+(\S+)/);
if (m && m[2] === config.server_id) {
return next(errorUtils.getCode(HTTP_STATUS.LOOP_DETECTED, 'loop detected'));
}
}
}
next();
};
}
export function allow(auth: Auth): Function {
return function (action: string): Function {
return function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer): void {
req.pause();
const packageName = req.params.scope
? `@${req.params.scope}/${req.params.package}`
: req.params.package;
const packageVersion = req.params.filename
? getVersionFromTarball(req.params.filename)
: undefined;
const remote = req.remote_user;
logger.trace(
{ action, user: remote?.name },
`[middleware/allow][@{action}] allow for @{user}`
);
auth['allow_' + action](
{ packageName, packageVersion },
remote,
function (error, allowed): void {
req.resume();
if (error) {
next(error);
} else if (allowed) {
next();
} else {
// last plugin (that's our built-in one) returns either
// cb(err) or cb(null, true), so this should never happen
throw errorUtils.getInternalError(API_ERROR.PLUGIN_ERROR);
}
}
);
};
};
}
export interface MiddlewareError {
error: string;
}
export type FinalBody = Package | MiddlewareError | string;
export function final(
body: FinalBody,
req: $RequestExtend,
res: $ResponseExtend,
// if we remove `next` breaks test
// eslint-disable-next-line @typescript-eslint/no-unused-vars
next: $NextFunctionVer
): void {
if (res.statusCode === HTTP_STATUS.UNAUTHORIZED && !res.getHeader(HEADERS.WWW_AUTH)) {
// they say it's required for 401, so...
res.header(HEADERS.WWW_AUTH, `${TOKEN_BASIC}, ${TOKEN_BEARER}`);
}
try {
if (_.isString(body) || _.isObject(body)) {
if (!res.getHeader(HEADERS.CONTENT_TYPE)) {
res.header(HEADERS.CONTENT_TYPE, HEADERS.JSON);
}
if (typeof body === 'object' && _.isNil(body) === false) {
if (typeof (body as MiddlewareError).error === 'string') {
res.locals._verdaccio_error = (body as MiddlewareError).error;
// res._verdaccio_error = (body as MiddlewareError).error;
}
body = JSON.stringify(body, undefined, ' ') + '\n';
}
// don't send etags with errors
if (
!res.statusCode ||
(res.statusCode >= HTTP_STATUS.OK && res.statusCode < HTTP_STATUS.MULTIPLE_CHOICES)
) {
res.header(HEADERS.ETAG, '"' + stringToMD5(body as string) + '"');
}
} else {
// send(null), send(204), etc.
}
} catch (err: any) {
// if verdaccio sends headers first, and then calls res.send()
// as an error handler, we can't report error properly,
// and should just close socket
if (err.message.match(/set headers after they are sent/)) {
if (_.isNil(res.socket) === false) {
res.socket?.destroy();
}
return;
}
throw err;
}
res.send(body);
}
// FIXME: deprecated, moved to @verdaccio/dev-commons
export const LOG_STATUS_MESSAGE =
"@{status}, user: @{user}(@{remoteIP}), req: '@{request.method} @{request.url}'";
export const LOG_VERDACCIO_ERROR = `${LOG_STATUS_MESSAGE}, error: @{!error}`;
export const LOG_VERDACCIO_BYTES = `${LOG_STATUS_MESSAGE}, bytes: @{bytes.in}/@{bytes.out}`;
export function log(req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer): void {
// logger
req.log = logger.child({ sub: 'in' });
const _auth = req.headers.authorization;
if (_.isNil(_auth) === false) {
req.headers.authorization = '<Classified>';
}
const _cookie = req.get('cookie');
if (_.isNil(_cookie) === false) {
req.headers.cookie = '<Classified>';
}
req.url = req.originalUrl;
req.log.info({ req: req, ip: req.ip }, "@{ip} requested '@{req.method} @{req.url}'");
req.originalUrl = req.url;
if (_.isNil(_auth) === false) {
req.headers.authorization = _auth;
}
if (_.isNil(_cookie) === false) {
req.headers.cookie = _cookie;
}
let bytesin = 0;
req.on('data', function (chunk): void {
bytesin += chunk.length;
});
let bytesout = 0;
const _write = res.write;
// FIXME: res.write should return boolean
// @ts-ignore
res.write = function (buf): boolean {
bytesout += buf.length;
/* eslint prefer-rest-params: "off" */
// @ts-ignore
_write.apply(res, arguments);
};
const log = function (): void {
const forwardedFor = req.get('x-forwarded-for');
const remoteAddress = req.connection.remoteAddress;
const remoteIP = forwardedFor ? `${forwardedFor} via ${remoteAddress}` : remoteAddress;
let message;
if (res.locals._verdaccio_error) {
message = LOG_VERDACCIO_ERROR;
} else {
message = LOG_VERDACCIO_BYTES;
}
req.url = req.originalUrl;
req.log.http(
{
request: {
method: req.method,
url: req.url,
},
user: (req.remote_user && req.remote_user.name) || null,
remoteIP,
status: res.statusCode,
error: res.locals._verdaccio_error,
bytes: {
in: bytesin,
out: bytesout,
},
},
message
);
req.originalUrl = req.url;
};
req.on('close', function (): void {
log();
});
const _end = res.end;
// @ts-ignore
res.end = function (buf): void {
if (buf) {
bytesout += buf.length;
}
/* eslint prefer-rest-params: "off" */
// @ts-ignore
_end.apply(res, arguments);
log();
};
next();
}
export function handleError(
err: HttpError,
req: $RequestExtend,
res: $ResponseExtend,
next: $NextFunctionVer
) {
debug('error handler init');
if (_.isError(err)) {
debug('is native error');
if (err.code === 'ECONNABORT' && res.statusCode === HTTP_STATUS.NOT_MODIFIED) {
return next();
}
if (_.isFunction(res.locals.report_error) === false) {
debug('is locals error report ref');
// in case of very early error this middleware may not be loaded before error is generated
// fixing that
errorReportingMiddleware(req, res, _.noop);
}
debug('set locals error report ref');
res.locals.report_error(err);
} else {
// Fall to Middleware.final
debug('no error to report, jump next layer');
return next(err);
}
}
// Middleware
export function errorReportingMiddleware(
req: $RequestExtend,
res: $ResponseExtend,
next: $NextFunctionVer
): void {
debug('error report middleware');
res.locals.report_error =
res.locals.report_error ||
function (err: VerdaccioError): void {
if (err.status && err.status >= HTTP_STATUS.BAD_REQUEST && err.status < 600) {
debug('is error > 409 %o', err?.status);
if (_.isNil(res.headersSent) === false) {
debug('send status %o', err?.status);
res.status(err.status);
debug('next layer %o', err?.message);
next({ error: err.message || API_ERROR.UNKNOWN_ERROR });
}
} else {
debug('is error < 409 %o', err?.status);
logger.error({ err: err }, 'unexpected error: @{!err.message}\n@{err.stack}');
if (!res.status || !res.send) {
// TODO: decide which debug keep
logger.error('this is an error in express.js, please report this');
debug('this is an error in express.js, please report this, destroy response %o', err);
res.destroy();
} else if (!res.headersSent) {
debug('report internal error %o', err);
res.status(HTTP_STATUS.INTERNAL_ERROR);
next({ error: API_ERROR.INTERNAL_SERVER_ERROR });
} else {
// socket should be already closed
debug('this should not happen, otherwise report %o', err);
}
}
};
debug('error report middleware next()');
next();
}

View File

@@ -0,0 +1,40 @@
import { API_ERROR, errorUtils } from '@verdaccio/core';
import { logger } from '@verdaccio/logger';
import { getVersionFromTarball } from '@verdaccio/utils';
import { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '../types';
export function allow<T>(auth: T): Function {
return function (action: string): Function {
return function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer): void {
req.pause();
const packageName = req.params.scope
? `@${req.params.scope}/${req.params.package}`
: req.params.package;
const packageVersion = req.params.filename
? getVersionFromTarball(req.params.filename)
: undefined;
const remote = req.remote_user;
logger.trace(
{ action, user: remote?.name },
`[middleware/allow][@{action}] allow for @{user}`
);
auth['allow_' + action](
{ packageName, packageVersion },
remote,
function (error, allowed): void {
req.resume();
if (error) {
next(error);
} else if (allowed) {
next();
} else {
// last plugin (that's our built-in one) returns either
// cb(err) or cb(null, true), so this should never happen
throw errorUtils.getInternalError(API_ERROR.PLUGIN_ERROR);
}
}
);
};
};
}

View File

@@ -0,0 +1,30 @@
import { HTTP_STATUS, errorUtils } from '@verdaccio/core';
import { Config } from '@verdaccio/types';
import { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '../types';
/**
* A middleware that avoid a registry points itself as proxy and avoid create infinite loops.
* @param config
* @returns
*/
export function antiLoop(config: Config): Function {
return function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer): void {
if (req?.headers?.via != null) {
const arr = req.get('via')?.split(',');
if (Array.isArray(arr)) {
for (let i = 0; i < arr.length; i++) {
// the "via" header must contains an specific headers, this has to be on sync
// with the proxy request
// match eg: Server 1 or Server 2
// TODO: improve this RegEX
const m = arr[i].trim().match(/\s*(\S+)\s+(\S+)/);
if (m && m[2] === config.server_id) {
return next(errorUtils.getCode(HTTP_STATUS.LOOP_DETECTED, 'loop detected'));
}
}
}
}
next();
};
}

View File

@@ -0,0 +1,19 @@
import { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '../types';
/**
* Encode / in a scoped package name to be matched as a single parameter in routes
* @param req
* @param res
* @param next
*/
export function encodeScopePackage(
req: $RequestExtend,
res: $ResponseExtend,
next: $NextFunctionVer
): void {
if (req.url.indexOf('@') !== -1) {
// e.g.: /@org/pkg/1.2.3 -> /@org%2Fpkg/1.2.3, /@org%2Fpkg/1.2.3 -> /@org%2Fpkg/1.2.3
req.url = req.url.replace(/^(\/@[^\/%]+)\/(?!$)/, '$1%2F');
}
next();
}

View File

@@ -0,0 +1,78 @@
import buildDebug from 'debug';
import { HttpError } from 'http-errors';
import _ from 'lodash';
import { API_ERROR, HTTP_STATUS, VerdaccioError } from '@verdaccio/core';
import { logger } from '@verdaccio/logger';
import { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '../types';
const debug = buildDebug('verdaccio:middleware:error');
export function handleError(
err: HttpError,
req: $RequestExtend,
res: $ResponseExtend,
next: $NextFunctionVer
) {
debug('error handler init');
if (_.isError(err)) {
debug('is native error');
if (err.code === 'ECONNABORT' && res.statusCode === HTTP_STATUS.NOT_MODIFIED) {
return next();
}
if (_.isFunction(res.locals.report_error) === false) {
debug('is locals error report ref');
// in case of very early error this middleware may not be loaded before error is generated
// fixing that
errorReportingMiddleware(req, res, _.noop);
}
debug('set locals error report ref');
res.locals.report_error(err);
} else {
// Fall to Middleware.final
debug('no error to report, jump next layer');
return next(err);
}
}
// Middleware
export function errorReportingMiddleware(
req: $RequestExtend,
res: $ResponseExtend,
next: $NextFunctionVer
): void {
debug('error report middleware');
res.locals.report_error =
res.locals.report_error ||
function (err: VerdaccioError): void {
if (err.status && err.status >= HTTP_STATUS.BAD_REQUEST && err.status < 600) {
debug('is error > 409 %o', err?.status);
if (_.isNil(res.headersSent) === false) {
debug('send status %o', err?.status);
res.status(err.status);
debug('next layer %o', err?.message);
next({ error: err.message || API_ERROR.UNKNOWN_ERROR });
}
} else {
debug('is error < 409 %o', err?.status);
logger.error({ err: err }, 'unexpected error: @{!err.message}\n@{err.stack}');
if (!res.status || !res.send) {
// TODO: decide which debug keep
logger.error('this is an error in express.js, please report this');
debug('this is an error in express.js, please report this, destroy response %o', err);
res.destroy();
} else if (!res.headersSent) {
debug('report internal error %o', err);
res.status(HTTP_STATUS.INTERNAL_ERROR);
next({ error: API_ERROR.INTERNAL_SERVER_ERROR });
} else {
// socket should be already closed
debug('this should not happen, otherwise report %o', err);
}
}
};
debug('error report middleware next()');
next();
}

View File

@@ -0,0 +1,60 @@
import _ from 'lodash';
import { HEADERS, HTTP_STATUS, TOKEN_BASIC, TOKEN_BEARER } from '@verdaccio/core';
import { Manifest } from '@verdaccio/types';
import { stringToMD5 } from '@verdaccio/utils';
import { $NextFunctionVer, $RequestExtend, $ResponseExtend, MiddlewareError } from '../types';
export type FinalBody = Manifest | MiddlewareError | string;
export function final(
body: FinalBody,
req: $RequestExtend,
res: $ResponseExtend,
// if we remove `next` breaks test
// eslint-disable-next-line @typescript-eslint/no-unused-vars
next: $NextFunctionVer
): void {
if (res.statusCode === HTTP_STATUS.UNAUTHORIZED && !res.getHeader(HEADERS.WWW_AUTH)) {
res.header(HEADERS.WWW_AUTH, `${TOKEN_BASIC}, ${TOKEN_BEARER}`);
}
try {
if (_.isString(body) || _.isObject(body)) {
if (!res.get(HEADERS.CONTENT_TYPE)) {
res.header(HEADERS.CONTENT_TYPE, HEADERS.JSON);
}
if (typeof body === 'object' && _.isNil(body) === false) {
if (typeof (body as MiddlewareError).error === 'string') {
res.locals._verdaccio_error = (body as MiddlewareError).error;
}
body = JSON.stringify(body, undefined, ' ') + '\n';
}
// don't send etags with errors
if (
!res.statusCode ||
(res.statusCode >= HTTP_STATUS.OK && res.statusCode < HTTP_STATUS.MULTIPLE_CHOICES)
) {
res.header(HEADERS.ETAG, '"' + stringToMD5(body as string) + '"');
}
} else {
// send(null), send(204), etc.
}
} catch (err: any) {
// if verdaccio sends headers first, and then calls res.send()
// as an error handler, we can't report error properly,
// and should just close socket
if (err.message.match(/set headers after they are sent/)) {
if (_.isNil(res.socket) === false) {
res.socket?.destroy();
}
return;
}
throw err;
}
res.send(body);
}

View File

@@ -0,0 +1,15 @@
import { errorUtils } from '@verdaccio/core';
import { isObject } from '@verdaccio/utils';
import { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '../types';
export function expectJson(
req: $RequestExtend,
res: $ResponseExtend,
next: $NextFunctionVer
): void {
if (!isObject(req.body)) {
return next(errorUtils.getBadRequest("can't parse incoming json"));
}
next();
}

View File

@@ -0,0 +1,103 @@
import _ from 'lodash';
import { logger } from '@verdaccio/logger';
import { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '../types';
// FIXME: deprecated, moved to @verdaccio/dev-commons
export const LOG_STATUS_MESSAGE =
"@{status}, user: @{user}(@{remoteIP}), req: '@{request.method} @{request.url}'";
export const LOG_VERDACCIO_ERROR = `${LOG_STATUS_MESSAGE}, error: @{!error}`;
export const LOG_VERDACCIO_BYTES = `${LOG_STATUS_MESSAGE}, bytes: @{bytes.in}/@{bytes.out}`;
export function log(req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer): void {
// logger
req.log = logger.child({ sub: 'in' });
const _auth = req.headers.authorization;
if (_.isNil(_auth) === false) {
req.headers.authorization = '<Classified>';
}
const _cookie = req.get('cookie');
if (_.isNil(_cookie) === false) {
req.headers.cookie = '<Classified>';
}
req.url = req.originalUrl;
req.log.info({ req: req, ip: req.ip }, "@{ip} requested '@{req.method} @{req.url}'");
req.originalUrl = req.url;
if (_.isNil(_auth) === false) {
req.headers.authorization = _auth;
}
if (_.isNil(_cookie) === false) {
req.headers.cookie = _cookie;
}
let bytesin = 0;
req.on('data', function (chunk): void {
bytesin += chunk.length;
});
let bytesout = 0;
const _write = res.write;
// FIXME: res.write should return boolean
// @ts-ignore
res.write = function (buf): boolean {
bytesout += buf.length;
/* eslint prefer-rest-params: "off" */
// @ts-ignore
_write.apply(res, arguments);
};
const log = function (): void {
const forwardedFor = req.get('x-forwarded-for');
const remoteAddress = req.connection.remoteAddress;
const remoteIP = forwardedFor ? `${forwardedFor} via ${remoteAddress}` : remoteAddress;
let message;
if (res.locals._verdaccio_error) {
message = LOG_VERDACCIO_ERROR;
} else {
message = LOG_VERDACCIO_BYTES;
}
req.url = req.originalUrl;
req.log.http(
{
request: {
method: req.method,
url: req.url,
},
user: req.remote_user?.name || null,
remoteIP,
status: res.statusCode,
error: res.locals._verdaccio_error,
bytes: {
in: bytesin,
out: bytesout,
},
},
message
);
req.originalUrl = req.url;
};
req.on('close', function (): void {
log();
});
const _end = res.end;
// @ts-ignore
res.end = function (buf): void {
if (buf) {
bytesout += buf.length;
}
/* eslint prefer-rest-params: "off" */
// @ts-ignore
_end.apply(res, arguments);
log();
};
next();
}

View File

@@ -0,0 +1,16 @@
import { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '../types';
export function match(regexp: RegExp): any {
return function (
req: $RequestExtend,
res: $ResponseExtend,
next: $NextFunctionVer,
value: string
): void {
if (regexp.exec(value)) {
next();
} else {
next('route');
}
};
}

View File

@@ -0,0 +1,18 @@
import { HEADER_TYPE, HTTP_STATUS, errorUtils } from '@verdaccio/core';
import { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '../types';
export function media(expect: string | null): any {
return function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer): void {
if (req.headers[HEADER_TYPE.CONTENT_TYPE] !== expect) {
next(
errorUtils.getCode(
HTTP_STATUS.UNSUPPORTED_MEDIA,
'wrong content-type, expect: ' + expect + ', got: ' + req.get[HEADER_TYPE.CONTENT_TYPE]
)
);
} else {
next();
}
};
}

View File

@@ -0,0 +1,21 @@
import { HEADERS } from '@verdaccio/core';
import { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '../types';
// TODO: remove, was relocated to web package
// @ts-deprecated
export function setSecurityWebHeaders(
req: $RequestExtend,
res: $ResponseExtend,
next: $NextFunctionVer
): void {
// disable loading in frames (clickjacking, etc.)
res.header(HEADERS.FRAMES_OPTIONS, 'deny');
// avoid stablish connections outside of domain
res.header(HEADERS.CSP, "connect-src 'self'");
// https://stackoverflow.com/questions/18337630/what-is-x-content-type-options-nosniff
res.header(HEADERS.CTO, 'nosniff');
// https://stackoverflow.com/questions/9090577/what-is-the-http-header-x-xss-protection
res.header(HEADERS.XSS, '1; mode=block');
next();
}

View File

@@ -0,0 +1,41 @@
import { errorUtils } from '@verdaccio/core';
import {
validateName as utilValidateName,
validatePackage as utilValidatePackage,
} from '@verdaccio/utils';
import { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '../types';
export function validateName(
req: $RequestExtend,
res: $ResponseExtend,
next: $NextFunctionVer,
value: string,
name: string
): void {
if (value === '-') {
// special case in couchdb usually
next('route');
} else if (utilValidateName(value)) {
next();
} else {
next(errorUtils.getForbidden('invalid ' + name));
}
}
export function validatePackage(
req: $RequestExtend,
res: $ResponseExtend,
next: $NextFunctionVer,
value: string,
name: string
): void {
if (value === '-') {
// special case in couchdb usually
next('route');
} else if (utilValidatePackage(value)) {
next();
} else {
next(errorUtils.getForbidden('invalid ' + name));
}
}

View File

@@ -0,0 +1,11 @@
import { NextFunction, Request, Response } from 'express';
import { Logger, RemoteUser } from '@verdaccio/types';
export type $RequestExtend = Request & { remote_user?: RemoteUser; log: Logger };
export type $ResponseExtend = Response & { cookies?: any };
export type $NextFunctionVer = NextFunction & any;
export interface MiddlewareError {
error: string;
}

View File

@@ -0,0 +1,82 @@
import request from 'supertest';
import { HTTP_STATUS } from '@verdaccio/core';
import { setup } from '@verdaccio/logger';
import { allow } from '../src';
import { getApp } from './helper';
setup({});
test('should allow request', async () => {
const can = allow({
allow_publish: (params, remove, cb) => {
return cb(null, true);
},
});
const app = getApp([]);
// @ts-ignore
app.get('/:package', can('publish'), (req, res) => {
res.status(HTTP_STATUS.OK).json({});
});
return request(app).get('/react').expect(HTTP_STATUS.OK);
});
test('should allow scope request', async () => {
const can = allow({
allow_publish: (params, remove, cb) => {
return cb(null, true);
},
});
const app = getApp([]);
// @ts-ignore
app.get('/:package/:scope', can('publish'), (req, res) => {
res.status(HTTP_STATUS.OK).json({});
});
return request(app).get('/@verdaccio/core').expect(HTTP_STATUS.OK);
});
test('should allow filename request', async () => {
const can = allow({
allow_publish: (params, remove, cb) => {
return cb(null, true);
},
});
const app = getApp([]);
// @ts-ignore
app.get('/:filename', can('publish'), (req, res) => {
res.status(HTTP_STATUS.OK).json({});
});
return request(app).get('/aaa-0.0.1.tgz').expect(HTTP_STATUS.OK);
});
test('should not allow request', async () => {
const can = allow({
allow_publish: (params, remove, cb) => {
return cb(null, false);
},
});
const app = getApp([]);
// @ts-ignore
app.get('/sec', can('publish'), (req, res) => {
res.status(HTTP_STATUS.OK).json({});
});
return request(app).get('/sec').expect(HTTP_STATUS.INTERNAL_ERROR);
});
test('should handle error request', async () => {
const can = allow({
allow_publish: (params, remove, cb) => {
return cb(Error('foo error'));
},
});
const app = getApp([]);
// @ts-ignore
app.get('/err', can('publish'));
return request(app).get('/err').expect(HTTP_STATUS.INTERNAL_ERROR);
});

View File

@@ -0,0 +1,21 @@
import request from 'supertest';
import { HTTP_STATUS } from '@verdaccio/core';
import { encodeScopePackage } from '../src';
import { getApp } from './helper';
test('encode is json', async () => {
const app = getApp([]);
// @ts-ignore
app.use(encodeScopePackage);
// @ts-ignore
app.get('/:id', (req, res) => {
const { id } = req.params;
res.status(HTTP_STATUS.OK).json({ id });
});
const res = await request(app).get('/@scope/foo');
expect(res.body).toEqual({ id: '@scope/foo' });
expect(res.status).toEqual(HTTP_STATUS.OK);
});

View File

@@ -0,0 +1,60 @@
import bodyParser from 'body-parser';
import express from 'express';
import request from 'supertest';
import { HEADERS, HTTP_STATUS } from '@verdaccio/core';
import { final } from '../src';
test('handle error as object', async () => {
const app = express();
app.use(bodyParser.json({ strict: false, limit: '10mb' }));
app.get('/401', (req, res, next) => {
res.status(HTTP_STATUS.UNAUTHORIZED);
next({ error: 'some error' });
});
// @ts-ignore
app.use(final);
const res = await request(app).get('/401');
expect(res.get(HEADERS.WWW_AUTH)).toEqual('Basic, Bearer');
expect(res.get(HEADERS.CONTENT_TYPE)).toEqual(HEADERS.JSON_CHARSET);
expect(res.get(HEADERS.ETAG)).toEqual('W/"1c-CP1UoQiM59AjHpEk0334sfSp1kc"');
expect(res.body).toEqual({ error: 'some error' });
});
test('handle error as string', async () => {
const app = express();
app.use(bodyParser.json({ strict: false, limit: '10mb' }));
app.get('/200', (req, res, next) => {
res.status(HTTP_STATUS.OK);
// error as json string
next(JSON.stringify({ error: 'some error' }));
});
// @ts-ignore
app.use(final);
const res = await request(app).get('/200');
expect(res.get(HEADERS.WWW_AUTH)).not.toBeDefined();
expect(res.get(HEADERS.CONTENT_TYPE)).toEqual(HEADERS.JSON_CHARSET);
expect(res.get(HEADERS.ETAG)).toEqual('"3f3a7b9afa23269e16685af6e707d109"');
expect(res.body).toEqual({ error: 'some error' });
});
test('handle error as unknown string no parsable', async () => {
const app = express();
app.use(bodyParser.json({ strict: false, limit: '10mb' }));
app.get('/200', (req, res) => {
res.status(HTTP_STATUS.OK);
// error as json string
throw Error('uknonwn');
});
// @ts-ignore
app.use(final);
const res = await request(app).get('/200');
expect(res.get(HEADERS.WWW_AUTH)).not.toBeDefined();
expect(res.get(HEADERS.CONTENT_TYPE)).toEqual(HEADERS.JSON_CHARSET);
expect(res.get(HEADERS.ETAG)).toEqual('"8a80554c91d9fca8acb82f023de02f11"');
expect(res.body).toEqual({});
});

View File

@@ -0,0 +1,14 @@
import express from 'express';
export const getApp = (middlewares = []) => {
const app = express();
middlewares.map((middleware) => {
app.use(middleware);
});
// app.get('/', function (req, res) {
// res.status(200).json({ name: 'pkg' });
// });
return app;
};

View File

@@ -0,0 +1,32 @@
import bodyParser from 'body-parser';
import request from 'supertest';
import { HEADERS, HTTP_STATUS } from '@verdaccio/core';
import { expectJson } from '../src';
import { getApp } from './helper';
test('body is json', async () => {
const app = getApp([]);
app.use(bodyParser.json({ strict: false, limit: '10mb' }));
// @ts-ignore
app.put('/json', expectJson, (req, res) => {
res.status(HTTP_STATUS.OK).json({});
});
return request(app)
.put('/json')
.send({ name: 'john' })
.set(HEADERS.CONTENT_TYPE, 'application/json')
.expect(HTTP_STATUS.OK);
});
test('body is not json', async () => {
const app = getApp([]);
// @ts-ignore
app.put('/json', expectJson, (req, res) => {
res.status(HTTP_STATUS.OK).json({});
});
return request(app).put('/json').send('test=4').expect(HTTP_STATUS.BAD_REQUEST);
});

View File

@@ -0,0 +1,28 @@
import path from 'path';
import request from 'supertest';
import { HTTP_STATUS } from '@verdaccio/core';
import { setup } from '@verdaccio/logger';
import { log } from '../src';
import { getApp } from './helper';
setup({
type: 'file',
path: path.join(__dirname, './verdaccio.log'),
level: 'trace',
format: 'json',
});
test('should log request', async () => {
const app = getApp([]);
// @ts-ignore
app.use(log);
// @ts-ignore
app.get('/:package', (req, res) => {
res.status(HTTP_STATUS.OK).json({});
});
// TODO: pending output
return request(app).get('/react').expect(HTTP_STATUS.OK);
});

View File

@@ -0,0 +1,31 @@
import request from 'supertest';
import { HTTP_STATUS } from '@verdaccio/core';
import { antiLoop } from '../src';
import { getApp } from './helper';
test('should not be a loop', async () => {
const app = getApp([]);
// @ts-ignore
app.use(antiLoop({ server_id: '1' }));
app.get('/sec', (req, res) => {
res.status(HTTP_STATUS.OK).json({});
});
return request(app).get('/sec').set('via', 'Server 2').expect(HTTP_STATUS.OK);
});
test('should be a loop', async () => {
const app = getApp([]);
// @ts-ignore
app.use(antiLoop({ server_id: '1' }));
app.get('/sec', (req, res) => {
res.status(HTTP_STATUS.OK).json({});
});
return request(app)
.get('/sec')
.set('via', 'Server 1, Server 2')
.expect(HTTP_STATUS.LOOP_DETECTED);
});

View File

@@ -0,0 +1,33 @@
import mime from 'mime';
import request from 'supertest';
import { HEADERS, HTTP_STATUS } from '@verdaccio/core';
import { media } from '../src';
import { getApp } from './helper';
test('media is json', async () => {
const app = getApp([]);
app.get('/json', media(mime.getType('json')), (req, res) => {
res.status(200).json();
});
return request(app)
.get('/json')
.set(HEADERS.CONTENT_TYPE, 'application/json')
.expect('Content-Type', /json/)
.expect(200);
});
test('media is not json', async () => {
const app = getApp([]);
app.get('/json', media(mime.getType('json')), (req, res) => {
res.status(HTTP_STATUS.OK).json({});
});
return request(app)
.get('/json')
.set(HEADERS.CONTENT_TYPE, 'text/html; charset=utf-8')
.expect('Content-Type', /html/)
.expect(HTTP_STATUS.UNSUPPORTED_MEDIA);
});

View File

@@ -0,0 +1,83 @@
import request from 'supertest';
import { HTTP_STATUS } from '@verdaccio/core';
import { match, validateName, validatePackage } from '../src';
import { getApp } from './helper';
describe('validate params', () => {
test('should validate package name', async () => {
const app = getApp([]);
// @ts-ignore
app.param('package', validatePackage);
app.get('/pkg/:package', (req, res) => {
res.status(HTTP_STATUS.OK).json({});
});
return request(app).get('/pkg/react').expect(HTTP_STATUS.OK);
});
test('should fails validate package name', async () => {
const app = getApp([]);
// @ts-ignore
app.param('package', validatePackage);
app.get('/pkg/:package', (req, res) => {
res.status(HTTP_STATUS.OK).json({});
});
return request(app).get('/pkg/node_modules').expect(HTTP_STATUS.FORBIDDEN);
});
test('should fails file name package name', async () => {
const app = getApp([]);
// @ts-ignore
app.param('filename', validateName);
app.get('/file/:filename', (req, res) => {
res.status(HTTP_STATUS.OK).json({});
});
return request(app).get('/file/__proto__').expect(HTTP_STATUS.FORBIDDEN);
});
test('should validate file name package name', async () => {
const app = getApp([]);
// @ts-ignore
app.param('filename', validateName);
app.get('/file/:filename', (req, res) => {
res.status(HTTP_STATUS.OK).json({});
});
return request(app).get('/file/react.tar.gz').expect(HTTP_STATUS.OK);
});
});
describe('match', () => {
test('should not match middleware', async () => {
const app = getApp([]);
app.param('_rev', match(/^-rev$/));
app.param('org_couchdb_user', match(/^org\.couchdb\.user:/));
app.get('/-/user/:org_couchdb_user', (req, res) => {
res.status(HTTP_STATUS.OK).json({});
});
app.use((res: any) => {
res.status(HTTP_STATUS.INTERNAL_ERROR);
});
return request(app).get('/-/user/test').expect(HTTP_STATUS.INTERNAL_ERROR);
});
test('should match middleware', async () => {
const app = getApp([]);
app.param('_rev', match(/^-rev$/));
app.get('/-/user/:_rev?', (req, res) => {
res.status(HTTP_STATUS.OK).json({});
});
app.use((res: any) => {
res.status(HTTP_STATUS.INTERNAL_ERROR);
});
return request(app).get('/-/user/-rev').expect(HTTP_STATUS.OK);
});
});

View File

@@ -0,0 +1,54 @@
import request from 'supertest';
import { HEADERS, HTTP_STATUS } from '@verdaccio/core';
import { setSecurityWebHeaders } from '../src';
import { getApp } from './helper';
test('should get frame options', async () => {
const app = getApp([]);
// @ts-ignore
app.use(setSecurityWebHeaders);
app.get('/sec', (req, res) => {
res.status(HTTP_STATUS.OK).json({});
});
const res = await request(app).get('/sec').expect(HTTP_STATUS.OK);
expect(res.get(HEADERS.FRAMES_OPTIONS)).toEqual('deny');
});
test('should get csp options', async () => {
const app = getApp([]);
// @ts-ignore
app.use(setSecurityWebHeaders);
app.get('/sec', (req, res) => {
res.status(HTTP_STATUS.OK).json({});
});
const res = await request(app).get('/sec').expect(HTTP_STATUS.OK);
expect(res.get(HEADERS.CSP)).toEqual("connect-src 'self'");
});
test('should get cto', async () => {
const app = getApp([]);
// @ts-ignore
app.use(setSecurityWebHeaders);
app.get('/sec', (req, res) => {
res.status(HTTP_STATUS.OK).json({});
});
const res = await request(app).get('/sec').expect(HTTP_STATUS.OK);
expect(res.get(HEADERS.CTO)).toEqual('nosniff');
});
test('should get xss', async () => {
const app = getApp([]);
// @ts-ignore
app.use(setSecurityWebHeaders);
app.get('/sec', (req, res) => {
res.status(HTTP_STATUS.OK).json({});
});
const res = await request(app).get('/sec').expect(HTTP_STATUS.OK);
expect(res.get(HEADERS.XSS)).toEqual('1; mode=block');
});

View File

@@ -1,5 +1,15 @@
# @verdaccio/node-api
## 6.0.0-6-next.56
### Patch Changes
- @verdaccio/server@6.0.0-6-next.45
- @verdaccio/config@6.0.0-6-next.56
- @verdaccio/server-fastify@6.0.0-6-next.37
- @verdaccio/core@6.0.0-6-next.56
- @verdaccio/logger@6.0.0-6-next.24
## 6.0.0-6-next.55
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/node-api",
"version": "6.0.0-6-next.55",
"version": "6.0.0-6-next.56",
"description": "node API",
"main": "build/index.js",
"types": "build/index.d.ts",
@@ -39,11 +39,11 @@
},
"license": "MIT",
"dependencies": {
"@verdaccio/core": "workspace:6.0.0-6-next.55",
"@verdaccio/config": "workspace:6.0.0-6-next.55",
"@verdaccio/logger": "workspace:6.0.0-6-next.23",
"@verdaccio/server": "workspace:6.0.0-6-next.44",
"@verdaccio/server-fastify": "workspace:6.0.0-6-next.36",
"@verdaccio/core": "workspace:6.0.0-6-next.56",
"@verdaccio/config": "workspace:6.0.0-6-next.56",
"@verdaccio/logger": "workspace:6.0.0-6-next.24",
"@verdaccio/server": "workspace:6.0.0-6-next.45",
"@verdaccio/server-fastify": "workspace:6.0.0-6-next.37",
"core-js": "3.27.0",
"debug": "4.3.4",
"lodash": "4.17.21"

View File

@@ -1,5 +1,13 @@
# Change Log
## 11.0.0-6-next.19
### Patch Changes
- @verdaccio/config@6.0.0-6-next.56
- @verdaccio/core@6.0.0-6-next.56
- @verdaccio/logger@6.0.0-6-next.24
## 11.0.0-6-next.18
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "verdaccio-audit",
"version": "11.0.0-6-next.18",
"version": "11.0.0-6-next.19",
"description": "Verdaccio Middleware plugin to bypass npmjs audit",
"keywords": [
"private",
@@ -31,9 +31,9 @@
"npm": ">=6"
},
"dependencies": {
"@verdaccio/core": "workspace:6.0.0-6-next.55",
"@verdaccio/config": "workspace:6.0.0-6-next.55",
"@verdaccio/logger": "workspace:6.0.0-6-next.23",
"@verdaccio/core": "workspace:6.0.0-6-next.56",
"@verdaccio/config": "workspace:6.0.0-6-next.56",
"@verdaccio/logger": "workspace:6.0.0-6-next.24",
"express": "4.18.2",
"body-parser": "1.20.1",
"https-proxy-agent": "5.0.1",
@@ -41,7 +41,7 @@
},
"devDependencies": {
"@verdaccio/types": "workspace:11.0.0-6-next.19",
"@verdaccio/auth": "workspace:6.0.0-6-next.34",
"@verdaccio/auth": "workspace:6.0.0-6-next.35",
"nock": "13.2.9",
"supertest": "6.3.3"
},

View File

@@ -1,5 +1,11 @@
# Change Log
## 11.0.0-6-next.21
### Patch Changes
- @verdaccio/core@6.0.0-6-next.56
## 11.0.0-6-next.20
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "verdaccio-auth-memory",
"version": "11.0.0-6-next.20",
"version": "11.0.0-6-next.21",
"description": "Auth plugin for Verdaccio that keeps users in memory",
"keywords": [
"private",
@@ -32,10 +32,10 @@
},
"dependencies": {
"debug": "4.3.4",
"@verdaccio/core": "workspace:6.0.0-6-next.55"
"@verdaccio/core": "workspace:6.0.0-6-next.56"
},
"devDependencies": {
"@verdaccio/config": "workspace:6.0.0-6-next.55",
"@verdaccio/config": "workspace:6.0.0-6-next.56",
"@verdaccio/types": "workspace:11.0.0-6-next.19"
},
"scripts": {

View File

@@ -1,5 +1,11 @@
# Change Log
## 11.0.0-6-next.26
### Patch Changes
- @verdaccio/core@6.0.0-6-next.56
## 11.0.0-6-next.25
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "verdaccio-htpasswd",
"version": "11.0.0-6-next.25",
"version": "11.0.0-6-next.26",
"description": "htpasswd auth plugin for Verdaccio",
"keywords": [
"private",
@@ -34,7 +34,7 @@
"npm": ">=6"
},
"dependencies": {
"@verdaccio/core": "workspace:6.0.0-6-next.55",
"@verdaccio/core": "workspace:6.0.0-6-next.56",
"@verdaccio/file-locking": "workspace:11.0.0-6-next.7",
"apache-md5": "1.1.8",
"bcryptjs": "2.4.3",
@@ -46,8 +46,8 @@
"devDependencies": {
"@types/bcryptjs": "2.4.2",
"@verdaccio/types": "workspace:11.0.0-6-next.19",
"@verdaccio/config": "workspace:6.0.0-6-next.55",
"@verdaccio/logger": "workspace:6.0.0-6-next.23",
"@verdaccio/config": "workspace:6.0.0-6-next.56",
"@verdaccio/logger": "workspace:6.0.0-6-next.24",
"mockdate": "3.0.5"
},
"scripts": {

View File

@@ -1,5 +1,13 @@
# Change Log
## 11.0.0-6-next.26
### Patch Changes
- Updated dependencies [a1986e09]
- @verdaccio/utils@6.0.0-6-next.24
- @verdaccio/core@6.0.0-6-next.56
## 11.0.0-6-next.25
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/local-storage",
"version": "11.0.0-6-next.25",
"version": "11.0.0-6-next.26",
"description": "Local storage implementation",
"keywords": [
"private",
@@ -37,9 +37,9 @@
"npm": ">=7"
},
"dependencies": {
"@verdaccio/core": "workspace:6.0.0-6-next.55",
"@verdaccio/core": "workspace:6.0.0-6-next.56",
"@verdaccio/file-locking": "workspace:11.0.0-6-next.7",
"@verdaccio/utils": "workspace:6.0.0-6-next.23",
"@verdaccio/utils": "workspace:6.0.0-6-next.24",
"core-js": "3.27.0",
"debug": "4.3.4",
"globby": "11.1.0",
@@ -52,8 +52,8 @@
"devDependencies": {
"@types/minimatch": "3.0.5",
"@verdaccio/types": "workspace:11.0.0-6-next.19",
"@verdaccio/config": "workspace:6.0.0-6-next.55",
"@verdaccio/logger": "workspace:6.0.0-6-next.23",
"@verdaccio/config": "workspace:6.0.0-6-next.56",
"@verdaccio/logger": "workspace:6.0.0-6-next.24",
"@verdaccio/test-helper": "workspace:2.0.0-6-next.6",
"minimatch": "3.1.2"
},

View File

@@ -1,5 +1,11 @@
# Change Log
## 11.0.0-6-next.23
### Patch Changes
- @verdaccio/core@6.0.0-6-next.56
## 11.0.0-6-next.22
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "verdaccio-memory",
"version": "11.0.0-6-next.22",
"version": "11.0.0-6-next.23",
"description": "Storage implementation in memory",
"keywords": [
"private",
@@ -31,15 +31,15 @@
"npm": ">=6"
},
"dependencies": {
"@verdaccio/core": "workspace:6.0.0-6-next.55",
"@verdaccio/core": "workspace:6.0.0-6-next.56",
"memory-fs": "0.5.0",
"debug": "4.3.4",
"memfs": "3.4.12"
},
"devDependencies": {
"@verdaccio/types": "workspace:11.0.0-6-next.19",
"@verdaccio/config": "workspace:6.0.0-6-next.55",
"@verdaccio/logger": "workspace:6.0.0-6-next.23"
"@verdaccio/config": "workspace:6.0.0-6-next.56",
"@verdaccio/logger": "workspace:6.0.0-6-next.24"
},
"scripts": {
"clean": "rimraf ./build",

View File

@@ -1,5 +1,7 @@
# @verdaccio/ui-theme
## 6.0.0-6-next.56
## 6.0.0-6-next.55
## 6.0.0-6-next.54

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/ui-theme",
"version": "6.0.0-6-next.55",
"version": "6.0.0-6-next.56",
"description": "Verdaccio User Interface",
"author": {
"name": "Verdaccio Contributors",
@@ -27,7 +27,7 @@
"@testing-library/dom": "8.19.1",
"@testing-library/jest-dom": "5.16.5",
"@testing-library/react": "13.4.0",
"@verdaccio/node-api": "workspace:6.0.0-6-next.55",
"@verdaccio/node-api": "workspace:6.0.0-6-next.56",
"@verdaccio/ui-components": "workspace:2.0.0-6-next.2",
"@verdaccio/types": "workspace:*",
"normalize.css": "8.0.1",
@@ -73,7 +73,7 @@
"remark-gfm": "3.0.1",
"rimraf": "3.0.2",
"style-loader": "3.3.1",
"stylelint": "14.16.0",
"stylelint": "14.16.1",
"stylelint-config-recommended": "7.0.0",
"stylelint-config-styled-components": "0.1.1",
"stylelint-processor-styled-components": "1.10.0",

View File

@@ -1,5 +1,16 @@
# @verdaccio/proxy
## 6.0.0-6-next.34
### Patch Changes
- Updated dependencies [a1986e09]
- @verdaccio/utils@6.0.0-6-next.24
- @verdaccio/config@6.0.0-6-next.56
- @verdaccio/local-storage@11.0.0-6-next.26
- @verdaccio/core@6.0.0-6-next.56
- @verdaccio/logger@6.0.0-6-next.24
## 6.0.0-6-next.33
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/proxy",
"version": "6.0.0-6-next.33",
"version": "6.0.0-6-next.34",
"description": "verdaccio proxy fetcher",
"main": "./build/index.js",
"types": "build/index.d.ts",
@@ -39,11 +39,11 @@
"build": "pnpm run build:js && pnpm run build:types"
},
"dependencies": {
"@verdaccio/config": "workspace:6.0.0-6-next.55",
"@verdaccio/core": "workspace:6.0.0-6-next.55",
"@verdaccio/local-storage": "workspace:11.0.0-6-next.25",
"@verdaccio/logger": "workspace:6.0.0-6-next.23",
"@verdaccio/utils": "workspace:6.0.0-6-next.23",
"@verdaccio/config": "workspace:6.0.0-6-next.56",
"@verdaccio/core": "workspace:6.0.0-6-next.56",
"@verdaccio/local-storage": "workspace:11.0.0-6-next.26",
"@verdaccio/logger": "workspace:6.0.0-6-next.24",
"@verdaccio/utils": "workspace:6.0.0-6-next.24",
"JSONStream": "1.3.5",
"debug": "4.3.4",
"lodash": "4.17.21",

View File

@@ -1,5 +1,22 @@
# @verdaccio/server
## 6.0.0-6-next.45
### Patch Changes
- Updated dependencies [a1986e09]
- @verdaccio/api@6.0.0-6-next.39
- @verdaccio/middleware@6.0.0-6-next.35
- @verdaccio/utils@6.0.0-6-next.24
- @verdaccio/web@6.0.0-6-next.43
- @verdaccio/auth@6.0.0-6-next.35
- @verdaccio/config@6.0.0-6-next.56
- @verdaccio/store@6.0.0-6-next.36
- verdaccio-audit@11.0.0-6-next.19
- @verdaccio/loaders@6.0.0-6-next.25
- @verdaccio/core@6.0.0-6-next.56
- @verdaccio/logger@6.0.0-6-next.24
## 6.0.0-6-next.44
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/server",
"version": "6.0.0-6-next.44",
"version": "6.0.0-6-next.45",
"description": "server logic",
"main": "./build/index.js",
"types": "build/index.d.ts",
@@ -30,17 +30,17 @@
"npm": ">=6"
},
"dependencies": {
"@verdaccio/api": "workspace:6.0.0-6-next.38",
"@verdaccio/auth": "workspace:6.0.0-6-next.34",
"@verdaccio/core": "workspace:6.0.0-6-next.55",
"@verdaccio/config": "workspace:6.0.0-6-next.55",
"@verdaccio/loaders": "workspace:6.0.0-6-next.24",
"@verdaccio/logger": "workspace:6.0.0-6-next.23",
"@verdaccio/middleware": "workspace:6.0.0-6-next.34",
"@verdaccio/store": "workspace:6.0.0-6-next.35",
"@verdaccio/utils": "workspace:6.0.0-6-next.23",
"@verdaccio/web": "workspace:6.0.0-6-next.42",
"verdaccio-audit": "workspace:11.0.0-6-next.18",
"@verdaccio/api": "workspace:6.0.0-6-next.39",
"@verdaccio/auth": "workspace:6.0.0-6-next.35",
"@verdaccio/core": "workspace:6.0.0-6-next.56",
"@verdaccio/config": "workspace:6.0.0-6-next.56",
"@verdaccio/loaders": "workspace:6.0.0-6-next.25",
"@verdaccio/logger": "workspace:6.0.0-6-next.24",
"@verdaccio/middleware": "workspace:6.0.0-6-next.35",
"@verdaccio/store": "workspace:6.0.0-6-next.36",
"@verdaccio/utils": "workspace:6.0.0-6-next.24",
"@verdaccio/web": "workspace:6.0.0-6-next.43",
"verdaccio-audit": "workspace:11.0.0-6-next.19",
"compression": "1.7.4",
"cors": "2.8.5",
"debug": "4.3.4",
@@ -50,7 +50,7 @@
},
"devDependencies": {
"@types/node": "16.18.10",
"@verdaccio/proxy": "workspace:6.0.0-6-next.33",
"@verdaccio/proxy": "workspace:6.0.0-6-next.34",
"@verdaccio/test-helper": "workspace:2.0.0-6-next.6",
"http-errors": "1.8.1"
},

View File

@@ -1,5 +1,18 @@
# @verdaccio/server-fastify
## 6.0.0-6-next.37
### Patch Changes
- Updated dependencies [a1986e09]
- @verdaccio/utils@6.0.0-6-next.24
- @verdaccio/auth@6.0.0-6-next.35
- @verdaccio/config@6.0.0-6-next.56
- @verdaccio/tarball@11.0.0-6-next.25
- @verdaccio/store@6.0.0-6-next.36
- @verdaccio/core@6.0.0-6-next.56
- @verdaccio/logger@6.0.0-6-next.24
## 6.0.0-6-next.36
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/server-fastify",
"version": "6.0.0-6-next.36",
"version": "6.0.0-6-next.37",
"description": "fastify server api implementation",
"keywords": [
"private",
@@ -34,13 +34,13 @@
"access": "public"
},
"dependencies": {
"@verdaccio/core": "workspace:6.0.0-6-next.55",
"@verdaccio/config": "workspace:6.0.0-6-next.55",
"@verdaccio/auth": "workspace:6.0.0-6-next.34",
"@verdaccio/logger": "workspace:6.0.0-6-next.23",
"@verdaccio/store": "workspace:6.0.0-6-next.35",
"@verdaccio/tarball": "workspace:11.0.0-6-next.24",
"@verdaccio/utils": "workspace:6.0.0-6-next.23",
"@verdaccio/core": "workspace:6.0.0-6-next.56",
"@verdaccio/config": "workspace:6.0.0-6-next.56",
"@verdaccio/auth": "workspace:6.0.0-6-next.35",
"@verdaccio/logger": "workspace:6.0.0-6-next.24",
"@verdaccio/store": "workspace:6.0.0-6-next.36",
"@verdaccio/tarball": "workspace:11.0.0-6-next.25",
"@verdaccio/utils": "workspace:6.0.0-6-next.24",
"core-js": "3.27.0",
"debug": "4.3.4",
"fastify": "4.10.2",

View File

@@ -32,8 +32,8 @@
"homepage": "https://verdaccio.org",
"license": "MIT",
"devDependencies": {
"@verdaccio/cli": "workspace:6.0.0-6-next.55",
"@verdaccio/ui-theme": "workspace:6.0.0-6-next.55",
"@verdaccio/cli": "workspace:6.0.0-6-next.56",
"@verdaccio/ui-theme": "workspace:6.0.0-6-next.56",
"fs-extra": "10.1.0",
"webpack": "5.75.0",
"webpack-bundle-analyzer": "4.7.0",

View File

@@ -1,5 +1,21 @@
# @verdaccio/store
## 6.0.0-6-next.36
### Patch Changes
- Updated dependencies [a1986e09]
- @verdaccio/utils@6.0.0-6-next.24
- @verdaccio/config@6.0.0-6-next.56
- @verdaccio/tarball@11.0.0-6-next.25
- @verdaccio/local-storage@11.0.0-6-next.26
- @verdaccio/proxy@6.0.0-6-next.34
- @verdaccio/hooks@6.0.0-6-next.26
- @verdaccio/loaders@6.0.0-6-next.25
- @verdaccio/core@6.0.0-6-next.56
- @verdaccio/url@11.0.0-6-next.22
- @verdaccio/logger@6.0.0-6-next.24
## 6.0.0-6-next.35
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/store",
"version": "6.0.0-6-next.35",
"version": "6.0.0-6-next.36",
"description": "loaders logic",
"main": "./build/index.js",
"types": "build/index.d.ts",
@@ -39,16 +39,16 @@
"build": "pnpm run build:js && pnpm run build:types"
},
"dependencies": {
"@verdaccio/config": "workspace:6.0.0-6-next.55",
"@verdaccio/core": "workspace:6.0.0-6-next.55",
"@verdaccio/hooks": "workspace:6.0.0-6-next.25",
"@verdaccio/loaders": "workspace:6.0.0-6-next.24",
"@verdaccio/local-storage": "workspace:11.0.0-6-next.25",
"@verdaccio/logger": "workspace:6.0.0-6-next.23",
"@verdaccio/proxy": "workspace:6.0.0-6-next.33",
"@verdaccio/url": "workspace:11.0.0-6-next.21",
"@verdaccio/utils": "workspace:6.0.0-6-next.23",
"@verdaccio/tarball": "workspace:11.0.0-6-next.24",
"@verdaccio/config": "workspace:6.0.0-6-next.56",
"@verdaccio/core": "workspace:6.0.0-6-next.56",
"@verdaccio/hooks": "workspace:6.0.0-6-next.26",
"@verdaccio/loaders": "workspace:6.0.0-6-next.25",
"@verdaccio/local-storage": "workspace:11.0.0-6-next.26",
"@verdaccio/logger": "workspace:6.0.0-6-next.24",
"@verdaccio/proxy": "workspace:6.0.0-6-next.34",
"@verdaccio/url": "workspace:11.0.0-6-next.22",
"@verdaccio/utils": "workspace:6.0.0-6-next.24",
"@verdaccio/tarball": "workspace:11.0.0-6-next.25",
"JSONStream": "1.3.5",
"debug": "4.3.4",
"lodash": "4.17.21",

View File

@@ -3,11 +3,11 @@
{
"id": 558752,
"login": "juanpicado",
"contributions": 4949,
"contributions": 4956,
"repositories": [
{
"name": "verdaccio",
"contributions": 2666
"contributions": 2670
},
{
"name": "verdaccio-cookbook",
@@ -59,7 +59,7 @@
},
{
"name": "monorepo",
"contributions": 186
"contributions": 187
},
{
"name": "authentication-plugin-sample",
@@ -135,7 +135,7 @@
},
{
"name": "e2e-5.x",
"contributions": 42
"contributions": 44
}
]
},
@@ -4751,7 +4751,7 @@
"full_name": "verdaccio/verdaccio",
"html_url": "https://github.com/verdaccio/verdaccio",
"description": "📦🔐 A lightweight Node.js private proxy registry",
"stargazers_count": 14363,
"stargazers_count": 14365,
"archived": false
},
{

View File

@@ -13,13 +13,13 @@
},
"dependencies": {
"eslint-config-google": "0.14.0",
"eslint-config-prettier": "8.5.0",
"eslint-config-prettier": "8.6.0",
"eslint-plugin-babel": "5.3.1",
"eslint-plugin-import": "2.26.0",
"eslint-plugin-import": "2.27.5",
"eslint-plugin-jest": "26.9.0",
"eslint-plugin-jsx-a11y": "6.6.1",
"eslint-plugin-jsx-a11y": "6.7.1",
"eslint-plugin-prettier": "4.2.1",
"eslint-plugin-react": "7.31.11",
"eslint-plugin-react": "7.32.2",
"eslint-plugin-cypress": "2.12.1",
"eslint-plugin-react-hooks": "4.6.0",
"eslint-plugin-simple-import-sort": "7.0.0",

View File

@@ -10,11 +10,11 @@
"types": "build/index.d.ts",
"devDependencies": {
"@verdaccio/types": "workspace:11.0.0-6-next.19",
"@verdaccio/auth": "workspace:6.0.0-6-next.34",
"@verdaccio/core": "workspace:6.0.0-6-next.55",
"@verdaccio/config": "workspace:6.0.0-6-next.55",
"@verdaccio/middleware": "workspace:6.0.0-6-next.34",
"@verdaccio/utils": "workspace:6.0.0-6-next.23",
"@verdaccio/auth": "workspace:6.0.0-6-next.35",
"@verdaccio/core": "workspace:6.0.0-6-next.56",
"@verdaccio/config": "workspace:6.0.0-6-next.56",
"@verdaccio/middleware": "workspace:6.0.0-6-next.35",
"@verdaccio/utils": "workspace:6.0.0-6-next.24",
"body-parser": "1.20.1",
"express": "4.18.2",
"supertest": "6.3.3",

View File

@@ -10,9 +10,9 @@
"types": "build/index.d.ts",
"devDependencies": {
"@verdaccio/types": "workspace:11.0.0-6-next.19",
"@verdaccio/core": "workspace:6.0.0-6-next.55",
"@verdaccio/config": "workspace:6.0.0-6-next.55",
"verdaccio": "6.0.0-6-next.55",
"@verdaccio/core": "workspace:6.0.0-6-next.56",
"@verdaccio/config": "workspace:6.0.0-6-next.56",
"verdaccio": "6.0.0-6-next.56",
"ts-node": "10.9.1"
},
"scripts": {

View File

@@ -12,7 +12,7 @@
"approvalProgress": 23
},
"fr": {
"translationProgress": 23,
"translationProgress": 27,
"approvalProgress": 23
},
"gl": {
@@ -20,7 +20,7 @@
"approvalProgress": 1
},
"it": {
"translationProgress": 68,
"translationProgress": 100,
"approvalProgress": 66
},
"ja": {

View File

@@ -1,5 +1,15 @@
# @verdaccio/utils
## 6.0.0-6-next.24
### Minor Changes
- a1986e09: feat: expose middleware utils
### Patch Changes
- @verdaccio/core@6.0.0-6-next.56
## 6.0.0-6-next.23
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/utils",
"version": "6.0.0-6-next.23",
"version": "6.0.0-6-next.24",
"description": "verdaccio utilities",
"main": "./build/index.js",
"types": "build/index.d.ts",
@@ -29,7 +29,7 @@
"node": ">=12"
},
"dependencies": {
"@verdaccio/core": "workspace:6.0.0-6-next.55",
"@verdaccio/core": "workspace:6.0.0-6-next.56",
"minimatch": "3.1.2",
"semver": "7.3.8",
"lodash": "4.17.21"

View File

@@ -3,3 +3,4 @@ export * from './utils';
export * from './crypto-utils';
export * from './replace-lodash';
export * from './matcher';
export * from './middleware-utils';

View File

@@ -1,5 +1,19 @@
# verdaccio
## 6.0.0-6-next.56
### Patch Changes
- Updated dependencies [a1986e09]
- @verdaccio/utils@6.0.0-6-next.24
- @verdaccio/node-api@6.0.0-6-next.56
- @verdaccio/hooks@6.0.0-6-next.26
- verdaccio-audit@11.0.0-6-next.19
- @verdaccio/cli@6.0.0-6-next.56
- verdaccio-htpasswd@11.0.0-6-next.26
- @verdaccio/ui-theme@6.0.0-6-next.56
- @verdaccio/logger@6.0.0-6-next.24
## 6.0.0-6-next.55
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "verdaccio",
"version": "6.0.0-6-next.55",
"version": "6.0.0-6-next.56",
"description": "A lightweight private npm proxy registry",
"main": "build/index.js",
"types": "build/index.d.ts",
@@ -38,20 +38,20 @@
},
"homepage": "https://verdaccio.org",
"dependencies": {
"@verdaccio/cli": "workspace:6.0.0-6-next.55",
"@verdaccio/hooks": "workspace:6.0.0-6-next.25",
"@verdaccio/logger": "workspace:6.0.0-6-next.23",
"@verdaccio/node-api": "workspace:6.0.0-6-next.55",
"@verdaccio/ui-theme": "workspace:6.0.0-6-next.55",
"@verdaccio/utils": "workspace:6.0.0-6-next.23",
"verdaccio-audit": "workspace:11.0.0-6-next.18",
"verdaccio-htpasswd": "workspace:11.0.0-6-next.25"
"@verdaccio/cli": "workspace:6.0.0-6-next.56",
"@verdaccio/hooks": "workspace:6.0.0-6-next.26",
"@verdaccio/logger": "workspace:6.0.0-6-next.24",
"@verdaccio/node-api": "workspace:6.0.0-6-next.56",
"@verdaccio/ui-theme": "workspace:6.0.0-6-next.56",
"@verdaccio/utils": "workspace:6.0.0-6-next.24",
"verdaccio-audit": "workspace:11.0.0-6-next.19",
"verdaccio-htpasswd": "workspace:11.0.0-6-next.26"
},
"devDependencies": {
"@verdaccio/auth": "workspace:6.0.0-6-next.34",
"@verdaccio/core": "workspace:6.0.0-6-next.55",
"@verdaccio/config": "workspace:6.0.0-6-next.55",
"@verdaccio/store": "workspace:6.0.0-6-next.35",
"@verdaccio/auth": "workspace:6.0.0-6-next.35",
"@verdaccio/core": "workspace:6.0.0-6-next.56",
"@verdaccio/config": "workspace:6.0.0-6-next.56",
"@verdaccio/store": "workspace:6.0.0-6-next.36",
"@verdaccio/test-helper": "workspace:2.0.0-6-next.6",
"fastify": "4.10.2",
"yaml": "2.2.0",

View File

@@ -1,5 +1,25 @@
# @verdaccio/web
## 6.0.0-6-next.43
### Minor Changes
- a1986e09: feat: expose middleware utils
### Patch Changes
- Updated dependencies [a1986e09]
- @verdaccio/middleware@6.0.0-6-next.35
- @verdaccio/utils@6.0.0-6-next.24
- @verdaccio/auth@6.0.0-6-next.35
- @verdaccio/config@6.0.0-6-next.56
- @verdaccio/tarball@11.0.0-6-next.25
- @verdaccio/store@6.0.0-6-next.36
- @verdaccio/loaders@6.0.0-6-next.25
- @verdaccio/core@6.0.0-6-next.56
- @verdaccio/url@11.0.0-6-next.22
- @verdaccio/logger@6.0.0-6-next.24
## 6.0.0-6-next.42
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/web",
"version": "6.0.0-6-next.42",
"version": "6.0.0-6-next.43",
"description": "web ui middleware",
"main": "./build/index.js",
"types": "build/index.d.ts",
@@ -25,16 +25,16 @@
},
"license": "MIT",
"dependencies": {
"@verdaccio/auth": "workspace:6.0.0-6-next.34",
"@verdaccio/core": "workspace:6.0.0-6-next.55",
"@verdaccio/config": "workspace:6.0.0-6-next.55",
"@verdaccio/loaders": "workspace:6.0.0-6-next.24",
"@verdaccio/logger": "workspace:6.0.0-6-next.23",
"@verdaccio/middleware": "workspace:6.0.0-6-next.34",
"@verdaccio/store": "workspace:6.0.0-6-next.35",
"@verdaccio/tarball": "workspace:11.0.0-6-next.24",
"@verdaccio/url": "workspace:11.0.0-6-next.21",
"@verdaccio/utils": "workspace:6.0.0-6-next.23",
"@verdaccio/auth": "workspace:6.0.0-6-next.35",
"@verdaccio/core": "workspace:6.0.0-6-next.56",
"@verdaccio/config": "workspace:6.0.0-6-next.56",
"@verdaccio/loaders": "workspace:6.0.0-6-next.25",
"@verdaccio/logger": "workspace:6.0.0-6-next.24",
"@verdaccio/middleware": "workspace:6.0.0-6-next.35",
"@verdaccio/store": "workspace:6.0.0-6-next.36",
"@verdaccio/tarball": "workspace:11.0.0-6-next.25",
"@verdaccio/url": "workspace:11.0.0-6-next.22",
"@verdaccio/utils": "workspace:6.0.0-6-next.24",
"body-parser": "1.20.1",
"debug": "4.3.4",
"express": "4.18.2",
@@ -45,14 +45,14 @@
"@types/node": "16.18.10",
"@verdaccio/types": "workspace:11.0.0-6-next.19",
"@verdaccio/test-helper": "workspace:2.0.0-6-next.6",
"@verdaccio/api": "workspace:6.0.0-6-next.38",
"@verdaccio/api": "workspace:6.0.0-6-next.39",
"node-html-parser": "4.1.5",
"supertest": "6.3.3",
"nock": "13.2.9",
"jsdom": "20.0.3",
"undici": "4.16.0",
"verdaccio-auth-memory": "workspace:11.0.0-6-next.20",
"verdaccio-memory": "workspace:11.0.0-6-next.22"
"verdaccio-auth-memory": "workspace:11.0.0-6-next.21",
"verdaccio-memory": "workspace:11.0.0-6-next.23"
},
"scripts": {
"clean": "rimraf ./build",

View File

@@ -2,7 +2,7 @@ import bodyParser from 'body-parser';
import { Router } from 'express';
import { Auth } from '@verdaccio/auth';
import { match, validateName, validatePackage } from '@verdaccio/middleware';
import { validateName, validatePackage } from '@verdaccio/middleware';
import { Storage } from '@verdaccio/store';
import { Config } from '@verdaccio/types';
@@ -17,7 +17,6 @@ export function webAPI(config: Config, auth: Auth, storage: Storage): Router {
route.param('package', validatePackage);
route.param('filename', validateName);
route.param('version', validateName);
route.param('anything', match(/.*/));
route.use(bodyParser.urlencoded({ extended: false }));
route.use(auth.webUIJWTmiddleware());
route.use(setSecurityWebHeaders);

1462
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
{
"private": true,
"name": "@verdaccio/website",
"version": "5.19.2-6-next.0",
"version": "5.20.1",
"scripts": {
"docusaurus": "docusaurus",
"start": "docusaurus start --no-open",

View File

@@ -10,7 +10,7 @@
"bundled": true,
"description": "Verdaccio Middleware plugin to bypass npmjs audit",
"latest": "10.2.4",
"downloads": 435155,
"downloads": 447677,
"registry": "https://registry.npmjs.org/verdaccio-audit"
},
{
@@ -21,7 +21,7 @@
"bundled": true,
"description": "Local storage implementation",
"latest": "10.3.1",
"downloads": 432004,
"downloads": 444417,
"registry": "https://registry.npmjs.org/@verdaccio/local-storage"
},
{
@@ -32,7 +32,7 @@
"bundled": true,
"description": "Verdaccio User Interface",
"latest": "3.4.1",
"downloads": 427370,
"downloads": 438532,
"registry": "https://registry.npmjs.org/@verdaccio/ui-theme"
},
{
@@ -43,7 +43,7 @@
"bundled": false,
"description": "Storage implementation in memory",
"latest": "10.3.0",
"downloads": 15442,
"downloads": 17144,
"registry": "https://registry.npmjs.org/verdaccio-memory"
},
{
@@ -54,7 +54,7 @@
"bundled": false,
"description": "AWS S3 storage implementation for Verdaccio",
"latest": "10.3.0",
"downloads": 2390,
"downloads": 2474,
"registry": "https://registry.npmjs.org/verdaccio-aws-s3-storage"
},
{
@@ -65,7 +65,7 @@
"bundled": false,
"description": "Google Cloud storage implementation for Verdaccio",
"latest": "10.2.0",
"downloads": 188,
"downloads": 189,
"registry": "https://registry.npmjs.org/verdaccio-google-cloud"
},
{
@@ -76,7 +76,7 @@
"bundled": false,
"description": "Auth plugin for Verdaccio that keeps users in memory",
"latest": "10.2.0",
"downloads": 62237,
"downloads": 68261,
"registry": "https://registry.npmjs.org/verdaccio-auth-memory"
},
{
@@ -86,8 +86,8 @@
"origin": "core",
"bundled": true,
"description": "htpasswd auth plugin for Verdaccio",
"latest": "10.5.1",
"downloads": 439297,
"latest": "10.5.2",
"downloads": 452284,
"registry": "https://registry.npmjs.org/verdaccio-htpasswd"
},
{
@@ -120,7 +120,7 @@
"origin": "community",
"category": "authentication",
"latest": "1.2.2",
"downloads": 78,
"downloads": 79,
"registry": "https://registry.npmjs.org/@playerdata/verdaccio-storage-expiry"
},
{
@@ -131,7 +131,7 @@
"origin": "community",
"category": "authentication",
"latest": "1.4.1",
"downloads": 7,
"downloads": 8,
"registry": "https://registry.npmjs.org/verdaccio-ldap-memcached"
},
{
@@ -142,7 +142,7 @@
"origin": "community",
"category": "authentication",
"latest": "3.0.1",
"downloads": 58,
"downloads": 51,
"registry": "https://registry.npmjs.org/verdaccio-bitbucket"
},
{
@@ -153,7 +153,7 @@
"origin": "community",
"category": "authentication",
"latest": "1.0.0",
"downloads": 4,
"downloads": 3,
"registry": "https://registry.npmjs.org/verdaccio-redis-search-patch"
},
{
@@ -164,7 +164,7 @@
"origin": "community",
"category": "authentication",
"latest": "2.0.6",
"downloads": 7,
"downloads": 8,
"registry": "https://registry.npmjs.org/verdaccio-auther-memory"
},
{
@@ -175,7 +175,7 @@
"origin": "community",
"category": "authentication",
"latest": "0.1.73",
"downloads": 568,
"downloads": 491,
"registry": "https://registry.npmjs.org/verdaccio-git"
},
{
@@ -186,7 +186,7 @@
"origin": "community",
"category": "authentication",
"latest": "6.0.0",
"downloads": 294,
"downloads": 285,
"registry": "https://registry.npmjs.org/verdaccio-ldap"
},
{
@@ -197,7 +197,7 @@
"origin": "community",
"category": "authentication",
"latest": "1.0.6",
"downloads": 12,
"downloads": 13,
"registry": "https://registry.npmjs.org/verdaccio-ldap-node"
},
{
@@ -208,7 +208,7 @@
"origin": "community",
"category": "authentication",
"latest": "1.0.0",
"downloads": 3,
"downloads": 4,
"registry": "https://registry.npmjs.org/verdaccio-badger"
},
{
@@ -230,7 +230,7 @@
"origin": "community",
"category": "authentication",
"latest": "2.0.2",
"downloads": 16,
"downloads": 14,
"registry": "https://registry.npmjs.org/@xlts.dev/verdaccio-prometheus-middleware"
},
{
@@ -241,7 +241,7 @@
"origin": "community",
"category": "authentication",
"latest": "1.0.5",
"downloads": 27,
"downloads": 26,
"registry": "https://registry.npmjs.org/verdaccio-github-auth"
},
{
@@ -252,7 +252,7 @@
"origin": "community",
"category": "authentication",
"latest": "3.0.1",
"downloads": 56,
"downloads": 64,
"registry": "https://registry.npmjs.org/verdaccio-gitlab"
},
{
@@ -263,7 +263,7 @@
"origin": "community",
"category": "authentication",
"latest": "1.3.4",
"downloads": 39,
"downloads": 41,
"registry": "https://registry.npmjs.org/verdaccio-bitbucket-server"
},
{
@@ -274,7 +274,7 @@
"origin": "community",
"category": "authentication",
"latest": "1.0.1",
"downloads": 47,
"downloads": 44,
"registry": "https://registry.npmjs.org/verdaccio-package-count"
},
{
@@ -285,7 +285,7 @@
"origin": "community",
"category": "authentication",
"latest": "1.0.2",
"downloads": 88,
"downloads": 86,
"registry": "https://registry.npmjs.org/verdaccio-activedirectory"
},
{
@@ -296,7 +296,7 @@
"origin": "community",
"category": "authentication",
"latest": "0.2.7",
"downloads": 40,
"downloads": 28,
"registry": "https://registry.npmjs.org/verdaccio-profile-api"
},
{
@@ -307,7 +307,7 @@
"origin": "community",
"category": "authentication",
"latest": "1.1.8",
"downloads": 12,
"downloads": 13,
"registry": "https://registry.npmjs.org/verdaccio-dynamodb"
},
{
@@ -318,7 +318,7 @@
"origin": "community",
"category": "authentication",
"latest": "0.2.5",
"downloads": 322,
"downloads": 491,
"registry": "https://registry.npmjs.org/verdaccio-minio"
},
{
@@ -329,7 +329,7 @@
"origin": "community",
"category": "authentication",
"latest": "1.2.3",
"downloads": 81,
"downloads": 115,
"registry": "https://registry.npmjs.org/verdaccio-redis-storage"
},
{
@@ -363,7 +363,7 @@
"url": "https://www.npmjs.org/@m03geek/verdaccio-google-cloud",
"registry": "https://registry.npmjs.org/@m03geek/verdaccio-google-cloud",
"latest": "0.1.0",
"downloads": 4
"downloads": 5
},
{
"name": "verdaccio-storage-proxy",
@@ -374,7 +374,7 @@
"url": "https://www.npmjs.org/verdaccio-storage-proxy",
"registry": "https://registry.npmjs.org/verdaccio-storage-proxy",
"latest": "0.0.11",
"downloads": 43
"downloads": 79
},
{
"name": "verdaccio-local-storage-advance",
@@ -385,7 +385,7 @@
"url": "https://www.npmjs.org/verdaccio-local-storage-advance",
"registry": "https://registry.npmjs.org/verdaccio-local-storage-advance",
"latest": "0.0.10",
"downloads": 17
"downloads": 16
},
{
"name": "verdaccio-kuzzle",
@@ -396,7 +396,7 @@
"url": "https://www.npmjs.org/verdaccio-kuzzle",
"registry": "https://registry.npmjs.org/verdaccio-kuzzle",
"latest": "1.0.9",
"downloads": 24
"downloads": 25
},
{
"name": "verdaccio-dist-tag-control",
@@ -407,7 +407,7 @@
"url": "https://www.npmjs.org/verdaccio-dist-tag-control",
"registry": "https://registry.npmjs.org/verdaccio-dist-tag-control",
"latest": "1.0.2",
"downloads": 7
"downloads": 8
},
{
"name": "verdaccio-doreamon-oauth2",
@@ -418,7 +418,7 @@
"url": "https://www.npmjs.org/verdaccio-doreamon-oauth2",
"registry": "https://registry.npmjs.org/verdaccio-doreamon-oauth2",
"latest": "1.2.0",
"downloads": 41
"downloads": 34
},
{
"name": "@outcome-co/verdaccio-google-cloud",
@@ -429,7 +429,7 @@
"url": "https://www.npmjs.org/@outcome-co/verdaccio-google-cloud",
"registry": "https://registry.npmjs.org/@outcome-co/verdaccio-google-cloud",
"latest": "1.1.8",
"downloads": 24
"downloads": 25
},
{
"name": "verdaccio-pg-storage",
@@ -440,7 +440,7 @@
"url": "https://www.npmjs.org/verdaccio-pg-storage",
"registry": "https://registry.npmjs.org/verdaccio-pg-storage",
"latest": "1.0.3",
"downloads": 18
"downloads": 19
},
{
"name": "verdaccio-local-storage-with-cache-db",
@@ -451,7 +451,7 @@
"url": "https://www.npmjs.org/verdaccio-local-storage-with-cache-db",
"registry": "https://registry.npmjs.org/verdaccio-local-storage-with-cache-db",
"latest": "9.7.7",
"downloads": 14
"downloads": 15
},
{
"name": "verdaccio-offline-storage",
@@ -462,7 +462,7 @@
"url": "https://www.npmjs.org/verdaccio-offline-storage",
"registry": "https://registry.npmjs.org/verdaccio-offline-storage",
"latest": "2.0.0",
"downloads": 64
"downloads": 62
},
{
"name": "verdaccio-aliyunoss-storage",
@@ -473,7 +473,7 @@
"url": "https://www.npmjs.org/verdaccio-aliyunoss-storage",
"registry": "https://registry.npmjs.org/verdaccio-aliyunoss-storage",
"latest": "1.0.10",
"downloads": 26
"downloads": 29
},
{
"name": "verdaccio-openid-connect",
@@ -484,7 +484,7 @@
"url": "https://www.npmjs.org/verdaccio-openid-connect",
"registry": "https://registry.npmjs.org/verdaccio-openid-connect",
"latest": "1.4.0",
"downloads": 51
"downloads": 59
},
{
"name": "verdaccio-github-oauth-ui",
@@ -495,7 +495,7 @@
"url": "https://www.npmjs.org/verdaccio-github-oauth-ui",
"registry": "https://registry.npmjs.org/verdaccio-github-oauth-ui",
"latest": "6.0.0",
"downloads": 790
"downloads": 827
},
{
"name": "verdaccio-github-oauth",
@@ -506,7 +506,7 @@
"url": "https://www.npmjs.org/verdaccio-github-oauth",
"registry": "https://registry.npmjs.org/verdaccio-github-oauth",
"latest": "1.1.0",
"downloads": 117
"downloads": 101
},
{
"name": "verdaccio-auth-gitlab",
@@ -517,7 +517,7 @@
"url": "https://www.npmjs.org/verdaccio-auth-gitlab",
"registry": "https://registry.npmjs.org/verdaccio-auth-gitlab",
"latest": "2.0.0-beta.11",
"downloads": 102
"downloads": 154
},
{
"name": "verdaccio-auth0-ui",
@@ -528,7 +528,7 @@
"url": "https://www.npmjs.org/verdaccio-auth0-ui",
"registry": "https://registry.npmjs.org/verdaccio-auth0-ui",
"latest": "3.0.0",
"downloads": 24
"downloads": 26
},
{
"name": "verdaccio-tagauth",
@@ -550,7 +550,7 @@
"url": "https://www.npmjs.org/verdaccio-gitea-auth",
"registry": "https://registry.npmjs.org/verdaccio-gitea-auth",
"latest": "0.1.4",
"downloads": 14
"downloads": 15
},
{
"name": "verdaccio-platformatic-auth",
@@ -572,7 +572,7 @@
"url": "https://www.npmjs.org/verdaccio-google-oauth",
"registry": "https://registry.npmjs.org/verdaccio-google-oauth",
"latest": "1.0.1",
"downloads": 93
"downloads": 112
},
{
"name": "verdaccio-passport-google-oauth-ui",
@@ -583,7 +583,7 @@
"url": "https://www.npmjs.org/verdaccio-passport-google-oauth-ui",
"registry": "https://registry.npmjs.org/verdaccio-passport-google-oauth-ui",
"latest": "0.0.10",
"downloads": 106
"downloads": 116
},
{
"name": "verdaccio-aukilabs-npm-auth",
@@ -605,7 +605,7 @@
"url": "https://www.npmjs.org/verdaccio-gitlab-hilio",
"registry": "https://registry.npmjs.org/verdaccio-gitlab-hilio",
"latest": "1.1.17",
"downloads": 65
"downloads": 46
},
{
"name": "verdaccio-auth-knex",
@@ -616,7 +616,7 @@
"url": "https://www.npmjs.org/verdaccio-auth-knex",
"registry": "https://registry.npmjs.org/verdaccio-auth-knex",
"latest": "1.0.3",
"downloads": 9
"downloads": 11
},
{
"name": "verdaccio-qnapldap",
@@ -638,7 +638,7 @@
"url": "https://www.npmjs.org/verdaccio-fast-ldap",
"registry": "https://registry.npmjs.org/verdaccio-fast-ldap",
"latest": "4.2.1",
"downloads": 2
"downloads": 3
},
{
"name": "verdaccio-gitlab-oauth",
@@ -649,7 +649,7 @@
"url": "https://www.npmjs.org/verdaccio-gitlab-oauth",
"registry": "https://registry.npmjs.org/verdaccio-gitlab-oauth",
"latest": "1.0.4",
"downloads": 27
"downloads": 29
},
{
"name": "verdaccio-group-htpasswd",
@@ -660,7 +660,7 @@
"url": "https://www.npmjs.org/verdaccio-group-htpasswd",
"registry": "https://registry.npmjs.org/verdaccio-group-htpasswd",
"latest": "1.0.0",
"downloads": 2
"downloads": 3
},
{
"name": "verdaccio-groups",
@@ -671,7 +671,7 @@
"url": "https://www.npmjs.org/verdaccio-groups",
"registry": "https://registry.npmjs.org/verdaccio-groups",
"latest": "1.2.0",
"downloads": 40
"downloads": 41
},
{
"name": "verdaccio-github-token",
@@ -682,7 +682,7 @@
"url": "https://www.npmjs.org/verdaccio-github-token",
"registry": "https://registry.npmjs.org/verdaccio-github-token",
"latest": "1.0.0",
"downloads": 8
"downloads": 7
},
{
"name": "verdaccio-mysql",
@@ -693,7 +693,7 @@
"url": "https://www.npmjs.org/verdaccio-mysql",
"registry": "https://registry.npmjs.org/verdaccio-mysql",
"latest": "1.0.1",
"downloads": 9
"downloads": 8
},
{
"name": "verdaccio-qlchatauth",
@@ -704,7 +704,7 @@
"url": "https://www.npmjs.org/verdaccio-qlchatauth",
"registry": "https://registry.npmjs.org/verdaccio-qlchatauth",
"latest": "0.0.9",
"downloads": 22
"downloads": 31
},
{
"name": "verdaccio-azure-ad-login",
@@ -726,7 +726,7 @@
"url": "https://www.npmjs.org/verdaccio-oidc",
"registry": "https://registry.npmjs.org/verdaccio-oidc",
"latest": "0.0.0-namesquat",
"downloads": 3
"downloads": 4
},
{
"name": "verdaccio-regman",
@@ -737,7 +737,7 @@
"url": "https://www.npmjs.org/verdaccio-regman",
"registry": "https://registry.npmjs.org/verdaccio-regman",
"latest": "1.0.5",
"downloads": 16
"downloads": 17
},
{
"name": "verdaccio-level-auth",
@@ -759,7 +759,7 @@
"url": "https://www.npmjs.org/verdaccio-activedirectory-extended",
"registry": "https://registry.npmjs.org/verdaccio-activedirectory-extended",
"latest": "1.4.3",
"downloads": 12
"downloads": 13
},
{
"name": "verdaccio-acl-plugin",
@@ -770,7 +770,7 @@
"url": "https://www.npmjs.org/verdaccio-acl-plugin",
"registry": "https://registry.npmjs.org/verdaccio-acl-plugin",
"latest": "1.0.1",
"downloads": 5
"downloads": 9
},
{
"name": "verdaccio-auth-bearer",
@@ -781,7 +781,7 @@
"url": "https://www.npmjs.org/verdaccio-auth-bearer",
"registry": "https://registry.npmjs.org/verdaccio-auth-bearer",
"latest": "2.5.0",
"downloads": 6
"downloads": 7
},
{
"name": "verdaccio-steedos",
@@ -792,7 +792,7 @@
"url": "https://www.npmjs.org/verdaccio-steedos",
"registry": "https://registry.npmjs.org/verdaccio-steedos",
"latest": "1.0.0",
"downloads": 3
"downloads": 6
},
{
"name": "verdaccio-sqlite",
@@ -803,7 +803,7 @@
"url": "https://www.npmjs.org/verdaccio-sqlite",
"registry": "https://registry.npmjs.org/verdaccio-sqlite",
"latest": "1.0.2",
"downloads": 16
"downloads": 19
},
{
"name": "verdaccio-sqlite",
@@ -814,7 +814,7 @@
"url": "https://www.npmjs.org/verdaccio-sqlite",
"registry": "https://registry.npmjs.org/verdaccio-sqlite",
"latest": "1.0.2",
"downloads": 16
"downloads": 19
},
{
"name": "verdaccio-simplegroup",
@@ -825,7 +825,7 @@
"url": "https://www.npmjs.org/verdaccio-simplegroup",
"registry": "https://registry.npmjs.org/verdaccio-simplegroup",
"latest": "1.0.2",
"downloads": 12
"downloads": 13
},
{
"name": "verdaccio-betaversion",
@@ -836,7 +836,7 @@
"url": "https://www.npmjs.org/verdaccio-betaversion",
"registry": "https://registry.npmjs.org/verdaccio-betaversion",
"latest": "1.0.3",
"downloads": 10
"downloads": 11
},
{
"name": "verdaccio-auth-username",
@@ -847,7 +847,7 @@
"url": "https://www.npmjs.org/verdaccio-auth-username",
"registry": "https://registry.npmjs.org/verdaccio-auth-username",
"latest": "1.1.2",
"downloads": 27
"downloads": 28
},
{
"name": "verdaccio-apm-login",
@@ -858,7 +858,7 @@
"url": "https://www.npmjs.org/verdaccio-apm-login",
"registry": "https://registry.npmjs.org/verdaccio-apm-login",
"latest": "1.0.6",
"downloads": 16
"downloads": 17
},
{
"name": "verdaccio-auth-stack",
@@ -869,7 +869,7 @@
"url": "https://www.npmjs.org/verdaccio-auth-stack",
"registry": "https://registry.npmjs.org/verdaccio-auth-stack",
"latest": "1.0.3",
"downloads": 9
"downloads": 10
},
{
"name": "verdaccio-auth-capi",
@@ -880,7 +880,7 @@
"url": "https://www.npmjs.org/verdaccio-auth-capi",
"registry": "https://registry.npmjs.org/verdaccio-auth-capi",
"latest": "1.0.2",
"downloads": 5
"downloads": 6
},
{
"name": "verdaccio-groupnames",
@@ -891,7 +891,7 @@
"url": "https://www.npmjs.org/verdaccio-groupnames",
"registry": "https://registry.npmjs.org/verdaccio-groupnames",
"latest": "1.1.0",
"downloads": 24
"downloads": 20
},
{
"name": "verdaccio-auth-mongo",
@@ -902,7 +902,7 @@
"url": "https://www.npmjs.org/verdaccio-auth-mongo",
"registry": "https://registry.npmjs.org/verdaccio-auth-mongo",
"latest": "1.0.2",
"downloads": 9
"downloads": 10
},
{
"name": "verdaccio-coauth",
@@ -913,7 +913,7 @@
"url": "https://www.npmjs.org/verdaccio-coauth",
"registry": "https://registry.npmjs.org/verdaccio-coauth",
"latest": "0.0.2",
"downloads": 5
"downloads": 7
},
{
"name": "verdaccio-simpleldap",
@@ -924,7 +924,7 @@
"url": "https://www.npmjs.org/verdaccio-simpleldap",
"registry": "https://registry.npmjs.org/verdaccio-simpleldap",
"latest": "0.1.1",
"downloads": 9
"downloads": 10
},
{
"name": "verdaccio-github-team",
@@ -935,7 +935,7 @@
"url": "https://www.npmjs.org/verdaccio-github-team",
"registry": "https://registry.npmjs.org/verdaccio-github-team",
"latest": "0.1.2",
"downloads": 5
"downloads": 6
},
{
"name": "verdaccio-api-auth",
@@ -946,7 +946,7 @@
"url": "https://www.npmjs.org/verdaccio-api-auth",
"registry": "https://registry.npmjs.org/verdaccio-api-auth",
"latest": "0.0.9",
"downloads": 21
"downloads": 22
},
{
"name": "verdaccio-delegated-auth",
@@ -968,7 +968,7 @@
"url": "https://www.npmjs.org/verdaccio-delegated-basic-auth",
"registry": "https://registry.npmjs.org/verdaccio-delegated-basic-auth",
"latest": "0.0.2",
"downloads": 7
"downloads": 8
},
{
"name": "verdaccio-fixed-token",
@@ -979,7 +979,7 @@
"url": "https://www.npmjs.org/verdaccio-fixed-token",
"registry": "https://registry.npmjs.org/verdaccio-fixed-token",
"latest": "0.0.1",
"downloads": 2
"downloads": 4
},
{
"name": "@wunderwerk/verdaccio-static-access-token-middleware-plugin",
@@ -989,7 +989,7 @@
"url": "https://www.npmjs.org/@wunderwerk/verdaccio-static-access-token-middleware-plugin",
"registry": "https://registry.npmjs.org/@wunderwerk/verdaccio-static-access-token-middleware-plugin",
"latest": "1.0.2",
"downloads": 49
"downloads": 42
},
{
"name": "verdaccio-sentryrich",
@@ -1000,7 +1000,7 @@
"url": "https://www.npmjs.org/verdaccio-sentryrich",
"registry": "https://registry.npmjs.org/verdaccio-sentryrich",
"latest": "0.1.3",
"downloads": 22
"downloads": 23
},
{
"name": "verdaccio-sentry",
@@ -1011,7 +1011,7 @@
"url": "https://www.npmjs.org/verdaccio-sentry",
"registry": "https://registry.npmjs.org/verdaccio-sentry",
"latest": "0.0.2-beta",
"downloads": 11
"downloads": 12
},
{
"name": "verdaccio-openmetrics",
@@ -1022,7 +1022,7 @@
"url": "https://www.npmjs.org/verdaccio-openmetrics",
"registry": "https://registry.npmjs.org/verdaccio-openmetrics",
"latest": "1.2.0",
"downloads": 60
"downloads": 63
},
{
"name": "verdaccio-https",
@@ -1033,7 +1033,7 @@
"url": "https://www.npmjs.org/verdaccio-https",
"registry": "https://registry.npmjs.org/verdaccio-https",
"latest": "1.0.11",
"downloads": 33
"downloads": 34
},
{
"name": "verdaccio-badges",
@@ -1044,7 +1044,7 @@
"url": "https://www.npmjs.org/verdaccio-badges",
"registry": "https://registry.npmjs.org/verdaccio-badges",
"latest": "1.1.2",
"downloads": 27
"downloads": 35
},
{
"name": "verdaccio-npm-urls",
@@ -1066,7 +1066,7 @@
"url": "https://www.npmjs.org/verdaccio-static-token",
"registry": "https://registry.npmjs.org/verdaccio-static-token",
"latest": "1.0.1",
"downloads": 205
"downloads": 204
},
{
"name": "verdaccio-apm-server",
@@ -1077,7 +1077,7 @@
"url": "https://www.npmjs.org/verdaccio-apm-server",
"registry": "https://registry.npmjs.org/verdaccio-apm-server",
"latest": "1.0.14",
"downloads": 42
"downloads": 43
},
{
"name": "verdaccio-gae-ah",
@@ -1088,7 +1088,7 @@
"url": "https://www.npmjs.org/verdaccio-gae-ah",
"registry": "https://registry.npmjs.org/verdaccio-gae-ah",
"latest": "0.0.3",
"downloads": 9
"downloads": 10
},
{
"name": "verdaccio-oidc-ui",
@@ -1099,7 +1099,7 @@
"url": "https://www.npmjs.org/verdaccio-oidc-ui",
"registry": "https://registry.npmjs.org/verdaccio-oidc-ui",
"latest": "2.2.7",
"downloads": 31
"downloads": 30
},
{
"name": "verdaccio-github-oauth-ui-without-groups",
@@ -1110,7 +1110,7 @@
"url": "https://www.npmjs.org/verdaccio-github-oauth-ui-without-groups",
"registry": "https://registry.npmjs.org/verdaccio-github-oauth-ui-without-groups",
"latest": "1.0.1",
"downloads": 7
"downloads": 8
},
{
"name": "verdaccio-zip",
@@ -1121,7 +1121,7 @@
"url": "https://www.npmjs.org/verdaccio-zip",
"registry": "https://registry.npmjs.org/verdaccio-zip",
"latest": "1.0.14",
"downloads": 76
"downloads": 66
},
{
"name": "verdaccio-utilities",
@@ -1132,7 +1132,7 @@
"url": "https://www.npmjs.org/verdaccio-utilities",
"registry": "https://registry.npmjs.org/verdaccio-utilities",
"latest": "1.3.5",
"downloads": 21
"downloads": 20
},
{
"name": "mlc-verdaccio-s3-archiver",
@@ -1154,7 +1154,7 @@
"url": "https://www.npmjs.org/bulk-npm-publish",
"registry": "https://registry.npmjs.org/bulk-npm-publish",
"latest": "3.0.2",
"downloads": 70
"downloads": 54
},
{
"name": "tgz-checker",
@@ -1165,7 +1165,7 @@
"url": "https://www.npmjs.org/tgz-checker",
"registry": "https://registry.npmjs.org/tgz-checker",
"latest": "0.1.7",
"downloads": 23
"downloads": 16
},
{
"name": "npm-offline-packer",
@@ -1176,7 +1176,7 @@
"url": "https://www.npmjs.org/npm-offline-packer",
"registry": "https://registry.npmjs.org/npm-offline-packer",
"latest": "1.0.1",
"downloads": 7
"downloads": 6
},
{
"name": "npm-offline-packer",
@@ -1187,7 +1187,7 @@
"url": "https://www.npmjs.org/npm-offline-packer",
"registry": "https://registry.npmjs.org/npm-offline-packer",
"latest": "1.0.1",
"downloads": 7
"downloads": 6
}
]
}