Compare commits

...

33 Commits

Author SHA1 Message Date
github-actions[bot]
b970102bfc chore: update versions (6-next) (#2456)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2021-10-15 23:13:06 +02:00
Juan Picado
b702ea3631 abort search request support for proxy (#2474)
* update undici

* abort search request support for proxy
2021-10-15 23:00:30 +02:00
Juan Picado
794af76c50 Remove Node 12 support (v6.x) (#2473) 2021-10-15 18:49:47 +02:00
Oscar Dominguez
6218d7723d refactor(ci): fix typo in filename (#2471) 2021-10-14 08:14:05 +02:00
Leonardo Metzger
b261741ef6 refactor: Remove some FIXME annotations (#2465)
* refactor: Remove the @ts-ignore in middleware-utils

* refactor: Remove __mocks__ imports in local-storage package

Co-authored-by: Juan Picado <juanpicado19@gmail.com>
2021-10-03 14:21:01 +02:00
Juan Picado
61add32bff ci: avoid crowdin step is mandatory (#2466)
* avoid crowdin step is mandatory

* make it fail

* split step

* split step

* try again

* try again

* restore key

* add comment

* improve wording

* test something

* test something

* restore key
2021-10-03 14:04:24 +02:00
Andreas Opferkuch
b753b4010f website: Improve docs link discoverability (#2462)
... by flipping the underline behavior within articles
2021-10-01 17:51:04 +02:00
Juan Picado
c168b4e47a chore: update benchmark version 2021-09-26 10:39:45 +02:00
Juan Picado
3a7f81ab0c chore: delete changelog
now is located in verdaccio package
2021-09-26 08:21:44 +02:00
Juan Picado
154b2ecd34 refactor: remove @verdaccio/commons-api in favor @verdaccio/core and remove duplication (#2455)
* migrate api package

* migrate auth

* migrate config

* refactor: remove @verdaccio/commons-api in favor @verdaccio/core

* fix lint

* relocate pkg

* relocate pkg

* fix tsconfig
2021-09-26 00:08:00 +02:00
github-actions[bot]
cd7947adbc chore: update versions (6-next) (#2450)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2021-09-25 17:44:58 +02:00
Juan Picado
5fed1955a9 refactor: rematch as web state storage for UI (#2447)
* trying rematch

refactor: rematch for store packages

migrate login to rematch

Update packages/plugins/ui-theme/src/store/store.ts

Co-authored-by: Sergio Moreno <sergiomorenoalbert@gmail.com>

hide temporary

fix test for login

migrate package download resource

fix tests

* add missing fixture

* migrate detail page support

* fix tests

* migrate search

* migrate search

* clean up tests

* remove tags

* fix lint

* add changeset

* fix: search model typings

* add type

* types

* apply suggestions

Co-authored-by: Sergio Moreno <22656541+semoal@users.noreply.github.com>
2021-09-25 17:35:03 +02:00
Juan Picado
9dbf73e955 remove typedoc dep, not need it now to fix the changesets 2021-09-19 21:34:38 +02:00
Zameer Haque
2c594910d8 fix: do not throw multiple logger deprecation warning if using default logger config (#2446) 2021-09-19 20:20:46 +02:00
Juan Picado
90818700a3 rename translation file (#2445)
avoid ui translations are being uploaded
2021-09-18 12:45:27 +02:00
Juan Picado
7af1e6cc84 update readme 2021-09-18 11:46:15 +02:00
Juan Picado
757bded72e improve ci syn translations 2021-09-18 10:01:22 +02:00
Juan Picado
1b9bf35c87 add steps to add new languages to ui contributing guidelines 2021-09-18 09:43:14 +02:00
Juan Picado
eb2afc4d6d sync translations on merge in master 2021-09-18 09:20:24 +02:00
Juan Picado
5be013a059 update contributing guidelines and chat reference 2021-09-18 09:07:22 +02:00
Juan Picado
8d6d6097c6 refactor: using ui translations from crowdin (#2442)
* refactor: using ui translations from crowdin

* move tasks

* fix tests
2021-09-17 21:19:50 +02:00
Juan Picado
531289f59d update ui crowdin assets 2021-09-17 07:41:11 +02:00
Juan Picado
5e784d1188 refactor: one single file for i18n conf ui (#2440)
* refactor: one single file for i18n conf ui

* add test for crowdin

* cleanup

* space
2021-09-17 07:17:34 +02:00
Juan Picado
7dde848d0c refactor: replace flag icons with library (#2439)
* feat: simplify i18n translations config and flags

* fix icons

* lint

* update test
2021-09-16 21:46:56 +02:00
Justin Johansson
71874de027 build: upgrade to husky@7.0.2 & configure for lint-staged (#2436) 2021-09-16 07:03:57 +02:00
Joon du Randt
f13dacef9c Updated config map param name in helm example (#2435) 2021-09-14 20:38:50 +02:00
Juan Picado
761f1696f2 update e2e page docs 2021-09-13 22:14:09 +02:00
Juan Picado
f412e8f8d6 Update README.md 2021-09-13 20:56:55 +02:00
rvo
f5fd7bf5bf docs(docker): spelling and minor grammar fix (#2434) 2021-09-12 21:23:02 +02:00
Juan Picado
3d26a8190c eslint deps (#2433)
* eslint deps

* Update pnpm-lock.yaml
2021-09-12 20:33:24 +02:00
Juan Picado
e50410a875 feat: fastify search endpoint v1 without auth and format (#2432) 2021-09-12 17:12:47 +02:00
Juan Picado
60d7b35d88 refactor: search logic to storage pkg (#2431)
* refactor: search logic to storage pkg

* add test

* update undici

* add tests

* Update ci.yml

* fix ci

* fix tests

* fix ci

* fix tests

* fix ci

* restore some deps

* Update Version.test.tsx

* disable debug
2021-09-12 16:21:19 +02:00
Juan Picado
1042f9bf76 update benchmark with v6.0.0-6-next.23 2021-09-08 20:32:38 +02:00
359 changed files with 4163 additions and 5976 deletions

View File

@@ -7,7 +7,7 @@
"version": 3, "proposals": true
},
"targets": {
"node": 12
"node": 14
}
}
],

View File

@@ -0,0 +1,39 @@
---
'@verdaccio/api': major
'@verdaccio/auth': major
'@verdaccio/cli': major
'@verdaccio/config': major
'@verdaccio/core': major
'@verdaccio/file-locking': major
'verdaccio-htpasswd': major
'@verdaccio/readme': major
'@verdaccio/fastify-migration': major
'@verdaccio/streams': major
'@verdaccio/tarball': major
'@verdaccio/types': major
'@verdaccio/url': major
'@verdaccio/hooks': major
'@verdaccio/loaders': major
'@verdaccio/logger': major
'@verdaccio/middleware': major
'@verdaccio/mock': major
'@verdaccio/node-api': major
'@verdaccio/active-directory': major
'verdaccio-audit': major
'verdaccio-auth-memory': major
'verdaccio-aws-s3-storage': major
'verdaccio-google-cloud': major
'verdaccio-memory': major
'@verdaccio/ui-theme': major
'@verdaccio/server': major
'@verdaccio/cli-standalone': major
'@verdaccio/store': major
'@verdaccio/dev-types': major
'@verdaccio/utils': major
'verdaccio': major
'@verdaccio/web': major
---
Remove Node 12 support
- We need move to the new `undici` and does not support Node.js 12

View File

@@ -0,0 +1,10 @@
---
'@verdaccio/api': minor
'@verdaccio/fastify-migration': minor
'@verdaccio/hooks': minor
'@verdaccio/logger-prettify': minor
'@verdaccio/proxy': minor
'@verdaccio/store': minor
---
abort search request support for proxy

View File

@@ -0,0 +1,5 @@
---
'@verdaccio/ui-theme': minor
---
feat: integrate rematch for ui state storage

View File

@@ -0,0 +1,35 @@
---
'@verdaccio/api': minor
'@verdaccio/auth': minor
'@verdaccio/cli': minor
'@verdaccio/config': minor
'@verdaccio/core': minor
'verdaccio-htpasswd': minor
'@verdaccio/local-storage': minor
'@verdaccio/fastify-migration': minor
'@verdaccio/tarball': minor
'@verdaccio/types': minor
'@verdaccio/url': minor
'@verdaccio/hooks': minor
'@verdaccio/loaders': minor
'@verdaccio/logger': minor
'@verdaccio/middleware': minor
'@verdaccio/mock': minor
'@verdaccio/node-api': minor
'@verdaccio/active-directory': minor
'verdaccio-auth-memory': minor
'verdaccio-aws-s3-storage': minor
'verdaccio-google-cloud': minor
'verdaccio-memory': minor
'@verdaccio/ui-theme': minor
'@verdaccio/proxy': minor
'@verdaccio/server': minor
'@verdaccio/cli-standalone': minor
'@verdaccio/store': minor
'@verdaccio/utils': minor
'verdaccio': minor
'@verdaccio/web': minor
'@verdaccio/e2e-ui': minor
---
refactor: remove @verdaccio/commons-api in favor @verdaccio/core and remove duplications

View File

@@ -6,7 +6,6 @@
"@verdaccio/auth": "6.0.0-alpha.0",
"@verdaccio/cli": "6.0.0-alpha.0",
"@verdaccio/config": "6.0.0-alpha.0",
"@verdaccio/commons-api": "11.0.0-alpha.0",
"@verdaccio/file-locking": "11.0.0-alpha.0",
"verdaccio-htpasswd": "11.0.0-alpha.0",
"@verdaccio/local-storage": "11.0.0-alpha.0",
@@ -43,16 +42,19 @@
"@verdaccio/eslint-config": "1.0.0",
"@verdaccio/benchmark": "1.0.0",
"@verdaccio/website": "5.1.3",
"@verdaccio/core": "6.0.0-next.0"
"@verdaccio/core": "6.0.0-next.0",
"@verdaccio/helper": "1.0.0"
},
"changesets": [
"afraid-mice-obey",
"big-lobsters-sin",
"calm-pants-impress",
"dry-planes-tap",
"eleven-spoons-matter",
"few-cooks-destroy",
"few-mangos-grow",
"fifty-jars-rest",
"fuzzy-onions-draw",
"gentle-parrots-lay",
"gentle-trains-switch",
"gold-vans-tease",
@@ -66,6 +68,8 @@
"many-vans-care",
"modern-spies-tell",
"neat-toes-report",
"olive-candles-speak",
"perfect-candles-clap",
"perfect-emus-clean",
"perfect-kangaroos-agree",
"plenty-news-remember",
@@ -74,6 +78,7 @@
"pretty-hounds-tap",
"proud-jeans-walk",
"red-chefs-float",
"shaggy-carrots-unite",
"shiny-chefs-heal",
"smart-apricots-kneel",
"spicy-frogs-press",

View File

@@ -0,0 +1,5 @@
---
'@verdaccio/logger': patch
---
do not show deprecation warning on default logger config

View File

@@ -7,7 +7,7 @@ contact_links:
url: https://github.com/verdaccio/verdaccio/security/policy
about: I want to report a security vulnerability
- name: Chat 🏘
url: http://chat.verdaccio.org
url: https://discord.gg/7qWJxBf
about: For a quick question you should do it through our community chat
- name: User Interface Report 👩🏼‍🎨👨🏼‍🎨
url: https://github.com/verdaccio/ui/issues/new/choose

View File

@@ -58,7 +58,7 @@ jobs:
- 3.13.1
- 4.12.2
- 5.1.3
- 6.0.0-6-next.22
- 6.0.0-6-next.24
name: Benchmark autocannon
runs-on: ubuntu-latest
steps:
@@ -119,7 +119,7 @@ jobs:
- 3.13.1
- 4.12.2
- 5.1.3
- 6.0.0-6-next.22
- 6.0.0-6-next.24
name: Benchmark hyperfine
runs-on: ubuntu-latest
steps:

View File

@@ -46,7 +46,12 @@ jobs:
run: pnpm install
env:
NODE_AUTH_TOKEN: ${{ secrets.REGISTRY_AUTH_TOKEN }}
- name: crowdin download
env:
CROWDIN_VERDACCIO_PROJECT_ID: ${{ secrets.CROWDIN_VERDACCIO_PROJECT_ID }}
CROWDIN_VERDACCIO_API_KEY: ${{ secrets.CROWDIN_VERDACCIO_API_KEY }}
CONTEXT: production
run: pnpm crowdin:download
- name: build
run: pnpm build

View File

@@ -83,6 +83,7 @@ jobs:
run: pnpm recursive install --frozen-lockfile --ignore-scripts
- name: Lint
run: pnpm format:check
build:
runs-on: ubuntu-latest
name: build
@@ -101,6 +102,15 @@ jobs:
key: pnpm-${{ hashFiles('pnpm-lock.yaml') }}
- name: Install
run: pnpm recursive install --frozen-lockfile --ignore-scripts
- name: crowdin download
env:
CROWDIN_VERDACCIO_PROJECT_ID: ${{ secrets.CROWDIN_VERDACCIO_PROJECT_ID }}
CROWDIN_VERDACCIO_API_KEY: ${{ secrets.CROWDIN_VERDACCIO_API_KEY }}
CONTEXT: production
run: pnpm crowdin:download
## this step is optional, translations are not mandatory for PR
## secrets keys are not available on forks, the failure here is guaranteed
continue-on-error: true
- name: build
run: pnpm build
- name: tar packages
@@ -116,6 +126,7 @@ jobs:
fail-fast: true
matrix:
os: [ubuntu-latest]
## Node 16 breaks UI test, jest issue
node_version: [14]
name: ${{ matrix.os }} / Node ${{ matrix.node_version }}
runs-on: ${{ matrix.os }}
@@ -165,8 +176,8 @@ jobs:
run: pnpm recursive install --frozen-lockfile
- name: Test UI
run: pnpm test:e2e:ui
env:
DEBUG: verdaccio:e2e*
# env:
# DEBUG: verdaccio:e2e*
ci-e2e-cli:
needs: build
runs-on: ubuntu-latest
@@ -192,8 +203,8 @@ jobs:
run: pnpm recursive install --frozen-lockfile
- name: Test CLI
run: pnpm test:e2e:cli
env:
DEBUG: verdaccio*
# env:
# DEBUG: verdaccio*
test-windows:
needs: [format, lint]
runs-on: windows-latest
@@ -217,3 +228,35 @@ jobs:
run: pnpm build
- name: Test
run: pnpm test
sync-translations:
needs: [ci-e2e-cli, ci-e2e-ui, test-windows, test]
runs-on: ubuntu-latest
name: synchronize translations
if: (github.event_name == 'push' && github.ref == 'refs/heads/master') || github.event_name == 'workflow_dispatch'
steps:
- uses: actions/checkout@v2.3.1
- uses: actions/setup-node@v1
with:
node-version: 14
- uses: actions/download-artifact@v2
with:
name: verdaccio-artifact
- name: untar packages
run: tar -xzvf pkg.tar.gz -C ${{ github.workspace }}/packages
- name: Install pnpm
run: npm i pnpm@6.10.3 -g
- uses: actions/cache@v2
with:
path: ~/.pnpm-store
key: pnpm-${{ hashFiles('pnpm-lock.yaml') }}
- name: Install
## we need scripts, pupetter downloads aditional content
run: pnpm recursive install --frozen-lockfile
- name: generate website translations
run: pnpm write-translations --filter ...@verdaccio/website
- name: sync
env:
CROWDIN_VERDACCIO_PROJECT_ID: ${{ secrets.CROWDIN_VERDACCIO_PROJECT_ID }}
CROWDIN_VERDACCIO_API_KEY: ${{ secrets.CROWDIN_VERDACCIO_API_KEY }}
CONTEXT: production
run: pnpm crowdin:sync

5
.gitignore vendored
View File

@@ -34,6 +34,9 @@ packages/standalone/dist/
## ui
packages/plugins/ui-theme/static
/packages/plugins/ui-theme/src/i18n/download_translations/
!/packages/plugins/ui-theme/src/i18n/crowdin/ui.json
# CI Pnpm cache
.pnpm-store/
@@ -45,5 +48,5 @@ hyper-results*.json
api-results*.json
#docs
api/
./api
packages/core/core/docs

5
.husky/pre-commit Executable file
View File

@@ -0,0 +1,5 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
#./node_modules/.bin/lint-staged
npm run husky:pre-commit

2
.nvmrc
View File

@@ -1 +1 @@
14
16

View File

@@ -2,7 +2,7 @@
{
"files.exclude": {
"**/.nyc_output": true,
"**/build": true,
"**/build": false,
"**/coverage": true,
".idea": true,
"storage_default_storage": true,

File diff suppressed because it is too large Load Diff

View File

@@ -19,6 +19,7 @@ guidelines for you:
- [What's is not considered a bug?](#whats-is-not-considered-a-bug)
- [Issue Search](#issue-search)
- [Chat](#chat)
- [Translations](#translations)
- [Request Features](#request-features)
- [Contributing Guidelines](#contributing-guidelines)
- [Submitting a Pull Request](#submitting-a-pull-request)
@@ -190,10 +191,28 @@ affecting multiple people.
### Chat
Questions can be asked via [Discord](http://chat.verdaccio.org/)
Questions can be asked via [Discord](https://discord.gg/7qWJxBf)
**Please use the `#help` channel.**
## Translations
All translations are provided by the `crowdin` platform:
[https://translate.verdaccio.org/](https://translate.verdaccio.org/)
If you want to contribute by adding translations, create an account (GitHub could be used as fast alternative), in the platform you can contribute to two areas, the website or improve User Interface translations.
If a language is not listed, ask for it in the [Discord](https://discord.gg/7qWJxBf) channel #contribute channel.
For adding a new **language** on the UI follow these steps:
1. Ensure the **language** has been enabled, must be visible in the `crowdin` platform.
2. Find in the explorer the file `en.US.json` in the path `packages/plugins/ui-theme/src/i18n/crowdin/ui.json` and complete the translations, **not need to find approval on this**.
3. Into the project, add a new field into `packages/plugins/ui-theme/src/i18n/crowdin/ui.json` file, in the section `lng`, the new language, eg: `{ lng: {korean:"Korean"}}`. (This file is English based, once the PR has been merged, this string will be available in crowdin for translate to the targeted language).
4. Add the language, [flag icon](https://www.npmjs.com/package/country-flag-icons), and the menu key fort he new language eg: `menuKey: 'lng.korean'` to the file `packages/plugins/ui-theme/src/i18n/enabledLanguages.ts`.
5. For local testing, read `packages/plugins/ui-theme/src/i18n/ABOUT_TRANSLATIONS.md`.
6. Add a `changeset` file, see more info below.
## Request Features
New feature requests are welcome. Analyse whether the idea fits within scope of

View File

@@ -1,4 +1,4 @@
FROM --platform=${BUILDPLATFORM:-linux/amd64} node:14.17.6-alpine as builder
FROM --platform=${BUILDPLATFORM:-linux/amd64} node:14.18.1-alpine as builder
ENV NODE_ENV=development \
VERDACCIO_BUILD_REGISTRY=https://registry.verdaccio.org
@@ -19,7 +19,7 @@ RUN npm -g i pnpm@6.10.3 && \
# FIXME: need to remove devDependencies from the build
# RUN pnpm install --prod --ignore-scripts
FROM node:14.17.6-alpine
FROM node:14.18.1-alpine
LABEL maintainer="https://github.com/verdaccio/verdaccio"
ENV VERDACCIO_APPDIR=/opt/verdaccio \

View File

@@ -29,6 +29,8 @@ Google Cloud Storage** or create your own plugin.
## Install
> Latest Node.js v14
Install with npm:
```bash
@@ -75,7 +77,7 @@ booted in a couple of seconds, fast enough for any CI. Many open source projects
### **Testing the integrity of your React components by publishing in a private registry - React Finland 2021**.
[![beerjscrb](https://cdn.verdaccio.dev/readme/react-finland-2021-jpicado.jpeg)](https://www.youtube.com/watch?v=5olfi5wbgF4)
[![beerjscrb](https://cdn.verdaccio.dev/readme/react-finland-2021-jpicado.jpeg)](https://www.youtube.com/watch?v=bRKZbrlQqLY&t=16s&ab_channel=ReactFinland)
You might want to check out as well our previous talks:
@@ -190,7 +192,20 @@ Verdaccio aims to support all features of a standard npm client that make sense
If you want to report a security vulnerability, please follow the steps which we have defined for you in our [security policy](https://github.com/verdaccio/verdaccio/security/policy).
## Core Team
## Special Thanks
Thanks to the following companies to help us to achieve our goals providing free open source licenses. Every company provides enough resources to move this project forward.
| Company | Logo | License |
| ------------ | ------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- |
| JetBrains | [![jetbrain](assets/thanks/jetbrains/logo.png)](https://www.jetbrains.com/) | JetBrains provides licenses for products for active maintainers, renewable yearly |
| Crowdin | [![crowdin](assets/thanks/crowdin/logo.png)](https://crowdin.com/) | Crowdin provides platform for translations |
| BrowserStack | [![browserstack](https://cdn.verdaccio.dev/readme/browserstack_logo.png)](https://www.browserstack.com/) | BrowserStack provides plan to run End to End testing for the UI |
| Netlify | [![netlify](https://www.netlify.com/img/global/badges/netlify-color-accent.svg)](https://www.netlify.com/) | Netlify provides pro plan for website deployment |
| Algolia | [![algolia](https://cdn.verdaccio.dev/sponsor/logo/algolia/logo.png)](https://algolia.com/) | Algolia provides search services for the website |
| Docker | [![docker](https://cdn.verdaccio.dev/sponsor/logo/docker/docker.png)](https://www.docker.com/community/open-source/application) | Docker offers unlimited pulls and unlimited egress to any and all users |
## Maintainers
| [Juan Picado](https://github.com/juanpicado) | [Ayush Sharma](https://github.com/ayusharma) | [Sergio Hg](https://github.com/sergiohgz) |
| ------------------------------------------------------------------------------ | ------------------------------------------------------------------------ | ------------------------------------------------------------------------- |
@@ -244,18 +259,6 @@ Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com
[![backers](https://opencollective.com/verdaccio/backers.svg?width=890)](https://opencollective.com/verdaccio#backers)
## Special Thanks
Thanks to the following companies to help us to achieve our goals providing free open source licenses.
[![jetbrain](assets/thanks/jetbrains/logo.png)](https://www.jetbrains.com/)
[![crowdin](assets/thanks/crowdin/logo.png)](https://crowdin.com/)
[![browserstack](https://cdn.verdaccio.dev/readme/browserstack_logo.png)](https://www.browserstack.com/)
[![netlify](https://www.netlify.com/img/global/badges/netlify-color-accent.svg)](https://www.netlify.com/)
[![algolia](https://cdn.verdaccio.dev/sponsor/logo/algolia/logo.png)](https://algolia.com/)
Verdaccio also is part of to the [Docker Open Source Program](https://www.docker.com/blog/expanded-support-for-open-source-software-projects/).
## Contributors
This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].
@@ -270,7 +273,7 @@ If you have any issue you can try the following options, do no desist to ask or
- [Donations](https://github.com/sponsors/verdaccio)
- [Reporting an issue](https://github.com/verdaccio/verdaccio/issues/new/choose)
- [Running discussions](https://github.com/verdaccio/verdaccio/issues?q=is%3Aissue+is%3Aopen+label%3Adiscuss)
- [Chat](http://chat.verdaccio.org/)
- [Chat](https://discord.gg/7qWJxBf)
- [Logos](https://verdaccio.org/docs/en/logo)
- [Docker Examples](https://github.com/verdaccio/verdaccio/tree/master/docker-examples)
- [FAQ](https://github.com/verdaccio/verdaccio/discussions/categories/q-a)

View File

@@ -5,6 +5,10 @@ preserve_hierarchy: true
files:
[
{
source: 'packages/plugins/ui-theme/src/i18n/crowdin/**/*',
translation: '/packages/plugins/ui-theme/src/i18n/download_translations/%locale%/**/%original_file_name%',
},
{
source: '/website/i18n/en/**/*',
translation: '/website/i18n/%locale%/**/%original_file_name%',
@@ -13,4 +17,4 @@ files:
source: '/website/docs/**/*',
translation: '/website/i18n/%locale%/docusaurus-plugin-content-docs/current/**/%original_file_name%',
}
]
]

View File

@@ -74,3 +74,7 @@ Introduce environment variables for legacy tokens.
- `VERDACCIO_LEGACY_ALGORITHM`: Allows to define the specific algorithm for the token signature which by default is `aes-256-ctr`
- `VERDACCIO_LEGACY_ENCRYPTION_KEY`: By default, the token stores in the database, but using this variable allows to get it from memory
#### @verdaccio/commons-api migration
The package has been removed in favor of `@verdaccio/core` with a similar API, check API documentation for further details.

View File

@@ -52,12 +52,6 @@
"@types/mime": "2.0.3",
"@types/minimatch": "3.0.5",
"@types/node": "14.6.0",
"@types/react": "17.0.19",
"@types/react-autosuggest": "10.1.5",
"@types/react-dom": "17.0.9",
"@types/react-helmet": "6.1.2",
"@types/react-router-dom": "5.1.8",
"@types/react-virtualized": "9.21.13",
"@types/request": "2.48.7",
"@types/semver": "7.3.8",
"@types/supertest": "2.0.11",
@@ -84,25 +78,13 @@
"debug": "4.3.2",
"detect-secrets": "1.0.6",
"eslint": "7.32.0",
"eslint-config-google": "0.14.0",
"eslint-config-prettier": "8.3.0",
"eslint-plugin-babel": "5.3.1",
"eslint-plugin-import": "2.24.2",
"eslint-plugin-jest": "24.4.0",
"eslint-plugin-jsx-a11y": "6.4.1",
"eslint-plugin-prettier": "4.0.0",
"eslint-plugin-react": "7.25.1",
"eslint-plugin-react-hooks": "4.2.0",
"eslint-plugin-simple-import-sort": "7.0.0",
"eslint-plugin-verdaccio": "10.0.0",
"fs-extra": "10.0.0",
"husky": "4.3.5",
"husky": "7.0.2",
"in-publish": "2.0.1",
"jest": "27.1.0",
"jest-environment-jsdom": "27.1.0",
"jest-environment-jsdom-global": "3.0.0",
"jest-environment-node": "27.1.0",
"jest-fetch-mock": "3.0.3",
"jest-junit": "12.2.0",
"kleur": "3.0.3",
"lint-staged": "11.1.2",
@@ -124,6 +106,7 @@
"verdaccio-memory": "workspace:*"
},
"scripts": {
"husky:pre-commit": "lint-staged",
"clean": "pnpm recursive run clean",
"build": "pnpm recursive run build --filter=!@verdaccio/website",
"docker": "docker build -t verdaccio/verdaccio:local . --no-cache",
@@ -139,7 +122,7 @@
"benchmark:submit": "pnpm ts-node ./scripts/submit-metrics.ts",
"start:watch": "concurrently --kill-others \"pnpm _build:watch\" \"pnpm _start:server\" \"pnpm _debug:reload\"",
"_build:watch": "pnpm run --parallel watch --filter ./packages",
"_start:server": "node packages/verdaccio/debug/bootstrap.js --listen 8000",
"_start:server": "node --inspect packages/verdaccio/debug/bootstrap.js --listen 8000",
"_start:web": "pnpm start --filter ...@verdaccio/ui-theme",
"_debug:reload": "nodemon -d 3 packages/verdaccio/debug/bootstrap.js",
"start:ts": "ts-node packages/verdaccio/src/start.ts -- --listen 8000",
@@ -154,15 +137,11 @@
"ts:ref": "update-ts-references --discardComments",
"website": "pnpm build --filter ...@verdaccio/website",
"crowdin:upload": "crowdin upload sources --auto-update --config ./crowdin.yaml",
"crowdin:download": "crowdin download --config ./crowdin.yaml",
"crowdin:sync": "pnpm crowdin:upload && pnpm crowdin:download --verbose"
"crowdin:download": "crowdin download --verbose --config ./crowdin.yaml",
"crowdin:sync": "pnpm crowdin:upload && pnpm crowdin:download --verbose",
"postinstall": "husky install"
},
"license": "MIT",
"husky": {
"hooks": {
"pre-commit": "lint-staged"
}
},
"lint-staged": {
"*.{js,jsx,ts,tsx,json,yml,yaml,md}": "prettier --write",
"*.{js,jsx,ts,tsx}": "eslint --cache --fix"

View File

@@ -1,5 +1,44 @@
# @verdaccio/api
## 6.0.0-6-next.16
### Major Changes
- 794af76c: Remove Node 12 support
- We need move to the new `undici` and does not support Node.js 12
### Minor Changes
- b702ea36: abort search request support for proxy
- 154b2ecd: refactor: remove @verdaccio/commons-api in favor @verdaccio/core and remove duplications
### Patch Changes
- Updated dependencies [794af76c]
- Updated dependencies [b702ea36]
- Updated dependencies [154b2ecd]
- @verdaccio/auth@6.0.0-6-next.13
- @verdaccio/config@6.0.0-6-next.9
- @verdaccio/core@6.0.0-6-next.2
- @verdaccio/tarball@11.0.0-6-next.8
- @verdaccio/hooks@6.0.0-6-next.8
- @verdaccio/logger@6.0.0-6-next.6
- @verdaccio/middleware@6.0.0-6-next.13
- @verdaccio/store@6.0.0-6-next.14
- @verdaccio/utils@6.0.0-6-next.7
## 6.0.0-6-next.15
### Patch Changes
- Updated dependencies [2c594910]
- @verdaccio/logger@6.0.0-6-next.5
- @verdaccio/auth@6.0.0-6-next.12
- @verdaccio/hooks@6.0.0-6-next.7
- @verdaccio/middleware@6.0.0-6-next.12
- @verdaccio/store@6.0.0-6-next.13
## 6.0.0-6-next.14
### Major Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/api",
"version": "6.0.0-6-next.14",
"version": "6.0.0-6-next.16",
"description": "loaders logic",
"main": "./build/index.js",
"types": "build/index.d.ts",
@@ -25,7 +25,7 @@
"verdaccio"
],
"engines": {
"node": ">=10",
"node": ">=14",
"npm": ">=6"
},
"scripts": {
@@ -39,16 +39,16 @@
},
"license": "MIT",
"dependencies": {
"@verdaccio/auth": "workspace:6.0.0-6-next.11",
"@verdaccio/commons-api": "workspace:11.0.0-6-next.4",
"@verdaccio/config": "workspace:6.0.0-6-next.8",
"@verdaccio/core": "workspace:6.0.0-6-next.1",
"@verdaccio/hooks": "workspace:6.0.0-6-next.6",
"@verdaccio/logger": "workspace:6.0.0-6-next.4",
"@verdaccio/middleware": "workspace:6.0.0-6-next.11",
"@verdaccio/store": "workspace:6.0.0-6-next.12",
"@verdaccio/tarball": "workspace:11.0.0-6-next.7",
"@verdaccio/utils": "workspace:6.0.0-6-next.6",
"@verdaccio/auth": "workspace:6.0.0-6-next.13",
"@verdaccio/config": "workspace:6.0.0-6-next.9",
"@verdaccio/core": "workspace:6.0.0-6-next.2",
"@verdaccio/hooks": "workspace:6.0.0-6-next.8",
"@verdaccio/logger": "workspace:6.0.0-6-next.6",
"@verdaccio/middleware": "workspace:6.0.0-6-next.13",
"@verdaccio/store": "workspace:6.0.0-6-next.14",
"@verdaccio/tarball": "workspace:11.0.0-6-next.8",
"@verdaccio/utils": "workspace:6.0.0-6-next.7",
"abortcontroller-polyfill": "1.7.3",
"cookies": "0.8.0",
"debug": "4.3.2",
"express": "4.17.1",
@@ -57,8 +57,10 @@
"semver": "7.3.5"
},
"devDependencies": {
"@verdaccio/server": "workspace:6.0.0-6-next.19",
"@verdaccio/types": "workspace:11.0.0-6-next.8",
"@types/node": "16.9.1",
"@verdaccio/server": "workspace:6.0.0-6-next.21",
"@verdaccio/types": "workspace:11.0.0-6-next.9",
"@verdaccio/helper": "1.0.0",
"body-parser": "1.19.0",
"lodash": "4.17.21",
"supertest": "6.1.6"

View File

@@ -3,7 +3,7 @@ import _ from 'lodash';
import { Router } from 'express';
import { media, allow } from '@verdaccio/middleware';
import { API_MESSAGE, HTTP_STATUS, DIST_TAGS, VerdaccioError } from '@verdaccio/commons-api';
import { constants, VerdaccioError } from '@verdaccio/core';
import { Package } from '@verdaccio/types';
import { Storage } from '@verdaccio/store';
import { IAuth } from '@verdaccio/auth';
@@ -26,8 +26,8 @@ export default function (route: Router, auth: IAuth, storage: Storage): void {
if (err) {
return next(err);
}
res.status(HTTP_STATUS.CREATED);
return next({ ok: API_MESSAGE.TAG_ADDED });
res.status(constants.HTTP_STATUS.CREATED);
return next({ ok: constants.API_MESSAGE.TAG_ADDED });
});
};
@@ -58,9 +58,9 @@ export default function (route: Router, auth: IAuth, storage: Storage): void {
if (err) {
return next(err);
}
res.status(HTTP_STATUS.CREATED);
res.status(constants.HTTP_STATUS.CREATED);
return next({
ok: API_MESSAGE.TAG_REMOVED,
ok: constants.API_MESSAGE.TAG_REMOVED,
});
});
}
@@ -79,7 +79,7 @@ export default function (route: Router, auth: IAuth, storage: Storage): void {
return next(err);
}
next(info[DIST_TAGS]);
next(info[constants.DIST_TAGS]);
},
});
}
@@ -96,9 +96,9 @@ export default function (route: Router, auth: IAuth, storage: Storage): void {
if (err) {
return next(err);
}
res.status(HTTP_STATUS.CREATED);
res.status(constants.HTTP_STATUS.CREATED);
return next({
ok: API_MESSAGE.TAG_UPDATED,
ok: constants.API_MESSAGE.TAG_UPDATED,
});
}
);

View File

@@ -10,6 +10,7 @@ import { IAuth } from '@verdaccio/auth';
import { Storage } from '@verdaccio/store';
import { Config } from '@verdaccio/types';
import bodyParser from 'body-parser';
import semver from 'semver';
import whoami from './whoami';
import ping from './ping';
@@ -23,6 +24,10 @@ import profile from './v1/profile';
import token from './v1/token';
import v1Search from './v1/search';
if (semver.lte(process.version, 'v15.0.0')) {
global.AbortController = require('abortcontroller-polyfill/dist/cjs-ponyfill').AbortController;
}
export default function (config: Config, auth: IAuth, storage: Storage): Router {
/* eslint new-cap:off */
const app = express.Router();

View File

@@ -3,8 +3,8 @@ import { Router } from 'express';
import buildDebug from 'debug';
import { allow } from '@verdaccio/middleware';
import { getVersion, ErrorCode } from '@verdaccio/utils';
import { HEADERS, DIST_TAGS, API_ERROR } from '@verdaccio/commons-api';
import { getVersion } from '@verdaccio/utils';
import { HEADERS, DIST_TAGS, API_ERROR, errorUtils } from '@verdaccio/core';
import { Config, Package } from '@verdaccio/types';
import { IAuth } from '@verdaccio/auth';
import { Storage } from '@verdaccio/store';
@@ -80,7 +80,7 @@ export default function (route: Router, auth: IAuth, storage: Storage, config: C
}
debug('package version not found %o', queryVersion);
return next(ErrorCode.getNotFound(`${API_ERROR.VERSION_NOT_EXIST}: ${queryVersion}`));
return next(errorUtils.getNotFound(`${API_ERROR.VERSION_NOT_EXIST}: ${queryVersion}`));
};
debug('get package name %o', name);

View File

@@ -4,8 +4,15 @@ import mime from 'mime';
import { Router } from 'express';
import buildDebug from 'debug';
import { API_MESSAGE, HEADERS, DIST_TAGS, API_ERROR, HTTP_STATUS } from '@verdaccio/commons-api';
import { validateMetadata, isObject, ErrorCode, hasDiffOneKey } from '@verdaccio/utils';
import {
API_MESSAGE,
HEADERS,
DIST_TAGS,
API_ERROR,
HTTP_STATUS,
errorUtils,
} from '@verdaccio/core';
import { validateMetadata, isObject, hasDiffOneKey } from '@verdaccio/utils';
import { media, expectJson, allow } from '@verdaccio/middleware';
import { notify } from '@verdaccio/hooks';
import { Config, Callback, MergeTags, Version, Package, CallbackAction } from '@verdaccio/types';
@@ -224,7 +231,7 @@ export function publishPackage(storage: Storage, config: Config, auth: IAuth): a
// if this happens in normal circumstances, report it as a bug
debug('invalid body format');
logger.info({ packageName }, `wrong package format on publish a package @{packageName}`);
return next(ErrorCode.getBadRequest(API_ERROR.UNSUPORTED_REGISTRY_CALL));
return next(errorUtils.getBadRequest(API_ERROR.UNSUPORTED_REGISTRY_CALL));
}
if (error && error.status !== HTTP_STATUS.CONFLICT) {
@@ -322,7 +329,7 @@ export function publishPackage(storage: Storage, config: Config, auth: IAuth): a
} catch (error: any) {
debug('error on publish, bad package format %o', packageName);
logger.error({ packageName }, 'error on publish, bad package data for @{packageName}');
return next(ErrorCode.getBadData(API_ERROR.BAD_PACKAGE_DATA));
return next(errorUtils.getBadData(API_ERROR.BAD_PACKAGE_DATA));
}
};
}

View File

@@ -1,4 +1,4 @@
import { HTTP_STATUS } from '@verdaccio/commons-api';
import { HTTP_STATUS } from '@verdaccio/core';
import { logger } from '@verdaccio/logger';
export default function (route): void {

View File

@@ -1,4 +1,4 @@
import { USERS, HTTP_STATUS } from '@verdaccio/commons-api';
import { USERS, HTTP_STATUS } from '@verdaccio/core';
import { Response } from 'express';
import _ from 'lodash';
import buildDebug from 'debug';

View File

@@ -1,7 +1,7 @@
import _ from 'lodash';
import { Response, Router } from 'express';
import { USERS, HTTP_STATUS } from '@verdaccio/commons-api';
import { USERS, HTTP_STATUS } from '@verdaccio/core';
import { Package } from '@verdaccio/types';
import { Storage } from '@verdaccio/store';

View File

@@ -2,14 +2,14 @@ import _ from 'lodash';
import { Response, Router } from 'express';
import buildDebug from 'debug';
import { getAuthenticatedMessage, validatePassword, ErrorCode } from '@verdaccio/utils';
import { getAuthenticatedMessage, validatePassword } from '@verdaccio/utils';
import { getApiToken } from '@verdaccio/auth';
import { logger } from '@verdaccio/logger';
import { createRemoteUser } from '@verdaccio/config';
import { Config, RemoteUser } from '@verdaccio/types';
import { IAuth } from '@verdaccio/auth';
import { API_ERROR, API_MESSAGE, HTTP_STATUS } from '@verdaccio/commons-api';
import { API_ERROR, API_MESSAGE, HTTP_STATUS, errorUtils } from '@verdaccio/core';
import { $RequestExtend, $NextFunctionVer } from '../types/custom';
const debug = buildDebug('verdaccio:api:user');
@@ -47,7 +47,7 @@ export default function (route: Router, auth: IAuth, config: Config): void {
'authenticating for user @{username} failed. Error: @{err.message}'
);
return next(
ErrorCode.getCode(HTTP_STATUS.UNAUTHORIZED, API_ERROR.BAD_USERNAME_PASSWORD)
errorUtils.getCode(HTTP_STATUS.UNAUTHORIZED, API_ERROR.BAD_USERNAME_PASSWORD)
);
}
@@ -55,7 +55,7 @@ export default function (route: Router, auth: IAuth, config: Config): void {
const token = await getApiToken(auth, config, restoredRemoteUser, password);
debug('login: new token');
if (!token) {
return next(ErrorCode.getUnauthorized());
return next(errorUtils.getUnauthorized());
}
res.status(HTTP_STATUS.CREATED);
@@ -73,7 +73,7 @@ export default function (route: Router, auth: IAuth, config: Config): void {
if (validatePassword(password) === false) {
debug('adduser: invalid password');
// eslint-disable-next-line new-cap
return next(ErrorCode.getCode(HTTP_STATUS.BAD_REQUEST, API_ERROR.PASSWORD_SHORT()));
return next(errorUtils.getCode(HTTP_STATUS.BAD_REQUEST, API_ERROR.PASSWORD_SHORT()));
}
auth.add_user(name, password, async function (err, user): Promise<void> {
@@ -84,7 +84,7 @@ export default function (route: Router, auth: IAuth, config: Config): void {
// and npm accepts only an 409 error.
// So, changing status code here.
return next(
ErrorCode.getCode(err.status, err.message) || ErrorCode.getConflict(err.message)
errorUtils.getCode(err.status, err.message) || errorUtils.getConflict(err.message)
);
}
return next(err);
@@ -94,7 +94,7 @@ export default function (route: Router, auth: IAuth, config: Config): void {
name && password ? await getApiToken(auth, config, user, password) : undefined;
debug('adduser: new token %o', token);
if (!token) {
return next(ErrorCode.getUnauthorized());
return next(errorUtils.getUnauthorized());
}
req.remote_user = user;

View File

@@ -1,8 +1,8 @@
import _ from 'lodash';
import { Response, Router } from 'express';
import { API_ERROR, APP_ERROR, HTTP_STATUS, SUPPORT_ERRORS } from '@verdaccio/commons-api';
import { ErrorCode, validatePassword } from '@verdaccio/utils';
import { API_ERROR, APP_ERROR, HTTP_STATUS, SUPPORT_ERRORS, errorUtils } from '@verdaccio/core';
import { validatePassword } from '@verdaccio/utils';
import { IAuth } from '@verdaccio/auth';
import { $RequestExtend, $NextFunctionVer } from '../../types/custom';
@@ -61,7 +61,7 @@ export default function (route: Router, auth: IAuth): void {
if (_.isNil(password) === false) {
if (validatePassword(password.new) === false) {
/* eslint new-cap:off */
return next(ErrorCode.getCode(HTTP_STATUS.UNAUTHORIZED, API_ERROR.PASSWORD_SHORT()));
return next(errorUtils.getCode(HTTP_STATUS.UNAUTHORIZED, API_ERROR.PASSWORD_SHORT()));
/* eslint new-cap:off */
}
@@ -72,22 +72,22 @@ export default function (route: Router, auth: IAuth): void {
(err, isUpdated): $NextFunctionVer => {
if (_.isNull(err) === false) {
return next(
ErrorCode.getCode(err.status, err.message) || ErrorCode.getConflict(err.message)
errorUtils.getCode(err.status, err.message) || errorUtils.getConflict(err.message)
);
}
if (isUpdated) {
return next(buildProfile(req.remote_user.name));
}
return next(ErrorCode.getInternalError(API_ERROR.INTERNAL_SERVER_ERROR));
return next(errorUtils.getInternalError(API_ERROR.INTERNAL_SERVER_ERROR));
}
);
} else if (_.isNil(tfa) === false) {
return next(
ErrorCode.getCode(HTTP_STATUS.SERVICE_UNAVAILABLE, SUPPORT_ERRORS.TFA_DISABLED)
errorUtils.getCode(HTTP_STATUS.SERVICE_UNAVAILABLE, SUPPORT_ERRORS.TFA_DISABLED)
);
} else {
return next(ErrorCode.getCode(HTTP_STATUS.INTERNAL_ERROR, APP_ERROR.PROFILE_ERROR));
return next(errorUtils.getCode(HTTP_STATUS.INTERNAL_ERROR, APP_ERROR.PROFILE_ERROR));
}
}
);

View File

@@ -1,124 +1,13 @@
import { Transform, pipeline, PassThrough } from 'stream';
import _ from 'lodash';
import buildDebug from 'debug';
import { Package } from '@verdaccio/types';
import { logger } from '@verdaccio/logger';
import { IAuth } from '@verdaccio/auth';
import { searchUtils } from '@verdaccio/core';
import { HTTP_STATUS, getInternalError } from '@verdaccio/commons-api';
import { HTTP_STATUS, searchUtils } from '@verdaccio/core';
import { Storage } from '@verdaccio/store';
import { Package } from '@verdaccio/types';
const debug = buildDebug('verdaccio:api:search');
type SearchResults = {
objects: searchUtils.SearchItemPkg[];
total: number;
time: string;
};
// const personMatch = (person, search) => {
// if (typeof person === 'string') {
// return person.includes(search);
// }
// if (typeof person === 'object') {
// for (const field of Object.values(person)) {
// if (typeof field === 'string' && field.includes(search)) {
// return true;
// }
// }
// }
// return false;
// };
// const matcher = function (query) {
// const match = query.match(/author:(.*)/);
// if (match !== null) {
// return function (pkg) {
// return personMatch(pkg.author, match[1]);
// };
// }
// // TODO: maintainer, keywords, boost-exact
// // TODO implement some scoring system for freetext
// return (pkg) => {
// return ['name', 'displayName', 'description']
// .map((k) => {
// return pkg[k];
// })
// .filter((x) => {
// return x !== undefined;
// })
// .some((txt) => {
// return txt.includes(query);
// });
// };
// };
function removeDuplicates(results) {
const pkgNames: any[] = [];
return results.filter((pkg) => {
if (pkgNames.includes(pkg?.package?.name)) {
return false;
}
pkgNames.push(pkg?.package?.name);
return true;
});
}
function checkAccess(pkg: any, auth: any, remoteUser): Promise<Package | null> {
return new Promise((resolve, reject) => {
auth.allow_access({ packageName: pkg?.package?.name }, remoteUser, function (err, allowed) {
if (err) {
if (err.status && String(err.status).match(/^4\d\d$/)) {
// auth plugin returns 4xx user error,
// that's equivalent of !allowed basically
allowed = false;
return resolve(null);
} else {
reject(err);
}
} else {
return resolve(allowed ? pkg : null);
}
});
});
}
class TransFormResults extends Transform {
public constructor(options) {
super(options);
}
/**
* Transform either array of packages or a single package into a stream of packages.
* From uplinks the chunks are array but from local packages are objects.
* @param {string} chunk
* @param {string} encoding
* @param {function} done
* @returns {void}
* @override
*/
public _transform(chunk, _encoding, callback) {
if (_.isArray(chunk)) {
(chunk as searchUtils.SearchItem[])
.filter((pkgItem) => {
debug(`streaming remote pkg name ${pkgItem?.package?.name}`);
return true;
})
.forEach((pkgItem) => {
this.push(pkgItem);
});
return callback();
} else {
debug(`streaming local pkg name ${chunk?.package?.name}`);
this.push(chunk);
return callback();
}
}
}
/**
* Endpoint for npm search v1
* Empty value
@@ -126,37 +15,47 @@ class TransFormResults extends Transform {
* req: 'GET /-/v1/search?text=react&size=20&frpom=0&quality=0.65&popularity=0.98&maintenance=0.5'
*/
export default function (route, auth: IAuth, storage: Storage): void {
function checkAccess(pkg: any, auth: any, remoteUser): Promise<Package | null> {
return new Promise((resolve, reject) => {
auth.allow_access({ packageName: pkg?.package?.name }, remoteUser, function (err, allowed) {
if (err) {
if (err.status && String(err.status).match(/^4\d\d$/)) {
// auth plugin returns 4xx user error,
// that's equivalent of !allowed basically
allowed = false;
return resolve(null);
} else {
reject(err);
}
} else {
return resolve(allowed ? pkg : null);
}
});
});
}
route.get('/-/v1/search', async (req, res, next) => {
let [size, from] = ['size', 'from'].map((k) => req.query[k]);
const { query, url } = req;
let [size, from] = ['size', 'from'].map((k) => query[k]);
let data;
const abort = new AbortController();
req.on('aborted', () => {
abort.abort();
});
size = parseInt(size, 10) || 20;
from = parseInt(from, 10) || 0;
const data: any[] = [];
const transformResults = new TransFormResults({ objectMode: true });
const streamPassThrough = new PassThrough({ objectMode: true });
storage.searchManager?.search(streamPassThrough, {
query: req.query,
url: req.url,
});
const outPutStream = new PassThrough({ objectMode: true });
pipeline(streamPassThrough, transformResults, outPutStream, (err) => {
if (err) {
next(getInternalError(err ? err.message : 'unknown error'));
} else {
debug('Pipeline succeeded.');
}
});
outPutStream.on('data', (chunk) => {
data.push(chunk);
});
outPutStream.on('finish', async () => {
try {
data = await storage.searchManager?.search({
query,
url,
abort,
});
debug('stream finish');
const checkAccessPromises: searchUtils.SearchItemPkg[] = await Promise.all(
removeDuplicates(data).map((pkgItem) => {
data.map((pkgItem) => {
return checkAccess(pkgItem, auth, req.remote_user);
})
);
@@ -166,13 +65,17 @@ export default function (route, auth: IAuth, storage: Storage): void {
.slice(from, size);
logger.debug(`search results ${final?.length}`);
const response: SearchResults = {
const response: searchUtils.SearchResults = {
objects: final,
total: final.length,
time: new Date().toUTCString(),
};
res.status(HTTP_STATUS.OK).json(response);
});
} catch (error) {
logger.error({ error }, 'search endpoint has failed @{error.message}');
next(next);
return;
}
});
}

View File

@@ -1,6 +1,6 @@
import _ from 'lodash';
import { HTTP_STATUS, SUPPORT_ERRORS, getInternalError } from '@verdaccio/commons-api';
import { ErrorCode, stringToMD5, mask } from '@verdaccio/utils';
import { errorUtils, HTTP_STATUS, SUPPORT_ERRORS } from '@verdaccio/core';
import { stringToMD5, mask } from '@verdaccio/utils';
import { getApiToken } from '@verdaccio/auth';
import { logger } from '@verdaccio/logger';
import { Response, Router } from 'express';
@@ -43,10 +43,10 @@ export default function (route: Router, auth: IAuth, storage: Storage, config: C
});
} catch (error: any) {
logger.error({ error: error.msg }, 'token list has failed: @{error}');
return next(ErrorCode.getCode(HTTP_STATUS.INTERNAL_ERROR, error.message));
return next(errorUtils.getCode(HTTP_STATUS.INTERNAL_ERROR, error.message));
}
}
return next(ErrorCode.getUnauthorized());
return next(errorUtils.getUnauthorized());
}
);
@@ -57,27 +57,27 @@ export default function (route: Router, auth: IAuth, storage: Storage, config: C
const { name } = req.remote_user;
if (!_.isBoolean(readonly) || !_.isArray(cidr_whitelist)) {
return next(ErrorCode.getCode(HTTP_STATUS.BAD_DATA, SUPPORT_ERRORS.PARAMETERS_NOT_VALID));
return next(errorUtils.getCode(HTTP_STATUS.BAD_DATA, SUPPORT_ERRORS.PARAMETERS_NOT_VALID));
}
auth.authenticate(name, password, async (err, user: RemoteUser) => {
if (err) {
const errorCode = err.message ? HTTP_STATUS.UNAUTHORIZED : HTTP_STATUS.INTERNAL_ERROR;
return next(ErrorCode.getCode(errorCode, err.message));
return next(errorUtils.getCode(errorCode, err.message));
}
req.remote_user = user;
if (!_.isFunction(storage.saveToken)) {
return next(
ErrorCode.getCode(HTTP_STATUS.NOT_IMPLEMENTED, SUPPORT_ERRORS.STORAGE_NOT_IMPLEMENT)
errorUtils.getCode(HTTP_STATUS.NOT_IMPLEMENTED, SUPPORT_ERRORS.STORAGE_NOT_IMPLEMENT)
);
}
try {
const token = await getApiToken(auth, config, user, password);
if (!token) {
throw getInternalError();
throw errorUtils.getInternalError();
}
const key = stringToMD5(token);
@@ -113,7 +113,7 @@ export default function (route: Router, auth: IAuth, storage: Storage, config: C
);
} catch (error: any) {
logger.error({ error: error.msg }, 'token creation has failed: @{error}');
return next(ErrorCode.getCode(HTTP_STATUS.INTERNAL_ERROR, error.message));
return next(errorUtils.getInternalError(error.message));
}
});
}
@@ -135,10 +135,10 @@ export default function (route: Router, auth: IAuth, storage: Storage, config: C
return next({});
} catch (error: any) {
logger.error({ error: error.msg }, 'token creation has failed: @{error}');
return next(ErrorCode.getCode(HTTP_STATUS.INTERNAL_ERROR, error.message));
return next(errorUtils.getCode(HTTP_STATUS.INTERNAL_ERROR, error.message));
}
}
return next(ErrorCode.getUnauthorized());
return next(errorUtils.getUnauthorized());
}
);
}

View File

@@ -1,7 +1,6 @@
import { Response, Router } from 'express';
import buildDebug from 'debug';
import { $RequestExtend, $NextFunctionVer } from '../types/custom';
// import { getUnauthorized } from '@verdaccio/commons-api';
const debug = buildDebug('verdaccio:api:user');

View File

@@ -5,9 +5,10 @@ import bodyParser from 'body-parser';
import { Config, parseConfigFile } from '@verdaccio/config';
import { Storage } from '@verdaccio/store';
import { generatePackageMetadata } from '@verdaccio/helper';
import { final, handleError, errorReportingMiddleware } from '@verdaccio/middleware';
import { Auth, IAuth } from '@verdaccio/auth';
import { HEADERS, HEADER_TYPE, HTTP_STATUS, generatePackageMetadata } from '@verdaccio/commons-api';
import { HEADERS, HEADER_TYPE, HTTP_STATUS } from '@verdaccio/core';
import apiEndpoints from '../../src';
const getConf = (conf) => {

View File

@@ -1,6 +1,6 @@
import supertest from 'supertest';
import { HEADER_TYPE, HEADERS, HTTP_STATUS } from '@verdaccio/commons-api';
import { HEADER_TYPE, HEADERS, HTTP_STATUS } from '@verdaccio/core';
import { $ResponseExtend, $RequestExtend } from '../../types/custom';
import { initializeServer, publishTaggedVersion, publishVersion } from './_helper';

View File

@@ -1,6 +1,6 @@
import supertest from 'supertest';
import { HEADER_TYPE, HEADERS, HTTP_STATUS } from '@verdaccio/commons-api';
import { HEADER_TYPE, HEADERS, HTTP_STATUS } from '@verdaccio/core';
import { initializeServer } from './_helper';
describe('ping', () => {

View File

@@ -1,12 +1,7 @@
import { HTTP_STATUS } from '@verdaccio/commons-api';
import { HTTP_STATUS } from '@verdaccio/core';
import supertest from 'supertest';
import {
API_ERROR,
API_MESSAGE,
generatePackageMetadata,
HEADER_TYPE,
HEADERS,
} from '@verdaccio/commons-api';
import { API_ERROR, API_MESSAGE, HEADER_TYPE, HEADERS } from '@verdaccio/core';
import { generatePackageMetadata } from '@verdaccio/helper';
import { $ResponseExtend, $RequestExtend } from '../../types/custom';
import { initializeServer, publishVersion } from './_helper';

View File

@@ -2,15 +2,13 @@ import supertest from 'supertest';
import _ from 'lodash';
import {
getBadRequest,
getConflict,
getUnauthorized,
errorUtils,
HEADERS,
HEADER_TYPE,
API_MESSAGE,
HTTP_STATUS,
API_ERROR,
} from '@verdaccio/commons-api';
} from '@verdaccio/core';
import { $RequestExtend, $ResponseExtend } from '../../types/custom';
import { initializeServer } from './_helper';
@@ -28,7 +26,7 @@ const mockAuthenticate = jest.fn(() => (_name, _password, callback): void => {
});
const mockAddUser = jest.fn(() => (_name, _password, callback): void => {
return callback(getConflict(API_ERROR.USERNAME_ALREADY_REGISTERED));
return callback(errorUtils.getConflict(API_ERROR.USERNAME_ALREADY_REGISTERED));
});
jest.mock('@verdaccio/auth', () => ({
@@ -143,7 +141,7 @@ describe('user', () => {
}
);
mockAddUser.mockImplementationOnce(() => (_name, _password, callback): void => {
return callback(getBadRequest(API_ERROR.USERNAME_PASSWORD_REQUIRED));
return callback(errorUtils.getBadRequest(API_ERROR.USERNAME_PASSWORD_REQUIRED));
});
const credentialsShort = _.cloneDeep(credentials);
delete credentialsShort.name;
@@ -208,7 +206,7 @@ describe('user', () => {
}
);
mockAuthenticate.mockImplementationOnce(() => (_name, _password, callback): void => {
return callback(getUnauthorized(API_ERROR.BAD_USERNAME_PASSWORD));
return callback(errorUtils.getUnauthorized(API_ERROR.BAD_USERNAME_PASSWORD));
});
const credentialsShort = _.cloneDeep(credentials);
credentialsShort.password = 'failPassword';
@@ -240,7 +238,7 @@ describe('user', () => {
}
);
mockAuthenticate.mockImplementationOnce(() => (_name, _password, callback): void => {
return callback(getUnauthorized(API_ERROR.BAD_USERNAME_PASSWORD));
return callback(errorUtils.getUnauthorized(API_ERROR.BAD_USERNAME_PASSWORD));
});
const credentialsShort = _.cloneDeep(credentials);
credentialsShort.password = 'failPassword';

View File

@@ -1,6 +1,6 @@
import supertest from 'supertest';
import { HEADERS, HTTP_STATUS } from '@verdaccio/commons-api';
import { HEADERS, HTTP_STATUS } from '@verdaccio/core';
import { $RequestExtend, $ResponseExtend } from '../../types/custom';
import { initializeServer } from './_helper';

View File

@@ -1,5 +1,4 @@
import { HTTP_STATUS, API_ERROR } from '@verdaccio/commons-api';
import { ErrorCode } from '@verdaccio/utils';
import { errorUtils, HTTP_STATUS, API_ERROR } from '@verdaccio/core';
import {
addVersion,
uploadPackageTarball,
@@ -202,13 +201,13 @@ describe('Publish endpoints - un-publish package', () => {
const storage = {
removePackage(packageName) {
expect(packageName).toEqual(req.params.package);
return Promise.reject(ErrorCode.getInternalError());
return Promise.reject(errorUtils.getInternalError());
},
};
// @ts-ignore
await unPublishPackage(storage)(req, res, next);
expect(next).toHaveBeenCalledWith(ErrorCode.getInternalError());
expect(next).toHaveBeenCalledWith(errorUtils.getInternalError());
});
});

View File

@@ -13,9 +13,6 @@
{
"path": "../config"
},
{
"path": "../core/commons-api"
},
{
"path": "../core/core"
},

View File

@@ -1,5 +1,36 @@
# @verdaccio/auth
## 6.0.0-6-next.13
### Major Changes
- 794af76c: Remove Node 12 support
- We need move to the new `undici` and does not support Node.js 12
### Minor Changes
- 154b2ecd: refactor: remove @verdaccio/commons-api in favor @verdaccio/core and remove duplications
### Patch Changes
- Updated dependencies [794af76c]
- Updated dependencies [154b2ecd]
- @verdaccio/config@6.0.0-6-next.9
- @verdaccio/core@6.0.0-6-next.2
- verdaccio-htpasswd@11.0.0-6-next.9
- @verdaccio/loaders@6.0.0-6-next.6
- @verdaccio/logger@6.0.0-6-next.6
- @verdaccio/utils@6.0.0-6-next.7
## 6.0.0-6-next.12
### Patch Changes
- Updated dependencies [2c594910]
- @verdaccio/logger@6.0.0-6-next.5
- @verdaccio/loaders@6.0.0-6-next.5
## 6.0.0-6-next.11
### Major Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/auth",
"version": "6.0.0-6-next.11",
"version": "6.0.0-6-next.13",
"description": "logger",
"main": "./build/index.js",
"types": "build/index.d.ts",
@@ -25,7 +25,7 @@
"verdaccio"
],
"engines": {
"node": ">=10",
"node": ">=14",
"npm": ">=6"
},
"scripts": {
@@ -39,20 +39,20 @@
},
"license": "MIT",
"dependencies": {
"@verdaccio/commons-api": "workspace:11.0.0-6-next.4",
"@verdaccio/config": "workspace:6.0.0-6-next.8",
"@verdaccio/loaders": "workspace:6.0.0-6-next.4",
"@verdaccio/logger": "workspace:6.0.0-6-next.4",
"@verdaccio/utils": "workspace:6.0.0-6-next.6",
"@verdaccio/core": "workspace:6.0.0-6-next.2",
"@verdaccio/config": "workspace:6.0.0-6-next.9",
"@verdaccio/loaders": "workspace:6.0.0-6-next.6",
"@verdaccio/logger": "workspace:6.0.0-6-next.6",
"@verdaccio/utils": "workspace:6.0.0-6-next.7",
"debug": "4.3.2",
"express": "4.17.1",
"jsonwebtoken": "8.5.1",
"lodash": "4.17.21",
"verdaccio-htpasswd": "workspace:11.0.0-6-next.8"
"verdaccio-htpasswd": "workspace:11.0.0-6-next.9"
},
"devDependencies": {
"@verdaccio/mock": "workspace:6.0.0-6-next.9",
"@verdaccio/types": "workspace:11.0.0-6-next.8"
"@verdaccio/mock": "workspace:6.0.0-6-next.10",
"@verdaccio/types": "workspace:11.0.0-6-next.9"
},
"funding": {
"type": "opencollective",

View File

@@ -8,10 +8,8 @@ import {
TOKEN_BASIC,
TOKEN_BEARER,
VerdaccioError,
getBadRequest,
getInternalError,
getForbidden,
} from '@verdaccio/commons-api';
errorUtils,
} from '@verdaccio/core';
import { loadPlugin } from '@verdaccio/loaders';
import { HTPasswd, HTPasswdConfig } from 'verdaccio-htpasswd';
@@ -153,7 +151,7 @@ class Auth implements IAuth {
const validPlugins = _.filter(this.plugins, (plugin) => isFunction(plugin.changePassword));
if (_.isEmpty(validPlugins)) {
return cb(getInternalError(SUPPORT_ERRORS.PLUGIN_MISSING_INTERFACE));
return cb(errorUtils.getInternalError(SUPPORT_ERRORS.PLUGIN_MISSING_INTERFACE));
}
for (const plugin of validPlugins) {
@@ -425,7 +423,7 @@ class Auth implements IAuth {
if (!isAuthHeaderValid(authorization)) {
debug('api middleware authentication heather is invalid');
return next(getBadRequest(API_ERROR.BAD_AUTH_HEADER));
return next(errorUtils.getBadRequest(API_ERROR.BAD_AUTH_HEADER));
}
const { secret, security } = this.config;
@@ -476,7 +474,7 @@ class Auth implements IAuth {
} else {
// with JWT throw 401
debug('jwt invalid token');
next(getForbidden(API_ERROR.BAD_USERNAME_PASSWORD));
next(errorUtils.getForbidden(API_ERROR.BAD_USERNAME_PASSWORD));
}
}
}
@@ -510,7 +508,7 @@ class Auth implements IAuth {
} else {
// we force npm client to ask again with basic authentication
debug('legacy invalid header');
return next(getBadRequest(API_ERROR.BAD_AUTH_HEADER));
return next(errorUtils.getBadRequest(API_ERROR.BAD_AUTH_HEADER));
}
}
@@ -544,7 +542,7 @@ class Auth implements IAuth {
}
if (!isAuthHeaderValid(authorization)) {
return next(getBadRequest(API_ERROR.BAD_AUTH_HEADER));
return next(errorUtils.getBadRequest(API_ERROR.BAD_AUTH_HEADER));
}
const token = (authorization || '').replace(`${TOKEN_BEARER} `, '');

View File

@@ -13,12 +13,9 @@ import {
TOKEN_BASIC,
TOKEN_BEARER,
API_ERROR,
getForbidden,
getUnauthorized,
getConflict,
getCode,
} from '@verdaccio/commons-api';
import { VerdaccioError } from '@verdaccio/commons-api';
VerdaccioError,
errorUtils,
} from '@verdaccio/core';
import { createAnonymousRemoteUser } from '@verdaccio/config';
import { TokenEncryption, AESPayload } from './auth';
@@ -155,7 +152,7 @@ export function verifyJWTPayload(token: string, secret: string): RemoteUser {
// we return an anonymous user to force log in.
return createAnonymousRemoteUser();
}
throw getCode(HTTP_STATUS.UNAUTHORIZED, error.message);
throw errorUtils.getCode(HTTP_STATUS.UNAUTHORIZED, error.message);
}
}
@@ -166,11 +163,11 @@ export function isAuthHeaderValid(authorization: string): boolean {
export function getDefaultPlugins(logger: any): IPluginAuth<Config> {
return {
authenticate(user: string, password: string, cb: Callback): void {
cb(getForbidden(API_ERROR.BAD_USERNAME_PASSWORD));
cb(errorUtils.getForbidden(API_ERROR.BAD_USERNAME_PASSWORD));
},
adduser(user: string, password: string, cb: Callback): void {
return cb(getConflict(API_ERROR.BAD_USERNAME_PASSWORD));
return cb(errorUtils.getConflict(API_ERROR.BAD_USERNAME_PASSWORD));
},
// FIXME: allow_action and allow_publish should be in the @verdaccio/types
@@ -205,9 +202,13 @@ export function allow_action(action: ActionsAllowed, logger): AllowAction {
}
if (name) {
callback(getForbidden(`user ${name} is not allowed to ${action} package ${pkg.name}`));
callback(
errorUtils.getForbidden(`user ${name} is not allowed to ${action} package ${pkg.name}`)
);
} else {
callback(getUnauthorized(`authorization required to ${action} package ${pkg.name}`));
callback(
errorUtils.getUnauthorized(`authorization required to ${action} package ${pkg.name}`)
);
}
};
}

View File

@@ -1,8 +1,6 @@
import path from 'path';
import _ from 'lodash';
import { CHARACTER_ENCODING, TOKEN_BEARER, API_ERROR } from '@verdaccio/commons-api';
import { configExample } from '@verdaccio/mock';
import {
Config as AppConfig,
@@ -20,7 +18,13 @@ import {
} from '@verdaccio/utils';
import { Config, Security, RemoteUser } from '@verdaccio/types';
import { VerdaccioError, getForbidden } from '@verdaccio/commons-api';
import {
VerdaccioError,
CHARACTER_ENCODING,
TOKEN_BEARER,
API_ERROR,
errorUtils,
} from '@verdaccio/core';
import { setup } from '@verdaccio/logger';
import {
IAuth,
@@ -110,7 +114,7 @@ describe('Auth utilities', () => {
test('authentication should fail by default (default)', () => {
const plugin = getDefaultPlugins({ trace: jest.fn() });
plugin.authenticate('foo', 'bar', (error: any) => {
expect(error).toEqual(getForbidden(API_ERROR.BAD_USERNAME_PASSWORD));
expect(error).toEqual(errorUtils.getForbidden(API_ERROR.BAD_USERNAME_PASSWORD));
});
});
@@ -118,7 +122,7 @@ describe('Auth utilities', () => {
const plugin = getDefaultPlugins({ trace: jest.fn() });
// @ts-ignore
plugin.adduser('foo', 'bar', (error: any) => {
expect(error).toEqual(getForbidden(API_ERROR.BAD_USERNAME_PASSWORD));
expect(error).toEqual(errorUtils.getForbidden(API_ERROR.BAD_USERNAME_PASSWORD));
});
});
});

View File

@@ -3,7 +3,7 @@ import { ROLES, Config as AppConfig } from '@verdaccio/config';
import { setup } from '@verdaccio/logger';
import { IAuth } from '@verdaccio/auth';
import { Config } from '@verdaccio/types';
import { getInternalError } from '@verdaccio/commons-api';
import { errorUtils } from '@verdaccio/core';
import { Auth } from '../src';
@@ -57,7 +57,7 @@ describe('AuthTest', () => {
auth.authenticate('foo', 'bar', callback);
expect(callback).toHaveBeenCalledTimes(1);
expect(callback).toHaveBeenCalledWith(getInternalError());
expect(callback).toHaveBeenCalledWith(errorUtils.getInternalError());
});
});

View File

@@ -10,9 +10,6 @@
{
"path": "../config"
},
{
"path": "../core/commons-api"
},
{
"path": "../core/htpasswd"
},

View File

@@ -1,5 +1,36 @@
# @verdaccio/cli
## 6.0.0-6-next.23
### Major Changes
- 794af76c: Remove Node 12 support
- We need move to the new `undici` and does not support Node.js 12
### Minor Changes
- 154b2ecd: refactor: remove @verdaccio/commons-api in favor @verdaccio/core and remove duplications
### Patch Changes
- Updated dependencies [794af76c]
- Updated dependencies [b702ea36]
- Updated dependencies [154b2ecd]
- @verdaccio/config@6.0.0-6-next.9
- @verdaccio/fastify-migration@6.0.0-6-next.14
- @verdaccio/logger@6.0.0-6-next.6
- @verdaccio/node-api@6.0.0-6-next.22
## 6.0.0-6-next.22
### Patch Changes
- Updated dependencies [2c594910]
- @verdaccio/logger@6.0.0-6-next.5
- @verdaccio/fastify-migration@6.0.0-6-next.13
- @verdaccio/node-api@6.0.0-6-next.21
## 6.0.0-6-next.21
### Major Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/cli",
"version": "6.0.0-6-next.21",
"version": "6.0.0-6-next.23",
"author": {
"name": "Juan Picado",
"email": "juanpicado19@gmail.com"
@@ -26,7 +26,7 @@
"verdaccio"
],
"engines": {
"node": ">=12",
"node": ">=14",
"npm": ">=6"
},
"description": "verdaccio CLI",
@@ -44,10 +44,10 @@
"start": "ts-node src/index.ts"
},
"dependencies": {
"@verdaccio/config": "workspace:6.0.0-6-next.8",
"@verdaccio/logger": "workspace:6.0.0-6-next.4",
"@verdaccio/node-api": "workspace:6.0.0-6-next.20",
"@verdaccio/fastify-migration": "workspace:6.0.0-6-next.12",
"@verdaccio/config": "workspace:6.0.0-6-next.9",
"@verdaccio/logger": "workspace:6.0.0-6-next.6",
"@verdaccio/node-api": "workspace:6.0.0-6-next.22",
"@verdaccio/fastify-migration": "workspace:6.0.0-6-next.14",
"clipanion": "3.0.1",
"envinfo": "7.8.1",
"kleur": "3.0.3",

View File

@@ -1,5 +1,24 @@
# @verdaccio/config
## 6.0.0-6-next.9
### Major Changes
- 794af76c: Remove Node 12 support
- We need move to the new `undici` and does not support Node.js 12
### Minor Changes
- 154b2ecd: refactor: remove @verdaccio/commons-api in favor @verdaccio/core and remove duplications
### Patch Changes
- Updated dependencies [794af76c]
- Updated dependencies [154b2ecd]
- @verdaccio/core@6.0.0-6-next.2
- @verdaccio/utils@6.0.0-6-next.7
## 6.0.0-6-next.8
### Major Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/config",
"version": "6.0.0-6-next.8",
"version": "6.0.0-6-next.9",
"description": "logger",
"main": "./build/index.js",
"types": "build/index.d.ts",
@@ -26,7 +26,7 @@
"verdaccio"
],
"engines": {
"node": ">=10",
"node": ">=14",
"npm": ">=6"
},
"scripts": {
@@ -39,8 +39,8 @@
"build": "pnpm run build:js && pnpm run build:types"
},
"dependencies": {
"@verdaccio/commons-api": "workspace:11.0.0-6-next.4",
"@verdaccio/utils": "workspace:6.0.0-6-next.6",
"@verdaccio/core": "workspace:6.0.0-6-next.2",
"@verdaccio/utils": "workspace:6.0.0-6-next.7",
"debug": "4.3.2",
"js-yaml": "3.14.1",
"lodash": "4.17.21",

View File

@@ -3,7 +3,7 @@ import path from 'path';
import _ from 'lodash';
import buildDebug from 'debug';
import { CHARACTER_ENCODING } from '@verdaccio/commons-api';
import { CHARACTER_ENCODING } from '@verdaccio/core';
import { folderExists, fileExists } from './config-utils';
const CONFIG_FILE = 'config.yaml';

View File

@@ -3,7 +3,7 @@ import _ from 'lodash';
import buildDebug from 'debug';
import { getMatchedPackagesSpec, generateRandomHexString, isObject } from '@verdaccio/utils';
import { APP_ERROR } from '@verdaccio/commons-api';
import { APP_ERROR } from '@verdaccio/core';
import {
PackageList,
Config as AppConfig,

View File

@@ -1,7 +1,7 @@
import assert from 'assert';
import _ from 'lodash';
import { PackageAccess } from '@verdaccio/types';
import { ErrorCode } from '@verdaccio/utils';
import { errorUtils } from '@verdaccio/core';
export interface LegacyPackageList {
[key: string]: PackageAccess;
}
@@ -35,7 +35,7 @@ export function normalizeUserList(groupsList: any): any {
} else if (Array.isArray(groupsList)) {
result.push(groupsList);
} else {
throw ErrorCode.getInternalError(
throw errorUtils.getInternalError(
'CONFIG: bad package acl (array or string expected): ' + JSON.stringify(groupsList)
);
}

View File

@@ -1,6 +1,6 @@
import fs from 'fs';
import YAML from 'js-yaml';
import { APP_ERROR } from '@verdaccio/commons-api';
import { APP_ERROR } from '@verdaccio/core';
import { ConfigRuntime, ConfigYaml } from '@verdaccio/types';
/**

View File

@@ -7,9 +7,6 @@
"include": ["src/**/*.ts"],
"exclude": ["src/**/*.test.ts"],
"references": [
{
"path": "../core/commons-api"
},
{
"path": "../utils"
}

View File

@@ -1,15 +0,0 @@
# @verdaccio/commons-api
commons api utilities for verdaccio
[![verdaccio (latest)](https://img.shields.io/npm/v/@verdaccio/commons-api/latest.svg)](https://www.npmjs.com/package/@verdaccio/commons-api)
[![docker pulls](https://img.shields.io/docker/pulls/verdaccio/verdaccio.svg?maxAge=43200)](https://verdaccio.org/docs/en/docker.html)
[![backers](https://opencollective.com/verdaccio/tiers/backer/badge.svg?label=Backer&color=brightgreen)](https://opencollective.com/verdaccio)
[![stackshare](https://img.shields.io/badge/Follow%20on-StackShare-blue.svg?logo=stackshare&style=flat)](https://stackshare.io/verdaccio)
[![discord](https://img.shields.io/discord/388674437219745793.svg)](http://chat.verdaccio.org/)
[![node](https://img.shields.io/node/v/@verdaccio/commons-api/latest.svg)](https://www.npmjs.com/package/@verdaccio/commons-api)
![MIT](https://img.shields.io/github/license/mashape/apistatus.svg)
[![Crowdin](https://d322cqt584bo4o.cloudfront.net/verdaccio/localized.svg)](https://crowdin.com/project/verdaccio)
[![Twitter followers](https://img.shields.io/twitter/follow/verdaccio_npm.svg?style=social&label=Follow)](https://twitter.com/verdaccio_npm)
[![Github](https://img.shields.io/github/stars/verdaccio/verdaccio.svg?style=social&label=Stars)](https://github.com/verdaccio/verdaccio/stargazers)

View File

@@ -1,3 +0,0 @@
const config = require('../../../jest/config');
module.exports = Object.assign({}, config, {});

View File

@@ -1,55 +0,0 @@
{
"name": "@verdaccio/commons-api",
"version": "11.0.0-6-next.4",
"description": "Commons API utilities for Verdaccio",
"keywords": [
"private",
"package",
"repository",
"registry",
"enterprise",
"modules",
"proxy",
"server",
"verdaccio"
],
"author": "Juan Picado <juanpicado19@gmail.com>",
"license": "MIT",
"homepage": "https://verdaccio.org",
"repository": {
"type": "https",
"url": "https://github.com/verdaccio/verdaccio",
"directory": "packages/core/commons-api"
},
"bugs": {
"url": "https://github.com/verdaccio/verdaccio/issues"
},
"publishConfig": {
"access": "public"
},
"main": "build/index.js",
"types": "build/index.d.ts",
"files": [
"build"
],
"engines": {
"node": ">=10",
"npm": ">=6"
},
"dependencies": {
"http-errors": "1.8.0",
"http-status-codes": "2.1.4"
},
"scripts": {
"clean": "rimraf ./build",
"test": "cross-env NODE_ENV=test BABEL_ENV=test jest",
"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",
"build": "pnpm run build:js && pnpm run build:types"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/verdaccio"
}
}

View File

@@ -1,200 +0,0 @@
import createError, { HttpError } from 'http-errors';
import httpCodes from 'http-status-codes';
export const DEFAULT_MIN_LIMIT_PASSWORD = 3;
export const HEADER_TYPE = {
CONTENT_ENCODING: 'content-encoding',
CONTENT_TYPE: 'content-type',
CONTENT_LENGTH: 'content-length',
ACCEPT_ENCODING: 'accept-encoding',
};
export const HTTP_STATUS = {
OK: httpCodes.OK,
CREATED: httpCodes.CREATED,
MULTIPLE_CHOICES: httpCodes.MULTIPLE_CHOICES,
NOT_MODIFIED: httpCodes.NOT_MODIFIED,
BAD_REQUEST: httpCodes.BAD_REQUEST,
UNAUTHORIZED: httpCodes.UNAUTHORIZED,
FORBIDDEN: httpCodes.FORBIDDEN,
NOT_FOUND: httpCodes.NOT_FOUND,
CONFLICT: httpCodes.CONFLICT,
NOT_IMPLEMENTED: httpCodes.NOT_IMPLEMENTED,
UNSUPPORTED_MEDIA: httpCodes.UNSUPPORTED_MEDIA_TYPE,
BAD_DATA: httpCodes.UNPROCESSABLE_ENTITY,
INTERNAL_ERROR: httpCodes.INTERNAL_SERVER_ERROR,
SERVICE_UNAVAILABLE: httpCodes.SERVICE_UNAVAILABLE,
LOOP_DETECTED: 508,
};
export const CHARACTER_ENCODING = {
UTF8: 'utf8',
};
export const ERROR_CODE = {
token_required: 'token is required',
};
export const TOKEN_BASIC = 'Basic';
export const TOKEN_BEARER = 'Bearer';
export const HEADERS = {
ACCEPT: 'Accept',
ACCEPT_ENCODING: 'Accept-Encoding',
USER_AGENT: 'User-Agent',
JSON: 'application/json',
CONTENT_TYPE: 'Content-type',
CONTENT_LENGTH: 'content-length',
TEXT_PLAIN: 'text/plain',
TEXT_PLAIN_UTF8: 'text/plain; charset=utf-8',
TEXT_HTML_UTF8: 'text/html; charset=utf-8',
TEXT_HTML: 'text/html',
AUTHORIZATION: 'authorization',
// only set with proxy that setup HTTPS
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-Proto
FORWARDED_PROTO: 'X-Forwarded-Proto',
FORWARDED_FOR: 'X-Forwarded-For',
FRAMES_OPTIONS: 'X-Frame-Options',
CSP: 'Content-Security-Policy',
CTO: 'X-Content-Type-Options',
XSS: 'X-XSS-Protection',
ETAG: 'ETag',
JSON_CHARSET: 'application/json; charset=utf-8',
OCTET_STREAM: 'application/octet-stream; charset=utf-8',
TEXT_CHARSET: 'text/plain; charset=utf-8',
WWW_AUTH: 'WWW-Authenticate',
GZIP: 'gzip',
};
export const API_MESSAGE = {
PKG_CREATED: 'created new package',
PKG_CHANGED: 'package changed',
PKG_REMOVED: 'package removed',
PKG_PUBLISHED: 'package published',
TARBALL_UPLOADED: 'tarball uploaded successfully',
TARBALL_REMOVED: 'tarball removed',
TAG_UPDATED: 'tags updated',
TAG_REMOVED: 'tag removed',
TAG_ADDED: 'package tagged',
LOGGED_OUT: 'Logged out',
};
// @deprecated
export const SUPPORT_ERRORS = {
PLUGIN_MISSING_INTERFACE: 'the plugin does not provide implementation of the requested feature',
TFA_DISABLED: 'the two-factor authentication is not yet supported',
STORAGE_NOT_IMPLEMENT: 'the storage does not support token saving',
PARAMETERS_NOT_VALID: 'the parameters are not valid',
};
// @deprecated
export const API_ERROR = {
PASSWORD_SHORT: (passLength = DEFAULT_MIN_LIMIT_PASSWORD): string =>
`The provided password is too short. Please pick a password longer than ` +
`${passLength} characters.`,
MUST_BE_LOGGED: 'You must be logged in to publish packages.',
PLUGIN_ERROR: 'bug in the auth plugin system',
CONFIG_BAD_FORMAT: 'config file must be an object',
BAD_USERNAME_PASSWORD: 'bad username/password, access denied',
NO_PACKAGE: 'no such package available',
PACKAGE_CANNOT_BE_ADDED: 'this package cannot be added',
BAD_DATA: 'bad data',
NOT_ALLOWED: 'not allowed to access package',
NOT_ALLOWED_PUBLISH: 'not allowed to publish package',
INTERNAL_SERVER_ERROR: 'internal server error',
UNKNOWN_ERROR: 'unknown error',
NOT_PACKAGE_UPLINK: 'package does not exist on uplink',
UPLINK_OFFLINE_PUBLISH: 'one of the uplinks is down, refuse to publish',
UPLINK_OFFLINE: 'uplink is offline',
CONTENT_MISMATCH: 'content length mismatch',
NOT_FILE_UPLINK: "file doesn't exist on uplink",
MAX_USERS_REACHED: 'maximum amount of users reached',
VERSION_NOT_EXIST: "this version doesn't exist",
UNSUPORTED_REGISTRY_CALL: 'unsupported registry call',
FILE_NOT_FOUND: 'File not found',
REGISTRATION_DISABLED: 'user registration disabled',
UNAUTHORIZED_ACCESS: 'unauthorized access',
BAD_STATUS_CODE: 'bad status code',
PACKAGE_EXIST: 'this package is already present',
BAD_AUTH_HEADER: 'bad authorization header',
WEB_DISABLED: 'Web interface is disabled in the config file',
DEPRECATED_BASIC_HEADER: 'basic authentication is deprecated, please use JWT instead',
BAD_FORMAT_USER_GROUP: 'user groups is different than an array',
RESOURCE_UNAVAILABLE: 'resource unavailable',
BAD_PACKAGE_DATA: 'bad incoming package data',
USERNAME_PASSWORD_REQUIRED: 'username and password is required',
USERNAME_ALREADY_REGISTERED: 'username is already registered',
};
// @deprecated
export const APP_ERROR = {
CONFIG_NOT_VALID: 'CONFIG: it does not look like a valid config file',
PROFILE_ERROR: 'profile unexpected error',
PASSWORD_VALIDATION: 'not valid password',
};
// @deprecated
export type VerdaccioError = HttpError & { code: number };
function getError(code: number, message: string): VerdaccioError {
const httpError = createError(code, message);
httpError.code = code;
return httpError as VerdaccioError;
}
export function getConflict(message: string = API_ERROR.PACKAGE_EXIST): VerdaccioError {
return getError(HTTP_STATUS.CONFLICT, message);
}
export function getBadData(customMessage?: string): VerdaccioError {
return getError(HTTP_STATUS.BAD_DATA, customMessage || API_ERROR.BAD_DATA);
}
export function getBadRequest(customMessage: string): VerdaccioError {
return getError(HTTP_STATUS.BAD_REQUEST, customMessage);
}
export function getInternalError(customMessage?: string): VerdaccioError {
return customMessage
? getError(HTTP_STATUS.INTERNAL_ERROR, customMessage)
: getError(HTTP_STATUS.INTERNAL_ERROR, API_ERROR.UNKNOWN_ERROR);
}
export function getUnauthorized(message = 'no credentials provided'): VerdaccioError {
return getError(HTTP_STATUS.UNAUTHORIZED, message);
}
export function getForbidden(message = "can't use this filename"): VerdaccioError {
return getError(HTTP_STATUS.FORBIDDEN, message);
}
export function getServiceUnavailable(
message: string = API_ERROR.RESOURCE_UNAVAILABLE
): VerdaccioError {
return getError(HTTP_STATUS.SERVICE_UNAVAILABLE, message);
}
export function getNotFound(customMessage?: string): VerdaccioError {
return getError(HTTP_STATUS.NOT_FOUND, customMessage || API_ERROR.NO_PACKAGE);
}
export function getCode(statusCode: number, customMessage: string): VerdaccioError {
return getError(statusCode, customMessage);
}
export const TIME_EXPIRATION_24H = '24h';
export const TIME_EXPIRATION_7D = '7d';
export const DIST_TAGS = 'dist-tags';
export const LATEST = 'latest';
export const USERS = 'users';
export const DEFAULT_USER = 'Anonymous';
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 * from './helpers/pkg';

View File

@@ -1,108 +0,0 @@
import _ from 'lodash';
import {
getNotFound,
VerdaccioError,
HTTP_STATUS,
getConflict,
getBadData,
getInternalError,
API_ERROR,
getUnauthorized,
getForbidden,
getServiceUnavailable,
getCode,
} from '../src/index';
describe('testing errors', () => {
test('should qualify as an native error', () => {
expect(_.isError(getNotFound())).toBeTruthy();
expect(_.isError(getConflict())).toBeTruthy();
expect(_.isError(getBadData())).toBeTruthy();
expect(_.isError(getInternalError())).toBeTruthy();
expect(_.isError(getUnauthorized())).toBeTruthy();
expect(_.isError(getForbidden())).toBeTruthy();
expect(_.isError(getServiceUnavailable())).toBeTruthy();
expect(_.isError(getCode(400, 'fooError'))).toBeTruthy();
});
test('should test not found', () => {
const err: VerdaccioError = getNotFound('foo');
expect(err.code).toBeDefined();
expect(err.code).toEqual(HTTP_STATUS.NOT_FOUND);
expect(err.statusCode).toEqual(HTTP_STATUS.NOT_FOUND);
expect(err.message).toEqual('foo');
});
test('should test conflict', () => {
const err: VerdaccioError = getConflict('foo');
expect(err.code).toBeDefined();
expect(err.code).toEqual(HTTP_STATUS.CONFLICT);
expect(err.message).toEqual('foo');
});
test('should test bad data', () => {
const err: VerdaccioError = getBadData('foo');
expect(err.code).toBeDefined();
expect(err.code).toEqual(HTTP_STATUS.BAD_DATA);
expect(err.message).toEqual('foo');
});
test('should test internal error custom message', () => {
const err: VerdaccioError = getInternalError('foo');
expect(err.code).toBeDefined();
expect(err.code).toEqual(HTTP_STATUS.INTERNAL_ERROR);
expect(err.message).toEqual('foo');
});
test('should test internal error', () => {
const err: VerdaccioError = getInternalError();
expect(err.code).toBeDefined();
expect(err.code).toEqual(HTTP_STATUS.INTERNAL_ERROR);
expect(err.message).toEqual(API_ERROR.UNKNOWN_ERROR);
});
test('should test Unauthorized message', () => {
const err: VerdaccioError = getUnauthorized('foo');
expect(err.code).toBeDefined();
expect(err.code).toEqual(HTTP_STATUS.UNAUTHORIZED);
expect(err.message).toEqual('foo');
});
test('should test forbidden message', () => {
const err: VerdaccioError = getForbidden('foo');
expect(err.code).toBeDefined();
expect(err.code).toEqual(HTTP_STATUS.FORBIDDEN);
expect(err.message).toEqual('foo');
});
test('should test service unavailable message', () => {
const err: VerdaccioError = getServiceUnavailable('foo');
expect(err.code).toBeDefined();
expect(err.code).toEqual(HTTP_STATUS.SERVICE_UNAVAILABLE);
expect(err.message).toEqual('foo');
});
test('should test custom code error message', () => {
const err: VerdaccioError = getCode(HTTP_STATUS.NOT_FOUND, 'foo');
expect(err.code).toBeDefined();
expect(err.code).toEqual(HTTP_STATUS.NOT_FOUND);
expect(err.message).toEqual('foo');
});
test('should test custom code ok message', () => {
const err: VerdaccioError = getCode(HTTP_STATUS.OK, 'foo');
expect(err.code).toBeDefined();
expect(err.code).toEqual(HTTP_STATUS.OK);
});
});

View File

@@ -1,20 +0,0 @@
declare module 'lockfile' {
type Callback = (err?: Error) => void;
interface LockOptions {
wait?: number;
pollPeriod?: number;
stale?: number;
retries?: number;
retryWait?: number;
}
interface LockFileExport {
lock(fileName: string, opts: LockOptions, cb: Callback): void;
unlock(fileName: string, cb: Callback): void;
}
const lockFileExport: LockFileExport;
export default lockFileExport;
}

View File

@@ -1,25 +1,38 @@
# @verdaccio/core
## 6.0.0-6-next.2
### Major Changes
- 794af76c: Remove Node 12 support
- We need move to the new `undici` and does not support Node.js 12
### Minor Changes
- 154b2ecd: refactor: remove @verdaccio/commons-api in favor @verdaccio/core and remove duplications
## 6.0.0-6-next.1
### Major Changes
- 459b6fa7: refactor: search v1 endpoint and local-database
- refactor search `api v1` endpoint, improve performance
- remove usage of `async` dependency https://github.com/verdaccio/verdaccio/issues/1225
- refactor method storage class
- create new module `core` to reduce the ammount of modules with utilities
- use `undici` instead `node-fetch`
- use `fastify` instead `express` for functional test
### Breaking changes
- plugin storage API changes
- remove old search endpoint (return 404)
- filter local private packages at plugin level
The storage api changes for methods `get`, `add`, `remove` as promise base. The `search` methods also changes and recieves a `query` object that contains all query params from the client.
```ts
export interface IPluginStorage<T> extends IPlugin {
add(name: string): Promise<void>;

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/core",
"version": "6.0.0-6-next.1",
"version": "6.0.0-6-next.2",
"description": "core utilities",
"keywords": [
"private",
@@ -19,7 +19,7 @@
"license": "MIT",
"homepage": "https://verdaccio.org",
"engines": {
"node": ">=12",
"node": ">=14",
"npm": ">=6"
},
"repository": {
@@ -39,8 +39,7 @@
"semver": "7.3.5"
},
"devDependencies": {
"@verdaccio/types": "workspace:11.0.0-6-next.8",
"typedoc": "next"
"@verdaccio/types": "workspace:11.0.0-6-next.9"
},
"scripts": {
"clean": "rimraf ./build",
@@ -49,8 +48,7 @@
"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",
"build": "pnpm run build:js && pnpm run build:types",
"doc": "typedoc src/index.ts --tsconfig tsconfig.build.json"
"build": "pnpm run build:js && pnpm run build:types"
},
"funding": {
"type": "opencollective",

View File

@@ -1,3 +1,5 @@
import httpCodes from 'http-status-codes';
export const DEFAULT_MIN_LIMIT_PASSWORD = 3;
export const TIME_EXPIRATION_24H = '24h';
export const TIME_EXPIRATION_7D = '7d';
@@ -47,3 +49,43 @@ export const HEADERS = {
WWW_AUTH: 'WWW-Authenticate',
GZIP: 'gzip',
};
export const HTTP_STATUS = {
OK: httpCodes.OK,
CREATED: httpCodes.CREATED,
MULTIPLE_CHOICES: httpCodes.MULTIPLE_CHOICES,
NOT_MODIFIED: httpCodes.NOT_MODIFIED,
BAD_REQUEST: httpCodes.BAD_REQUEST,
UNAUTHORIZED: httpCodes.UNAUTHORIZED,
FORBIDDEN: httpCodes.FORBIDDEN,
NOT_FOUND: httpCodes.NOT_FOUND,
CONFLICT: httpCodes.CONFLICT,
NOT_IMPLEMENTED: httpCodes.NOT_IMPLEMENTED,
UNSUPPORTED_MEDIA: httpCodes.UNSUPPORTED_MEDIA_TYPE,
BAD_DATA: httpCodes.UNPROCESSABLE_ENTITY,
INTERNAL_ERROR: httpCodes.INTERNAL_SERVER_ERROR,
SERVICE_UNAVAILABLE: httpCodes.SERVICE_UNAVAILABLE,
LOOP_DETECTED: 508,
};
export const ERROR_CODE = {
token_required: 'token is required',
};
export const API_MESSAGE = {
PKG_CREATED: 'created new package',
PKG_CHANGED: 'package changed',
PKG_REMOVED: 'package removed',
PKG_PUBLISHED: 'package published',
TARBALL_UPLOADED: 'tarball uploaded successfully',
TARBALL_REMOVED: 'tarball removed',
TAG_UPDATED: 'tags updated',
TAG_REMOVED: 'tag removed',
TAG_ADDED: 'package tagged',
LOGGED_OUT: 'Logged out',
};
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}`;

View File

@@ -1,48 +1,5 @@
import createError, { HttpError } from 'http-errors';
import httpCodes from 'http-status-codes';
import { DEFAULT_MIN_LIMIT_PASSWORD } from './constants';
export const HTTP_STATUS = {
OK: httpCodes.OK,
CREATED: httpCodes.CREATED,
MULTIPLE_CHOICES: httpCodes.MULTIPLE_CHOICES,
NOT_MODIFIED: httpCodes.NOT_MODIFIED,
BAD_REQUEST: httpCodes.BAD_REQUEST,
UNAUTHORIZED: httpCodes.UNAUTHORIZED,
FORBIDDEN: httpCodes.FORBIDDEN,
NOT_FOUND: httpCodes.NOT_FOUND,
CONFLICT: httpCodes.CONFLICT,
NOT_IMPLEMENTED: httpCodes.NOT_IMPLEMENTED,
UNSUPPORTED_MEDIA: httpCodes.UNSUPPORTED_MEDIA_TYPE,
BAD_DATA: httpCodes.UNPROCESSABLE_ENTITY,
INTERNAL_ERROR: httpCodes.INTERNAL_SERVER_ERROR,
SERVICE_UNAVAILABLE: httpCodes.SERVICE_UNAVAILABLE,
LOOP_DETECTED: 508,
};
export const ERROR_CODE = {
token_required: 'token is required',
};
export const API_MESSAGE = {
PKG_CREATED: 'created new package',
PKG_CHANGED: 'package changed',
PKG_REMOVED: 'package removed',
PKG_PUBLISHED: 'package published',
TARBALL_UPLOADED: 'tarball uploaded successfully',
TARBALL_REMOVED: 'tarball removed',
TAG_UPDATED: 'tags updated',
TAG_REMOVED: 'tag removed',
TAG_ADDED: 'package tagged',
LOGGED_OUT: 'Logged out',
};
export const SUPPORT_ERRORS = {
PLUGIN_MISSING_INTERFACE: 'the plugin does not provide implementation of the requested feature',
TFA_DISABLED: 'the two-factor authentication is not yet supported',
STORAGE_NOT_IMPLEMENT: 'the storage does not support token saving',
PARAMETERS_NOT_VALID: 'the parameters are not valid',
};
import { DEFAULT_MIN_LIMIT_PASSWORD, HTTP_STATUS } from './constants';
export const API_ERROR = {
PASSWORD_SHORT: (passLength = DEFAULT_MIN_LIMIT_PASSWORD): string =>
@@ -82,6 +39,13 @@ export const API_ERROR = {
USERNAME_ALREADY_REGISTERED: 'username is already registered',
};
export const SUPPORT_ERRORS = {
PLUGIN_MISSING_INTERFACE: 'the plugin does not provide implementation of the requested feature',
TFA_DISABLED: 'the two-factor authentication is not yet supported',
STORAGE_NOT_IMPLEMENT: 'the storage does not support token saving',
PARAMETERS_NOT_VALID: 'the parameters are not valid',
};
export const APP_ERROR = {
CONFIG_NOT_VALID: 'CONFIG: it does not look like a valid config file',
PROFILE_ERROR: 'profile unexpected error',
@@ -137,8 +101,3 @@ export function getNotFound(customMessage?: string): VerdaccioError {
export function getCode(statusCode: number, customMessage: string): VerdaccioError {
return getError(statusCode, customMessage);
}
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}`;

View File

@@ -7,6 +7,22 @@ import * as pluginUtils from './plugin-utils';
import * as fileUtils from './file-utils';
import * as pkgUtils from './pkg-utils';
export { VerdaccioError, API_ERROR, SUPPORT_ERRORS, APP_ERROR } from './error-utils';
export {
TOKEN_BASIC,
TOKEN_BEARER,
HTTP_STATUS,
API_MESSAGE,
HEADERS,
DIST_TAGS,
CHARACTER_ENCODING,
HEADER_TYPE,
LATEST,
DEFAULT_MIN_LIMIT_PASSWORD,
DEFAULT_USER,
USERS,
} from './constants';
export {
fileUtils,
pkgUtils,

View File

@@ -26,6 +26,12 @@ export type Score = {
detail: SearchMetrics;
};
export type SearchResults = {
objects: SearchItemPkg[];
total: number;
time: string;
};
type PublisherMaintainer = {
username: string;
email: string;

View File

@@ -1,9 +1,9 @@
import _ from 'lodash';
import { HTTP_STATUS } from '../src/constants';
import {
getNotFound,
VerdaccioError,
HTTP_STATUS,
getConflict,
getBadData,
getInternalError,

View File

@@ -1,5 +1,13 @@
# Change Log
## 11.0.0-6-next.4
### Major Changes
- 794af76c: Remove Node 12 support
- We need move to the new `undici` and does not support Node.js 12
## 10.0.0-alpha.3
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/file-locking",
"version": "11.0.0-alpha.3",
"version": "11.0.0-6-next.4",
"description": "library that handle file locking",
"keywords": [
"private",
@@ -17,7 +17,7 @@
"license": "MIT",
"homepage": "https://verdaccio.org",
"engines": {
"node": ">=10",
"node": ">=14",
"npm": ">=6"
},
"repository": {
@@ -40,7 +40,7 @@
"lockfile": "1.0.4"
},
"devDependencies": {
"@verdaccio/types": "workspace:11.0.0-6-next.8"
"@verdaccio/types": "workspace:11.0.0-6-next.9"
},
"scripts": {
"clean": "rimraf ./build",

View File

@@ -1,5 +1,24 @@
# Change Log
## 11.0.0-6-next.9
### Major Changes
- 794af76c: Remove Node 12 support
- We need move to the new `undici` and does not support Node.js 12
### Minor Changes
- 154b2ecd: refactor: remove @verdaccio/commons-api in favor @verdaccio/core and remove duplications
### Patch Changes
- Updated dependencies [794af76c]
- Updated dependencies [154b2ecd]
- @verdaccio/core@6.0.0-6-next.2
- @verdaccio/file-locking@11.0.0-6-next.4
## 11.0.0-6-next.8
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "verdaccio-htpasswd",
"version": "11.0.0-6-next.8",
"version": "11.0.0-6-next.9",
"description": "htpasswd auth plugin for Verdaccio",
"keywords": [
"private",
@@ -30,12 +30,12 @@
"build"
],
"engines": {
"node": ">=10",
"node": ">=14",
"npm": ">=6"
},
"dependencies": {
"@verdaccio/commons-api": "workspace:11.0.0-6-next.4",
"@verdaccio/file-locking": "workspace:11.0.0-alpha.3",
"@verdaccio/core": "workspace:6.0.0-6-next.2",
"@verdaccio/file-locking": "workspace:11.0.0-6-next.4",
"apache-md5": "1.1.7",
"bcryptjs": "2.4.3",
"core-js": "3.17.2",
@@ -44,7 +44,7 @@
},
"devDependencies": {
"@types/bcryptjs": "2.4.2",
"@verdaccio/types": "workspace:11.0.0-6-next.8",
"@verdaccio/types": "workspace:11.0.0-6-next.9",
"mockdate": "3.0.5"
},
"scripts": {

View File

@@ -5,7 +5,7 @@ import bcrypt from 'bcryptjs';
import createError, { HttpError } from 'http-errors';
import { readFile } from '@verdaccio/file-locking';
import { Callback } from '@verdaccio/types';
import { API_ERROR, HTTP_STATUS } from '@verdaccio/commons-api';
import { API_ERROR, HTTP_STATUS } from '@verdaccio/core';
import crypt3 from './crypt3';

View File

@@ -7,9 +7,6 @@
"include": ["src/**/*"],
"exclude": ["src/**/*.test.ts"],
"references": [
{
"path": "../commons-api"
},
{
"path": "../file-locking"
}

View File

@@ -1,5 +1,19 @@
# Change Log
## 11.0.0-6-next.9
### Minor Changes
- 154b2ecd: refactor: remove @verdaccio/commons-api in favor @verdaccio/core and remove duplications
### Patch Changes
- Updated dependencies [794af76c]
- Updated dependencies [154b2ecd]
- @verdaccio/core@6.0.0-6-next.2
- @verdaccio/file-locking@11.0.0-6-next.4
- @verdaccio/streams@11.0.0-6-next.5
## 11.0.0-6-next.8
### Major Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/local-storage",
"version": "11.0.0-6-next.8",
"version": "11.0.0-6-next.9",
"description": "Local storage implementation",
"keywords": [
"private",
@@ -37,10 +37,9 @@
"npm": ">=7"
},
"dependencies": {
"@verdaccio/commons-api": "workspace:11.0.0-6-next.4",
"@verdaccio/core": "workspace:6.0.0-6-next.1",
"@verdaccio/file-locking": "workspace:11.0.0-alpha.3",
"@verdaccio/streams": "workspace:11.0.0-6-next.4",
"@verdaccio/core": "workspace:6.0.0-6-next.2",
"@verdaccio/file-locking": "workspace:11.0.0-6-next.4",
"@verdaccio/streams": "workspace:11.0.0-6-next.5",
"async": "3.2.1",
"core-js": "3.17.2",
"debug": "4.3.2",
@@ -52,9 +51,9 @@
},
"devDependencies": {
"@types/minimatch": "3.0.5",
"@verdaccio/types": "workspace:11.0.0-6-next.8",
"@verdaccio/config": "workspace:6.0.0-6-next.8",
"@verdaccio/utils": "workspace:6.0.0-6-next.6",
"@verdaccio/types": "workspace:11.0.0-6-next.9",
"@verdaccio/config": "workspace:6.0.0-6-next.9",
"@verdaccio/utils": "workspace:6.0.0-6-next.7",
"minimatch": "3.0.4",
"tmp-promise": "3.0.2"
},

View File

@@ -8,7 +8,7 @@ import _ from 'lodash';
import { UploadTarball, ReadTarball } from '@verdaccio/streams';
import { unlockFile, readFile } from '@verdaccio/file-locking';
import { Callback, Logger, Package, ILocalPackageManager, IUploadTarball } from '@verdaccio/types';
import { getCode, getInternalError, getNotFound, VerdaccioError } from '@verdaccio/commons-api';
import { VerdaccioError, errorUtils } from '@verdaccio/core';
import { unlinkPromise, rmdirPromise, readFilePromise } from './fs';
export const fileExist = 'EEXISTS';
@@ -19,7 +19,7 @@ export const packageJSONFileName = 'package.json';
const debug = buildDebug('verdaccio:plugin:local-storage:local-fs');
export const fSError = function (message: string, code = 409): VerdaccioError {
const err: VerdaccioError = getCode(code, message);
const err: VerdaccioError = errorUtils.getCode(code, message);
// FIXME: we should return http-status codes here instead, future improvement
// @ts-ignore
err.code = message;
@@ -118,9 +118,9 @@ export default class LocalFS implements ILocalFSPackageManager {
if (_.isNil(err) === false) {
if (err.code === resourceNotAvailable) {
return unLockCallback(getInternalError('resource temporarily unavailable'));
return unLockCallback(errorUtils.getInternalError('resource temporarily unavailable'));
} else if (err.code === noSuchFile) {
return unLockCallback(getNotFound());
return unLockCallback(errorUtils.getNotFound());
} else {
return unLockCallback(err);
}

View File

@@ -1,14 +0,0 @@
import { Logger } from '@verdaccio/types';
const logger: Logger = {
warn: jest.fn(),
error: jest.fn(),
// fatal: jest.fn(),
info: jest.fn(),
debug: jest.fn(),
child: jest.fn(),
http: jest.fn(),
trace: jest.fn(),
};
export default logger;

View File

@@ -2,7 +2,7 @@
import path from 'path';
import { dirSync } from 'tmp-promise';
import { IPluginStorage, PluginOptions } from '@verdaccio/types';
import { IPluginStorage, Logger, PluginOptions } from '@verdaccio/types';
import LocalDatabase, { ERROR_DB_LOCKED } from '../src/local-database';
@@ -16,8 +16,15 @@ jest.mock('../src/fs', () => ({
writeFilePromise: () => mockWrite(),
}));
// FIXME: remove this mocks imports
import logger from './__mocks__/Logger';
const logger: Logger = {
error: jest.fn(),
info: jest.fn(),
debug: jest.fn(),
child: jest.fn(),
warn: jest.fn(),
http: jest.fn(),
trace: jest.fn(),
};
// @ts-expect-error
const optionsPlugin: PluginOptions<{}> = {

View File

@@ -2,18 +2,25 @@ import path from 'path';
import fs from 'fs';
import { dirSync } from 'tmp-promise';
import { ILocalPackageManager, Package } from '@verdaccio/types';
import { ILocalPackageManager, Logger, Package } from '@verdaccio/types';
import LocalDriver, { fileExist, fSError, noSuchFile, resourceNotAvailable } from '../src/local-fs';
// FIXME: remove this mocks imports
// eslint-disable-next-line jest/no-mocks-import
import logger from './__mocks__/Logger';
import pkg from './__fixtures__/pkg';
let localTempStorage: string;
const pkgFileName = 'package.json';
const logger: Logger = {
error: jest.fn(),
info: jest.fn(),
debug: jest.fn(),
child: jest.fn(),
warn: jest.fn(),
http: jest.fn(),
trace: jest.fn(),
};
describe('Local FS test', () => {
let tmpFolder;
beforeAll(() => {

View File

@@ -2,12 +2,19 @@
import fs from 'fs';
import path from 'path';
import { dirSync } from 'tmp-promise';
import { Token } from '@verdaccio/types';
import { Logger, Token } from '@verdaccio/types';
import LocalDatabase from '../src/local-database';
// FIXME: remove this mocks imports
import logger from './__mocks__/Logger';
const logger: Logger = {
error: jest.fn(),
info: jest.fn(),
debug: jest.fn(),
child: jest.fn(),
warn: jest.fn(),
http: jest.fn(),
trace: jest.fn(),
};
describe('Local Database', () => {
let tmpFolder;

View File

@@ -1,13 +1,20 @@
import path from 'path';
import { Logger } from '@verdaccio/types';
import * as readFile from '../src/fs';
import { findPackages, _dbGenPath } from '../src/utils';
import { loadPrivatePackages } from '../src/pkg-utils';
import { noSuchFile } from '../src/local-fs';
// FIXME: remove this mocks imports
// eslint-disable-next-line jest/no-mocks-import
import logger from './__mocks__/Logger';
const logger: Logger = {
error: jest.fn(),
info: jest.fn(),
debug: jest.fn(),
child: jest.fn(),
warn: jest.fn(),
http: jest.fn(),
trace: jest.fn(),
};
describe('Utitlies', () => {
const loadDb = (name): string => path.join(__dirname, '__fixtures__/databases', `${name}.json`);

View File

@@ -7,9 +7,6 @@
"include": ["src/**/*"],
"exclude": ["src/**/*.test.ts"],
"references": [
{
"path": "../commons-api"
},
{
"path": "../file-locking"
},

View File

@@ -1,5 +1,13 @@
# Change Log
## 11.0.0-6-next.4
### Major Changes
- 794af76c: Remove Node 12 support
- We need move to the new `undici` and does not support Node.js 12
## 10.0.0-alpha.3
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/readme",
"version": "11.0.0-alpha.3",
"version": "11.0.0-6-next.4",
"description": "Readme markdown parser",
"keywords": [
"private",
@@ -20,7 +20,7 @@
"license": "MIT",
"homepage": "https://verdaccio.org",
"engines": {
"node": ">=10",
"node": ">=14",
"npm": ">=6"
},
"repository": {
@@ -45,7 +45,7 @@
"marked": "3.0.2"
},
"devDependencies": {
"@verdaccio/types": "workspace:11.0.0-6-next.8"
"@verdaccio/types": "workspace:11.0.0-6-next.9"
},
"scripts": {
"clean": "rimraf ./build",

View File

@@ -1,5 +1,37 @@
# @verdaccio/fastify-migration
## 6.0.0-6-next.14
### Major Changes
- 794af76c: Remove Node 12 support
- We need move to the new `undici` and does not support Node.js 12
### Minor Changes
- b702ea36: abort search request support for proxy
- 154b2ecd: refactor: remove @verdaccio/commons-api in favor @verdaccio/core and remove duplications
### Patch Changes
- Updated dependencies [794af76c]
- Updated dependencies [b702ea36]
- Updated dependencies [154b2ecd]
- @verdaccio/auth@6.0.0-6-next.13
- @verdaccio/config@6.0.0-6-next.9
- @verdaccio/logger@6.0.0-6-next.6
- @verdaccio/store@6.0.0-6-next.14
## 6.0.0-6-next.13
### Patch Changes
- Updated dependencies [2c594910]
- @verdaccio/logger@6.0.0-6-next.5
- @verdaccio/auth@6.0.0-6-next.12
- @verdaccio/store@6.0.0-6-next.13
## 6.0.0-6-next.12
### Major Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/fastify-migration",
"version": "6.0.0-6-next.12",
"version": "6.0.0-6-next.14",
"description": "Fastify server migration package",
"keywords": [
"private",
@@ -19,7 +19,7 @@
"license": "MIT",
"homepage": "https://verdaccio.org",
"engines": {
"node": ">=12",
"node": ">=14",
"npm": ">=6"
},
"repository": {
@@ -34,17 +34,20 @@
"access": "public"
},
"dependencies": {
"@verdaccio/config": "workspace:6.0.0-6-next.8",
"@verdaccio/auth": "workspace:6.0.0-6-next.11",
"@verdaccio/logger": "workspace:6.0.0-6-next.4",
"@verdaccio/store": "workspace:6.0.0-6-next.12",
"@verdaccio/config": "workspace:6.0.0-6-next.9",
"@verdaccio/auth": "workspace:6.0.0-6-next.13",
"@verdaccio/logger": "workspace:6.0.0-6-next.6",
"@verdaccio/store": "workspace:6.0.0-6-next.14",
"abortcontroller-polyfill": "1.7.3",
"core-js": "3.17.2",
"debug": "4.3.2",
"fastify": "3.20.2",
"fastify-plugin": "3.0.0"
"fastify-plugin": "3.0.0",
"semver": "7.3.5"
},
"devDependencies": {
"@verdaccio/types": "workspace:11.0.0-6-next.8",
"@types/node": "16.9.1",
"@verdaccio/types": "workspace:11.0.0-6-next.9",
"ts-node": "10.2.1"
},
"scripts": {

View File

@@ -0,0 +1,31 @@
/* eslint-disable no-console */
/* eslint-disable no-invalid-this */
import { logger } from '@verdaccio/logger';
async function searchRoute(fastify) {
fastify.get('/-/v1/search', async (request, reply) => {
// TODO: apply security layer here like in
// packages/api/src/v1/search.ts
// TODO: add validations for query, some parameters are mandatory
// TODO: review which query fields are mandatory
const abort = new AbortController();
request.on('aborted', () => {
abort.abort();
});
const { url, query } = request;
const storage = fastify.storage;
const data = await storage.searchManager?.search({
query,
url,
abort,
});
logger.http('search endpoint');
reply.code(200).send(data);
});
}
export default searchRoute;

View File

@@ -1 +1,7 @@
import semver from 'semver';
if (semver.lte(process.version, 'v15.0.0')) {
global.AbortController = require('abortcontroller-polyfill/dist/cjs-ponyfill').AbortController;
}
export { default } from './server';

View File

@@ -6,6 +6,7 @@ import buildDebug from 'debug';
import fp from 'fastify-plugin';
import ping from './endpoints/ping';
import search from './endpoints/search';
import { storageService } from './plugins/storage';
const debug = buildDebug('verdaccio:fastify');
@@ -22,6 +23,7 @@ async function startServer({ logger, config }) {
app.register((instance, opts, done) => {
instance.decorate('utility', new Map());
instance.register(ping);
instance.register(search);
done();
});

View File

@@ -1,5 +1,13 @@
# Change Log
## 11.0.0-6-next.5
### Major Changes
- 794af76c: Remove Node 12 support
- We need move to the new `undici` and does not support Node.js 12
## 11.0.0-6-next.4
### Major Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/streams",
"version": "11.0.0-6-next.4",
"version": "11.0.0-6-next.5",
"description": "Stream extension for Verdaccio",
"keywords": [
"private",
@@ -19,7 +19,7 @@
"license": "MIT",
"homepage": "https://verdaccio.org",
"engines": {
"node": ">=10",
"node": ">=14",
"npm": ">=6"
},
"repository": {
@@ -34,7 +34,7 @@
"access": "public"
},
"devDependencies": {
"@verdaccio/types": "workspace:11.0.0-6-next.8"
"@verdaccio/types": "workspace:11.0.0-6-next.9"
},
"scripts": {
"clean": "rimraf ./build",

View File

@@ -1,5 +1,25 @@
# Change Log
## 11.0.0-6-next.8
### Major Changes
- 794af76c: Remove Node 12 support
- We need move to the new `undici` and does not support Node.js 12
### Minor Changes
- 154b2ecd: refactor: remove @verdaccio/commons-api in favor @verdaccio/core and remove duplications
### Patch Changes
- Updated dependencies [794af76c]
- Updated dependencies [154b2ecd]
- @verdaccio/core@6.0.0-6-next.2
- @verdaccio/url@11.0.0-6-next.6
- @verdaccio/utils@6.0.0-6-next.7
## 11.0.0-6-next.7
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@verdaccio/tarball",
"version": "11.0.0-6-next.7",
"version": "11.0.0-6-next.8",
"description": "tarball utilities resolver",
"keywords": [
"private",
@@ -19,7 +19,7 @@
"license": "MIT",
"homepage": "https://verdaccio.org",
"engines": {
"node": ">=10",
"node": ">=14",
"npm": ">=6"
},
"repository": {
@@ -34,13 +34,13 @@
"access": "public"
},
"dependencies": {
"@verdaccio/commons-api": "workspace:11.0.0-6-next.4",
"@verdaccio/url": "workspace:11.0.0-6-next.5",
"@verdaccio/utils": "workspace:6.0.0-6-next.6",
"@verdaccio/core": "workspace:6.0.0-6-next.2",
"@verdaccio/url": "workspace:11.0.0-6-next.6",
"@verdaccio/utils": "workspace:6.0.0-6-next.7",
"lodash": "4.17.21"
},
"devDependencies": {
"@verdaccio/types": "workspace:11.0.0-6-next.8",
"@verdaccio/types": "workspace:11.0.0-6-next.9",
"express": "4.17.1",
"node-mocks-http": "1.10.1"
},

View File

@@ -1,5 +1,5 @@
import * as httpMocks from 'node-mocks-http';
import { HEADERS } from '@verdaccio/commons-api';
import { HEADERS } from '@verdaccio/core';
import { convertDistRemoteToLocalTarballUrls } from '../src';
describe('convertDistRemoteToLocalTarballUrls', () => {

Some files were not shown because too many files have changed in this diff Show More