From 7514d04351913b3190b5fafa6ece94ff396ea8ad Mon Sep 17 00:00:00 2001
From: "Juan Picado @jotadeveloper"
Date: Sat, 20 Jan 2018 23:00:45 +0100
Subject: [PATCH] fix: Update website and move it to the root
---
_config.yml | 1 -
docs/build.md | 20 ++-
docs/cli.md | 13 +-
docs/config.md | 7 +-
docs/contributing.md | 83 ++++++++-
docs/dev-plugins.md | 85 ++++++++-
docs/docker.md | 6 +-
docs/install.md | 11 +-
docs/node-api.md | 2 +-
docs/repositories.md | 4 +-
docs/test.md | 179 +++++++++----------
docs/uplinks.md | 8 +-
docs/web.md | 2 +
docs/what-is-verdaccio.md | 35 ++++
package.json | 3 +-
website/blog/2017-12-20-new-version-3.0.0.md | 8 -
website/i18n/en.json | 4 +-
website/languages.js | 2 +-
website/pages/en/help-with-translations.js | 2 +-
website/pages/en/help.js | 14 +-
website/pages/en/index.js | 6 +-
website/pages/en/users.js | 4 +-
website/sidebars.json | 1 +
website/siteConfig.js | 4 +-
website/static/img/devops_support.png | Bin 0 -> 33858 bytes
website/static/img/devops_support_grey.png | Bin 0 -> 33793 bytes
website/static/img/favicon.ico | Bin 0 -> 15086 bytes
website/static/img/favicon.png | Bin 984 -> 0 bytes
website/static/img/packageManagers.png | Bin 0 -> 25304 bytes
website/static/img/package_managers_grey.png | Bin 0 -> 21814 bytes
website/static/img/uplinks.png | Bin 0 -> 82502 bytes
31 files changed, 345 insertions(+), 159 deletions(-)
delete mode 100644 _config.yml
create mode 100644 docs/what-is-verdaccio.md
delete mode 100644 website/blog/2017-12-20-new-version-3.0.0.md
create mode 100644 website/static/img/devops_support.png
create mode 100644 website/static/img/devops_support_grey.png
create mode 100644 website/static/img/favicon.ico
delete mode 100644 website/static/img/favicon.png
create mode 100644 website/static/img/packageManagers.png
create mode 100644 website/static/img/package_managers_grey.png
create mode 100644 website/static/img/uplinks.png
diff --git a/_config.yml b/_config.yml
deleted file mode 100644
index 2f7efbeab..000000000
--- a/_config.yml
+++ /dev/null
@@ -1 +0,0 @@
-theme: jekyll-theme-minimal
\ No newline at end of file
diff --git a/docs/build.md b/docs/build.md
index 81b7b7adf..ff97dc79e 100644
--- a/docs/build.md
+++ b/docs/build.md
@@ -13,14 +13,14 @@ Verdaccio relies on `yarn` instead `npm` to download depenedencies.
## Scripts
-We have a list of scripts that you will use for diferent kind of tasks, in the following section we describe all posible task based on branches. (yes ๐๐๐ !! ๐ง we are working in the version 3.x that will provide a better and modern stack based on **Babel** and **Flow** ๐ง.
+We have a list of scripts that you will use for diferent kind of tasks, in the following section
+we describe all posible task based on branches.
+### Branch (2.x)
-#### Master branch (2.x)
+On branch `2.x` the unique part we have to build is the UI which is based on React.js, webpack and CSS Modules.
-On master branch the unique part we have to build is the UI which is based on React.js, webpack and CSS Modules.
-
-### Scripts
+#### Scripts
script | Description
--- | --- |
@@ -42,9 +42,9 @@ build:docker | create a local docker image with `verdaccio`
build:rpi | create a local docker for raspberry pi image with `verdaccio` **(experimental with no support)**
-#### Branch (3.x)
+#### Master branch (3.x)
-The next major version is based on `babel` and `flow`. If you switch from master ensure to run `yarn install` again.
+The current major version is based on `babel` and `flow`. If you switch from master ensure to run `yarn install` again.
*Note: Only new scripts in bold*
@@ -58,10 +58,12 @@ script | Description
release | this script is used to generate changelog and raise up the version according the commits messages
prepublish | it ensures before publish the new ui is being generated
test | run all the test `jest`
+test:unit | run the unit test
+test:func | run the funtional test
pre:ci | specific task for CI, build the UI required for test
+pretest | A shorcut for transpile the code
test:ci | run test generating coverage
-test:only | run only test
-coverage:publish | publish on `codecov` the coverage (don't use it)
+coverage:publish | publish on `codecov` the coverage (CI task specific, do not use it)
lint | run the linting for javascript code.
lint:css | run the linter for `css`
dev:webui | run a `webpack` server with hot reloading enabled `http://localhost:4872/#/` it requires a `verdaccio` server running in port `4873`.
diff --git a/docs/cli.md b/docs/cli.md
index 25cc77b01..dab1eed0c 100644
--- a/docs/cli.md
+++ b/docs/cli.md
@@ -8,10 +8,19 @@ The verdaccio CLI is your go start the application.
## Commands
```bash
-$ verdaccio --listen 4000 --config ./config.yaml
+$ verdaccio --listen 4000 --config ~./config.yaml
```
Command | Default | Example | Description
--- | --- | --- | ---
--listen \ **-l** | 4873 | -p 7000 | http port
---config \ **-c** | ~/.local/verdaccio/config.yaml | ~/config.yaml | the configuration file
+--config \ **-c** | ~/.local/verdaccio/config.yaml | ~./config.yaml | the configuration file
+
+## Default config file location
+
+To locate the home directory, we rely on **$XDG_DATA_HOME** as a first choice and Windows environment we look for [APPDATA environment variable](https://www.howtogeek.com/318177/what-is-the-appdata-folder-in-windows/).
+
+## Default storage location
+
+We use **$XDG_DATA_HOME** environment variable as default to locate the storage by default which [should be the same](https://askubuntu.com/questions/538526/is-home-local-share-the-default-value-for-xdg-data-home-in-ubuntu-14-04) as $HOME/.local/share.
+If you are using a custom storage, this location is irrelevant.
diff --git a/docs/config.md b/docs/config.md
index 868141e04..cb67a9345 100644
--- a/docs/config.md
+++ b/docs/config.md
@@ -99,7 +99,7 @@ publish:
allow_offline: false
```
-Since: *v2.3.6* due [#223](https://github.com/verdaccio/verdaccio/pull/223)
+Since: `verdaccio@2.3.6` due [#223](https://github.com/verdaccio/verdaccio/pull/223)
### URL Prefix
@@ -107,7 +107,7 @@ publish:
url_prefix: https://dev.company.local/verdaccio/
```
-Since: *v2.3.6* due [#197](https://github.com/verdaccio/verdaccio/pull/197)
+Since: `verdaccio@2.3.6` due [#197](https://github.com/verdaccio/verdaccio/pull/197)
### Max Body Size
@@ -157,8 +157,7 @@ notify:
```
-
-
+> For more detailed configuration settings, please [check the source code](https://github.com/verdaccio/verdaccio/tree/master/conf).
diff --git a/docs/contributing.md b/docs/contributing.md
index a8bf91259..b19097e02 100644
--- a/docs/contributing.md
+++ b/docs/contributing.md
@@ -61,9 +61,9 @@ We have support for **Kubernetes**, **Puppet**, **Ansible** and **Chef** and we
### I can do translations
-Verdaccio aims to be multilingual, in order to achieve it we have the awesome support of [Crowdin](https://crowdin.com) that is an amazing platform for translations.
+Verdaccio aims to be multilingual, in order to achieve it **we have the awesome support** of [Crowdin](https://crowdin.com) that is an amazing platform for translations.
-
+
We have setup a project where you can choose your favourite language, if you do not find your language feel free to request one [creating a ticket](https://github.com/verdaccio/verdaccio/issues/new).
@@ -79,3 +79,82 @@ You will need learn how to build, [we have prepared a guide just for that](build
Once you have played around with all scripts and you know how to use them, we are ready to go to the next step, run the [**Unit Test**](test.md).
+## Full list of contributors. We want to see your face here !
+
+[](https://github.com/juanpicado) |[](https://github.com/rlidwka) |[](https://github.com/Meeeeow) |[](https://github.com/trentearl) |[](https://github.com/ayusharma) |
+:---: |:---: |:---: |:---: |:---: |
+[juanpicado](https://github.com/juanpicado) |[rlidwka](https://github.com/rlidwka) |[Meeeeow](https://github.com/Meeeeow) |[trentearl](https://github.com/trentearl) |[ayusharma](https://github.com/ayusharma) |
+
+[](https://github.com/verdacciobot) |[](https://github.com/jmwilkinson) |[](https://github.com/UnitedMarsupials) |[](https://github.com/ryan-codingintrigue) |[](https://github.com/ramonornela) |
+:---: |:---: |:---: |:---: |:---: |
+[verdacciobot](https://github.com/verdacciobot) |[jmwilkinson](https://github.com/jmwilkinson) |[UnitedMarsupials](https://github.com/UnitedMarsupials) |[ryan-codingintrigue](https://github.com/ryan-codingintrigue) |[ramonornela](https://github.com/ramonornela) |
+
+[](https://github.com/renovate-bot) |[](https://github.com/rodriguesbreno) |[](https://github.com/vernak2539) |[](https://github.com/jachstet-sea) |[](https://github.com/lgaitan) |
+:---: |:---: |:---: |:---: |:---: |
+[renovate-bot](https://github.com/renovate-bot) |[rodriguesbreno](https://github.com/rodriguesbreno) |[vernak2539](https://github.com/vernak2539) |[jachstet-sea](https://github.com/jachstet-sea) |[lgaitan](https://github.com/lgaitan) |
+
+[](https://github.com/crispy1989) |[](https://github.com/neuquino) |[](https://github.com/markpeterfejes) |[](https://github.com/steve-p-com) |[](https://github.com/BartDubois) |
+:---: |:---: |:---: |:---: |:---: |
+[crispy1989](https://github.com/crispy1989) |[neuquino](https://github.com/neuquino) |[markpeterfejes](https://github.com/markpeterfejes) |[steve-p-com](https://github.com/steve-p-com) |[BartDubois](https://github.com/BartDubois) |
+
+[](https://github.com/karfau) |[](https://github.com/030) |[](https://github.com/Qwerios) |[](https://github.com/wiggisser) |[](https://github.com/kfatehi) |
+:---: |:---: |:---: |:---: |:---: |
+[karfau](https://github.com/karfau) |[030](https://github.com/030) |[Qwerios](https://github.com/Qwerios) |[wiggisser](https://github.com/wiggisser) |[kfatehi](https://github.com/kfatehi) |
+
+[](https://github.com/imsnif) |[](https://github.com/denisbabineau) |[](https://github.com/HCanber) |[](https://github.com/jgoz) |[](https://github.com/josephg) |
+:---: |:---: |:---: |:---: |:---: |
+[imsnif](https://github.com/imsnif) |[denisbabineau](https://github.com/denisbabineau) |[HCanber](https://github.com/HCanber) |[jgoz](https://github.com/jgoz) |[josephg](https://github.com/josephg) |
+
+[](https://github.com/kba) |[](https://github.com/aledbf) |[](https://github.com/drubin) |[](https://github.com/plitex) |[](https://github.com/nedelenbos) |
+:---: |:---: |:---: |:---: |:---: |
+[kba](https://github.com/kba) |[aledbf](https://github.com/aledbf) |[drubin](https://github.com/drubin) |[plitex](https://github.com/plitex) |[nedelenbos](https://github.com/nedelenbos) |
+
+[](https://github.com/mysiar) |[](https://github.com/bufferoverflow) |[](https://github.com/osher) |[](https://github.com/danielo515) |[](https://github.com/marnel) |
+:---: |:---: |:---: |:---: |:---: |
+[mysiar](https://github.com/mysiar) |[bufferoverflow](https://github.com/bufferoverflow) |[osher](https://github.com/osher) |[danielo515](https://github.com/danielo515) |[marnel](https://github.com/marnel) |
+
+[](https://github.com/aszmyd) |[](https://github.com/estliberitas) |[](https://github.com/Alexandre-io) |[](https://github.com/amirmohsen) |[](https://github.com/BarthV) |
+:---: |:---: |:---: |:---: |:---: |
+[aszmyd](https://github.com/aszmyd) |[estliberitas](https://github.com/estliberitas) |[Alexandre-io](https://github.com/Alexandre-io) |[amirmohsen](https://github.com/amirmohsen) |[BarthV](https://github.com/BarthV) |
+
+[](https://github.com/BogdanAlexandru) |[](https://github.com/iambrandonn) |[](https://github.com/robi-wan) |[](https://github.com/crohrer) |[](https://github.com/psychocode) |
+:---: |:---: |:---: |:---: |:---: |
+[BogdanAlexandru](https://github.com/BogdanAlexandru) |[iambrandonn](https://github.com/iambrandonn) |[robi-wan](https://github.com/robi-wan) |[crohrer](https://github.com/crohrer) |[psychocode](https://github.com/psychocode) |
+
+[](https://github.com/conorhastings) |[](https://github.com/coreyjewett) |[](https://github.com/dbroadhurst) |[](https://github.com/etiennetremel) |[](https://github.com/einfallstoll) |
+:---: |:---: |:---: |:---: |:---: |
+[conorhastings](https://github.com/conorhastings) |[coreyjewett](https://github.com/coreyjewett) |[dbroadhurst](https://github.com/dbroadhurst) |[etiennetremel](https://github.com/etiennetremel) |[einfallstoll](https://github.com/einfallstoll) |
+
+[](https://github.com/gempain) |[](https://github.com/lbguilherme) |[](https://github.com/gecruz) |[](https://github.com/idangozlan) |[](https://github.com/jrussellsmyth) |
+:---: |:---: |:---: |:---: |:---: |
+[gempain](https://github.com/gempain) |[lbguilherme](https://github.com/lbguilherme) |[gecruz](https://github.com/gecruz) |[idangozlan](https://github.com/idangozlan) |[jrussellsmyth](https://github.com/jrussellsmyth) |
+
+[](https://github.com/jirutka) |[](https://github.com/kingjan1999) |[](https://github.com/vStone) |[](https://github.com/zaventh) |[](https://github.com/jeremymoritz) |
+:---: |:---: |:---: |:---: |:---: |
+[jirutka](https://github.com/jirutka) |[kingjan1999](https://github.com/kingjan1999) |[vStone](https://github.com/vStone) |[zaventh](https://github.com/zaventh) |[jeremymoritz](https://github.com/jeremymoritz) |
+
+[](https://github.com/jondlm) |[](https://github.com/speier) |[](https://github.com/kodypeterson) |[](https://github.com/mrblackus) |[](https://github.com/metaa) |
+:---: |:---: |:---: |:---: |:---: |
+[jondlm](https://github.com/jondlm) |[speier](https://github.com/speier) |[kodypeterson](https://github.com/kodypeterson) |[mrblackus](https://github.com/mrblackus) |[metaa](https://github.com/metaa) |
+
+[](https://github.com/bajtos) |[](https://github.com/okv) |[](https://github.com/Vrtak-CZ) |[](https://github.com/rafacesar) |[](https://github.com/rbpinheiro) |
+:---: |:---: |:---: |:---: |:---: |
+[bajtos](https://github.com/bajtos) |[okv](https://github.com/okv) |[Vrtak-CZ](https://github.com/Vrtak-CZ) |[rafacesar](https://github.com/rafacesar) |[rbpinheiro](https://github.com/rbpinheiro) |
+
+[](https://github.com/r3wald) |[](https://github.com/robertgroh) |[](https://github.com/prssn) |[](https://github.com/RodrigoBalest) |[](https://github.com/RomainLK) |
+:---: |:---: |:---: |:---: |:---: |
+[r3wald](https://github.com/r3wald) |[robertgroh](https://github.com/robertgroh) |[prssn](https://github.com/prssn) |[RodrigoBalest](https://github.com/RodrigoBalest) |[RomainLK](https://github.com/RomainLK) |
+
+[](https://github.com/rmg) |[](https://github.com/samcday) |[](https://github.com/tarun1793) |[](https://github.com/tcort) |[](https://github.com/grrowl) |
+:---: |:---: |:---: |:---: |:---: |
+[rmg](https://github.com/rmg) |[samcday](https://github.com/samcday) |[tarun1793](https://github.com/tarun1793) |[tcort](https://github.com/tcort) |[grrowl](https://github.com/grrowl) |
+
+[](https://github.com/tlvince) |[](https://github.com/lordvlad) |[](https://github.com/wpasternak) |[](https://github.com/yannickcr) |[](https://github.com/yannickglt) |
+:---: |:---: |:---: |:---: |:---: |
+[tlvince](https://github.com/tlvince) |[lordvlad](https://github.com/lordvlad) |[wpasternak](https://github.com/wpasternak) |[yannickcr](https://github.com/yannickcr) |[yannickglt](https://github.com/yannickglt) |
+
+[](https://github.com/silkentrance) |[](https://github.com/jjaakola) |[](https://github.com/maxlaverse) |[](https://github.com/ChadKillingsworth) |
+:---: |:---: |:---: |:---: |
+[silkentrance](https://github.com/silkentrance) |[jjaakola](https://github.com/jjaakola) |[maxlaverse](https://github.com/maxlaverse) |[ChadKillingsworth](https://github.com/ChadKillingsworth) |
+
+
diff --git a/docs/dev-plugins.md b/docs/dev-plugins.md
index 22e81de49..02a9286a5 100644
--- a/docs/dev-plugins.md
+++ b/docs/dev-plugins.md
@@ -3,12 +3,20 @@ id: dev-plugins
title: "Developing Plugins"
---
-There are many ways to extend `verdaccio`, currently we only support `authentication plugins`
+There are many ways to extend `verdaccio`, currently we support `authentication plugins`, `middleware plugins` (since `v2.7.0`) and `storage plugins` since (`v3.x`).
## Authentication Plugins
This section will describe how it looks like a Verdaccio plugin in a ES5 way. Basically we have to return an object with a single method called `authenticate` that will recieve 3 arguments (`user, password, callback`). Once the authentication has been executed there is 2 options to give a response to `verdaccio`.
+### API
+
+```js
+function authenticate (user, password, callback) {
+ ...more stuff
+}
+```
+
##### OnError
Either something bad happened or auth was unsuccessful.
@@ -61,10 +69,79 @@ Auth.prototype.authenticate = function (user, password, callback) {
module.exports = Auth;
```
-## Storage Plugins
+And the setup
-// in progress
+```yaml
+auth:
+ htpasswd:
+ file: ./htpasswd
+```
+Where `htpasswd` is the sufix of the plugin name. eg: `verdaccio-htpasswd` and the rest of the body would be the plugin configuration params.
## Middleware Integration
-// in progress
+Middleware plugins have the capability to modify the API layer, either adding new endpoints or intercepting requests. A pretty good example
+of middleware plugin is the (sinopia-github-oauth)[https://github.com/soundtrackyourbrand/sinopia-github-oauth]) compatible with `verdaccio`.
+
+### API
+
+```js
+function register_middlewares(expressApp, auth, storage) {
+ ...more stuff
+}
+```
+
+To register a middleware we need an object with a single method called `register_middlewares` that will recieve 3 arguments (`expressApp, auth, storage`).
+*Auth* is the authentification instance and *storage* is also the main Storage instance that will give you have access to all to the storage actions.
+
+
+## Storage Plugins
+
+Since `verdaccio@3.x` we also can plug a custom storage.
+
+### API
+
+The storage API is a bit more complex, you will need to create a class that return a `ILocalData` implementation. Please see details bellow.
+
+```js
+
+class LocalDatabase{
+ constructor(config: Config, logger: Logger): ILocalData;
+}
+
+interface ILocalData {
+ add(name: string): SyncReturn;
+ remove(name: string): SyncReturn;
+ get(): StorageList;
+ getPackageStorage(packageInfo: string): IPackageStorage;
+ sync(): ?SyncReturn;
+}
+
+interface ILocalPackageManager {
+ writeTarball(name: string): IUploadTarball;
+ readTarball(name: string): IReadTarball;
+ readPackage(fileName: string, callback: Callback): void;
+ createPackage(name: string, value: any, cb: Callback): void;
+ deletePackage(fileName: string, callback: Callback): void;
+ removePackage(callback: Callback): void;
+ updatePackage(pkgFileName: string,
+ updateHandler: Callback,
+ onWrite: Callback,
+ transformPackage: Function,
+ onEnd: Callback): void;
+ savePackage(fileName: string, json: Package, callback: Callback): void;
+}
+
+interface IUploadTarball extends stream$PassThrough {
+ abort(): void;
+ done(): void;
+}
+
+interface IReadTarball extends stream$PassThrough {
+ abort(): void;
+ done(): void;
+}
+```
+
+> This API still is experimental and might change next minor versions. The default [LocalStorage plugin](https://github.com/verdaccio/local-storage) it comes built-in in `verdaccio` and it is being
+loaded if any storage plugin has been defined.
diff --git a/docs/docker.md b/docs/docker.md
index 9535bd829..38ff0177f 100644
--- a/docs/docker.md
+++ b/docs/docker.md
@@ -5,7 +5,9 @@ title: Docker
To pull the latest pre-built [docker image](https://hub.docker.com/r/verdaccio/verdaccio/):
-`docker pull verdaccio/verdaccio`
+```bash
+docker pull verdaccio/verdaccio
+```
## Tagged Versions
@@ -39,6 +41,8 @@ The Canary version (master branch) is tagged as `alpha`
docker pull verdaccio/verdaccio:alpha
```
+> If you are interested on a list of tags, [please visit the Docker Hub website](https://hub.docker.com/r/verdaccio/verdaccio/tags/).
+
## Running verdaccio using Docker
To run the docker container:
diff --git a/docs/install.md b/docs/install.md
index e9212343a..c1b65583f 100644
--- a/docs/install.md
+++ b/docs/install.md
@@ -8,13 +8,14 @@ Verdaccio is a multiplatform web application, to install you need at least some
#### Prerequisites
1. Node higher than
- - For version *2.x* we support from **4.6.1**
- - For version *3.x* we support as minimum **6.12.0**
-2. npm *>=3.x* or yarn
+ - For version `verdaccio@2.x` we support from Node `v4.6.1`.
+ - For version `verdaccio@3.x` we support as minimum Node `6.12.0`
+2. npm `>=3.x` or `yarn`
+3. The web interface support browsers `Chrome, Firefox, Edge, and IE9`
## Installing the CLI
-`Verdaccio` must be install globaly using any of the most modern
+`verdaccio` must be install globaly using any of the most modern
Using `npm`
@@ -27,8 +28,6 @@ or using `yarn`
yarn global add verdaccio
```
-> Warning: Verdaccio current is not support PM2's cluster mode, run it with cluster mode may cause unknown behavior
-
## Basic Usage
Once has been installed you only need to execute the CLI command.
diff --git a/docs/node-api.md b/docs/node-api.md
index 352ed0d3b..639e4db95 100644
--- a/docs/node-api.md
+++ b/docs/node-api.md
@@ -3,7 +3,7 @@ id: node-api
title: "Node API"
---
-Verdaccio can be invoqued programmatically.
+Verdaccio can be invoqued programmatically. The node API was introduced after version `verdaccio@3.0.0-alpha.10`.
## Usage
diff --git a/docs/repositories.md b/docs/repositories.md
index 58d83c908..165a6b23c 100644
--- a/docs/repositories.md
+++ b/docs/repositories.md
@@ -17,6 +17,7 @@ Repository | Usage | Stack
[https://github.com/verdaccio/puppet-verdaccio](https://github.com/verdaccio/puppet-verdaccio) | Puppet support | Puppet
[https://github.com/verdaccio/ansible-verdaccio](https://github.com/verdaccio/ansible-verdaccio) | Ansible support | Ansible
[https://github.com/verdaccio/verdaccio-cookbook](https://github.com/verdaccio/verdaccio-cookbook) | Chef support | Chef
+[https://github.com/chainlink/charts/tree/master/stable/verdaccio](https://github.com/chainlink/charts/tree/master/stable/verdaccio) | Kubernetes support | Kubernetes
## Experimental Repos
@@ -24,7 +25,6 @@ The following repositories aims to be part of the future infraestructure of `ver
Repository | Usage | Stack
--- | ---| ---|
-[https://github.com/verdaccio/verdaccio-plugin-auth-htpasswd](https://github.com/verdaccio/verdaccio-plugin-auth-htpasswd) | Default authentification plugin based on Babel | ES6, Babel, Flow
+[https://github.com/verdaccio/verdaccio-memory](https://github.com/verdaccio/verdaccio-memory) | An experimental storage in memory | ES6, Babel, Flow
[https://github.com/verdaccio/generator-verdaccio-plugin](https://github.com/verdaccio/generator-verdaccio-plugin) | Yeoman generators for future verdaccio plugins | ES6, Babel, Yeoman
-[https://github.com/verdaccio/blog](https://github.com/verdaccio/blog) | Any article related with verdaccio | Markdown
diff --git a/docs/test.md b/docs/test.md
index edb381b3a..a5c55abf9 100644
--- a/docs/test.md
+++ b/docs/test.md
@@ -7,7 +7,7 @@ All tests are split in three folders:
- `test/unit` - Tests that cover functions that transform data in an non-trivial way. These tests simply `require()` a few files and run code in there, so they are very fast.
- `test/functional` - Tests that launch a verdaccio instance and perform a series of requests to it over http. They are slower than unit tests.
- - `test/integration` - Tests that launch a verdaccio instance and do requests to it using npm. They are really slow and can hit a real npm registry. **This actually has not been tested or
+ - `test/integration` - Tests that launch a verdaccio instance and do requests to it using npm. They are really slow and can hit a real npm registry. **unmaintained test**
Unit and functional tests are executed automatically by running `npm test` from the project's root directory. Integration tests are supposed to be executed manually from time to time.
@@ -25,22 +25,29 @@ yarn run test
That will trigger only two first groups of test, unit and functional.
### Using test/unit
-The following is just an example how a unit test should looks like. Basically follow the `mocha` standard. Try to describe what exactly does the unit test in a single sentence in the header of the `it` section.
+The following is just an example how a unit test should looks like. Basically follow the `jest` standard.
+
+Try to describe what exactly does the unit test in a single sentence in the header of the `test` section.
```javacript
-'use strict';
+const verdaccio = require('../../src/api/index');
+const config = require('./partials/config');
-let assert = require('assert');
-let parseInterval = require('../../src/lib/utils').parseInterval;
+describe('basic system test', () => {
-describe('Parse interval', function() {
- before(function(done) {
- ..... some magic stuff before the show
- });
+ beforeAll(function(done) {
+ // something important
+ });
- it('server should respond on /', function(done) {
- ... this is an async test
- });});
+ afterAll((done) => {
+ // undo something important
+ });
+
+ test('server should respond on /', done => {
+ // your test
+ done();
+ });
+});
```
### Using test/functional
@@ -50,111 +57,85 @@ Funtional testing in verdaccio has a bit more of complextity that needs a deep e
All starts in the `index.js` file. Let's dive in into it.
```javascript
-// create 3 server instances
-require('./lib/startup');
-...
+// we create 3 server instances
+ const config1 = new VerdaccioConfig(
+ './store/test-storage',
+ './store/config-1.yaml',
+ 'http://localhost:55551/');
+ const config2 = new VerdaccioConfig(
+ './store/test-storage2',
+ './store/config-2.yaml',
+ 'http://localhost:55552/');
+ const config3 = new VerdaccioConfig(
+ './store/test-storage3',
+ './store/config-3.yaml',
+ 'http://localhost:55553/');
+ const server1: IServerBridge = new Server(config1.domainPath);
+ const server2: IServerBridge = new Server(config2.domainPath);
+ const server3: IServerBridge = new Server(config3.domainPath);
+ const process1: IServerProcess = new VerdaccioProcess(config1, server1, SILENCE_LOG);
+ const process2: IServerProcess = new VerdaccioProcess(config2, server2, SILENCE_LOG);
+ const process3: IServerProcess = new VerdaccioProcess(config3, server3, SILENCE_LOG);
+ const express: any = new ExpressServer();
+ ...
-describe('functional test verdaccio', function() {
- // recover the server instances
- const server = process.server;
- const server2 = process.server2;
- const server3 = process.server3;
-
- // On start initialise 3 verdaccio servers
- before(function(done) {
- Promise.all([
- require('./lib/startup').start('./store/test-storage', '/store/config-1.yaml'),
- require('./lib/startup').start('./store/test-storage2', '/store/config-2.yaml'),
- require('./lib/startup').start('./store/test-storage3', '/store/config-3.yaml'),
- ]).then(() => {
- done();
- }).catch(function(error) {
- console.error("error on start servers", error);
+ // we check whether all instances has been started, since run in independent processes
+ beforeAll((done) => {
+ Promise.all([
+ process1.init(),
+ process2.init(),
+ process3.init()]).then((forks) => {
+ _.map(forks, (fork) => {
+ processRunning.push(fork[0]);
+ });
+ express.start(EXPRESS_PORT).then((app) =>{
+ done();
+ }, (err) => {
+ done(err);
+ });
+ }).catch((error) => {
+ done(error);
+ });
});
- });
-
- before(function() {
- return Promise.all([server, server2, server3].map(function(server) {
- // save a lsof -p output in order to compare on finish on finish all test
- }));
- });
-
- ..........
- // here is the unique line you should add, the new functional test.
- require('./my-functional-test.js')();
-
- // On finish kill all server
- after(function(done) {
- Promise.all([check(server), check(server2), check(server3)]).then(function() {
- done();
- }, (reason) => {
- assert.equal(reason, null);
- done();
+ // after finish all, we ensure are been stoped
+ afterAll(() => {
+ _.map(processRunning, (fork) => {
+ fork.stop();
+ });
+ express.server.close();
});
- });
-});
+
```
-Perhaps this is not he best approach, but, it's how works right now. So, you just learnt how the bootstrap works and how to add a new group of functional tests.
-
-#### The lib/server.js
-
-The server class is just a wrapper that simulates a `npm` client and provides a simple API for the funtional test.
-
-As we mention in the previous section, we are creating 3 process servers that are accessible in each process as `process.server;`, `process.server2;` and ``process.server3;`.
-
-Using such reference you will be able to send request to any of the 3 instance running.
-
-#### The lib/startup.js
-
-The startup file is the responsable to create the 3 verdaccio instances and inject them to the `process.x` global variable.
-
-#### The lib/request.js
-
-This module holds a `PromiseAssert` which extends from `Promise` adding methods to handle all request from `lib/server.js`.
-
### Usage
Here we are gonna describe how it looks like an usual functional test, check inline for more detail information.
+#### The lib/server.js
+
+The server class is just a wrapper that simulates a `npm` client and provides a simple API for the funtional test.
+
+As we mention in the previous section, we are creating 3 process servers that are accessible in each process as `server1`, `server2` and ``server3`.
+
+Using such reference you will be able to send request to any of the 3 instance running.
+
+
```javascript
-'use strict';
-module.exports = function() {
- // you can access the 3 instance through process global variables
- const server = process.server;
- const server2 = process.server2;
-
- describe('my-functional-group-test', function() {
- before(function() {
- // create a raw emtpy package
- const pkg = require('./fixtures/package')('new-package');
- return server.putPackage('new-package', pkg)
- // check whether was uploaded correctly
- .status(201)
- // check whether body response is ok
- .body_ok(/created new package/);
- });
-
- // since before are not registred, we use emtpy it to display before putPackage was success
- it('creating new package / srv1', function() {});
-
- it('should do something else here ..... ', function() {
- // this should fails since fakeVersion does not exist
- // note we use server2 because is an uplink of server 1
- return server2.getTarball('new-package', 'fakeVersion')
- .status(404)
- .body_error(/no such file/);
- });
+export default function(server) {
+ // we recieve any server instance via arguments
+ test('add tag - 404', () => {
+ // we interact with the server instance.
+ return server.addTag('testpkg-tag', 'tagtagtag', '0.0.1').status(404).body_error(/no such package/);
});
-};
+});
```
### Test/integration
-These section never has been used, but we are looking for help to make it run properly. All new ideas are very welcome.
+These section never has been used, but we are looking for help to make it run properly. **All new ideas are very welcome.**
diff --git a/docs/uplinks.md b/docs/uplinks.md
index da1268df6..23f6c332a 100644
--- a/docs/uplinks.md
+++ b/docs/uplinks.md
@@ -5,6 +5,8 @@ title: "Uplinks"
An *uplink* is a link with an external registry that provides acccess to external packages.
+![Uplinks](/img/uplinks.png)
+
### Usage
```yaml
@@ -26,7 +28,7 @@ You can define mutiple uplinks and each of them must have an unique name (key).
Property | Type | Required | Example | Support | Description | Default
--- | --- | --- | --- | --- | --- | ---
url | string | Yes | https://registry.npmjs.org/ | all | The registry url | npmjs
-ca | string | No | ~./ssl/client.crt' | all | SSL path certificate |
+ca | string | No | ~./ssl/client.crt' | all | SSL path certificate | No default
timeout | string | No | 100ms | all | set new timeout for the request | 30s
maxage | string | No |10m | all | limit maximun failure request | 2m
fail_timeout | string | No |10m | all | defines max time when a request becomes a failure | 5m
@@ -38,7 +40,7 @@ headers | list | No | authorization: "Basic YourBase64EncodedCredentials==" | al
### You Must know
-* Uplinks must be registries compatible with the `npm` endpoints. Eg: *verdaccio*, *sinopia@1.4.0*, *npmjs registry*, *yarn registry* and more.
-* Setting `cache` to false will help to save space in your hard drive.
+* Uplinks must be registries compatible with the `npm` endpoints. Eg: *verdaccio*, `sinopia@1.4.0`, *npmjs registry*, *yarn registry*, *JFrog*, *Nexus* and more.
+* Setting `cache` to false will help to save space in your hard drive. This will avoid store `tarballs` but [it will keep metadata in folders](https://github.com/verdaccio/verdaccio/issues/391).
* Exceed with multiple uplinks might slow down the lookup of your packages due for each request a npm client does, verdaccio does 1 call for each uplink.
* The (timeout, maxage and fail_timeout) format follow the [NGINX measurement units](http://nginx.org/en/docs/syntax.html)
diff --git a/docs/web.md b/docs/web.md
index 237ff2ccb..b6dfd8d48 100644
--- a/docs/web.md
+++ b/docs/web.md
@@ -3,6 +3,8 @@ id: webui
title: "Web User Interface"
---
+
+
Verdaccio has a web user interface to display only the private packges and can be customisable.
```yaml
diff --git a/docs/what-is-verdaccio.md b/docs/what-is-verdaccio.md
new file mode 100644
index 000000000..1795028a6
--- /dev/null
+++ b/docs/what-is-verdaccio.md
@@ -0,0 +1,35 @@
+---
+id: what-is-verdaccio
+title: "What is Verdaccio?"
+---
+
+## In a nutshell
+
+* It's a web app based on Node.js
+* It's a private npm registry
+* It's a local network proxy
+* It's a Pluggable application
+* It's a fairly easy install and use
+* We offer Docker and Kubernetes support
+* It is 100% compatible with yarn, npm and pnpm
+* It was born based on `sinopia@1.4.0` fork and *backward compatible*
+* Verdaccio means **A green color popular in late medieval Italy for fresco painting**.
+
+## What's a registry
+
+* A repository for packages that implements the CommonJS Compliant Package Registry specification for reading package info
+* Store npm packages
+* Provide an API compatible with npm clients
+* Semantic Versioning (semver) compatible
+
+```bash
+curl -v https://registry.npmjs.org/aaa
+
+* Connected to registry.npmjs.org (151.101.12.162) port 443 (#0)
+
+* Connection #0 to host registry.npmjs.org left intact
+{"_id":"aaa","_rev":"6-ad86dfc8720569871753b5bf561f2741","name":"aaa","description":"aaa...","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"aaa","version":"0.0.1","description":"aaa...","main":"index.js","scripts":{"test":"test.js"},"repository":{"type":"git","url":"http:/www.google.git"},"keywords":["math"],"author":{"name":"peter"},"license":"BSD","_id":"aaa@0.0.1","dist":
+{"shasum":"a04fa88ad887a70dd5429652ce23823619dfd7c3","tarball":"https://registry.npmjs.org/aaa/-/aaa-0.0.1.tgz"},"_npmVersion":"1.1.62","_npmUser":{"name":"erhu65","email":"erhu65@gmail.com"},"maintainers":[{"name":"erhu65","email":"erhu65@gmail.com"}],"directories":{}},"0.0.2":{"name":"aaa","version":"0.0.2","description":"aaa...","main":"index.js","scripts":{"test":"test.js"},"repository":{"type":"git","url":"http:/www.google.git"},"keywords":["math"],"author":{"name":"peter"},"license":"BSD","_id":"aaa@0.0.2","dist":
+{"shasum":"acd2f632b94b0f89765e75bb7b7549ce5b01caa2","tarball":"https://registry.npmjs.org/aaa/-/aaa-0.0.2.tgz"},"_npmVersion":"1.1.62","_npmUser":{"name":"erhu65","email":"erhu65@gmail.com"},"maintainers":[{"name":"erhu65","email":"erhu65@gmail.com"}],"directories":{}}},"readme":"ERROR: No README.md file found!","maintainers":[{"name":"erhu65","email":"erhu65@gmail.com"}],"timmacbook-j:verdaccio.mmacbookmacbook-j:verdaccio.master.git jpicmacbook-j:verdaccio.master.git jpicmacbookmacbookmacbookmacbookmacbook
+````
+
diff --git a/package.json b/package.json
index fc31af862..602c6cdac 100644
--- a/package.json
+++ b/package.json
@@ -130,7 +130,8 @@
"enterprise",
"modules",
"proxy",
- "server"
+ "server",
+ "verdaccio"
],
"scripts": {
"release": "standard-version -a -s",
diff --git a/website/blog/2017-12-20-new-version-3.0.0.md b/website/blog/2017-12-20-new-version-3.0.0.md
deleted file mode 100644
index bbb722abe..000000000
--- a/website/blog/2017-12-20-new-version-3.0.0.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-title: New Version 3.0.0
-author: Juan Picado
-authorURL: http://twitter.com/jotadeveloper
-authorFBID: 1122901551
----
-
-This blog post will test file name parsing issues when periods are present.
diff --git a/website/i18n/en.json b/website/i18n/en.json
index a5ac0f434..007a42708 100644
--- a/website/i18n/en.json
+++ b/website/i18n/en.json
@@ -17,6 +17,7 @@
"installation": "Installation",
"kubernetes": "Kubernetes",
"logger": "Logger",
+ "node-api": "Node API",
"notifications": "Notifications",
"packages": "Package Access",
"plugins": "Plugins",
@@ -29,6 +30,7 @@
"uplinks": "Uplinks",
"use-cases": "Use Cases",
"webui": "Web User Interface",
+ "what-is-verdaccio": "What is Verdaccio?",
"windows": "Installing As a Windows Service",
"Docs": "Docs",
"Help": "Help",
@@ -42,7 +44,7 @@
"Guides": "Guides"
},
"pages-strings": {
- "Learn more using the [documentation on this site.](/test-site/docs/en/doc1.html)|no description given": "Learn more using the [documentation on this site.](/test-site/docs/en/doc1.html)",
+ "Learn more using the [documentation on this site.](/docs/en/installation.html)|no description given": "Learn more using the [documentation on this site.](/docs/en/installation.html)",
"Browse Docs|no description given": "Browse Docs",
"Ask questions about the documentation and project|no description given": "Ask questions about the documentation and project",
"Join the community|no description given": "Join the community",
diff --git a/website/languages.js b/website/languages.js
index b25abc4d5..155d93e32 100644
--- a/website/languages.js
+++ b/website/languages.js
@@ -127,7 +127,7 @@ const languages = [
tag: 'pt-PT',
},
{
- enabled: true,
+ enabled: false,
name: 'Portuguรชs (Brasil)',
tag: 'pt-BR',
},
diff --git a/website/pages/en/help-with-translations.js b/website/pages/en/help-with-translations.js
index ba324ce7e..62f888ac8 100644
--- a/website/pages/en/help-with-translations.js
+++ b/website/pages/en/help-with-translations.js
@@ -22,7 +22,7 @@ class Help extends React.Component {
content: (
Learn more using the [documentation on this
- site.](/test-site/docs/en/doc1.html)
+ site.](/docs/en/installation.html)
),
title: Browse Docs,
diff --git a/website/pages/en/help.js b/website/pages/en/help.js
index 864c2a47f..8e94c1588 100755
--- a/website/pages/en/help.js
+++ b/website/pages/en/help.js
@@ -18,16 +18,18 @@ class Help extends React.Component {
const supportLinks = [
{
content:
- 'Learn more using the [documentation on this site.](/test-site/docs/en/doc1.html)',
+ 'Learn more about Verdaccio using the [documentation on this site.](/docs/en/installation.html)',
title: 'Browse Docs',
},
{
- content: 'Ask questions about the documentation and project',
- title: 'Join the community',
+ content: 'You can follow and contact us on [Twitter](https://twitter.com/verdaccio_npm).',
+ title: 'Twitter',
},
{
- content: "Find out what's new with this project",
- title: 'Stay up to date',
+ content: "If the documentation is not enough help, you can try browsing into our " +
+ "[Question Database](https://github.com/verdaccio/verdaccio/issues?utf8=%E2%9C%93&q=is%3Aissue+label%3Aquestion+) " +
+ "and also you can chat with the Verdaccio community in [Gitter](https://gitter.im/verdaccio/).",
+ title: 'More Help?',
},
];
@@ -38,7 +40,7 @@ class Help extends React.Component {
- This project is maintained by a dedicated group of people.
+ This project is maintained by the Verdaccio community.
diff --git a/website/pages/en/index.js b/website/pages/en/index.js
index 05276bb54..d9c57ff0c 100755
--- a/website/pages/en/index.js
+++ b/website/pages/en/index.js
@@ -137,9 +137,9 @@ class Index extends React.Component {
This project is used by many folks
{showcase}
- Are you using this project?
+ Are you using this project? Do not be shy and add your company/project logo.
Add your company
diff --git a/website/sidebars.json b/website/sidebars.json
index 48ac8c15c..27cb0c560 100644
--- a/website/sidebars.json
+++ b/website/sidebars.json
@@ -1,6 +1,7 @@
{
"docs": {
"Introduction": [
+ "what-is-verdaccio",
"installation",
"cli"
],
diff --git a/website/siteConfig.js b/website/siteConfig.js
index a448e2a87..6d8e0386a 100644
--- a/website/siteConfig.js
+++ b/website/siteConfig.js
@@ -13,7 +13,7 @@ const siteConfig = {
tagline: 'A lightweight private npm proxy registry',
url: 'http://www.verdaccio.org' /* your website url */,
organizationName: 'verdaccio',
- baseUrl: '/verdaccio/' /* base url for your project */,
+ baseUrl: '/' /* base url for your project */,
projectName: 'verdaccio',
headerLinks: [
{doc: 'installation', label: 'Docs'},
@@ -24,7 +24,7 @@ const siteConfig = {
/* path to images for header/footer */
headerIcon: 'img/verdaccio-tiny.png',
footerIcon: 'img/verdaccio-blackwhite.png',
- favicon: 'img/favicon.png',
+ favicon: 'img/favicon.ico',
/* colors for website */
colors: {
primaryColor: '#4B5E40',
diff --git a/website/static/img/devops_support.png b/website/static/img/devops_support.png
new file mode 100644
index 0000000000000000000000000000000000000000..6fe3d473858a54796c56f74f5859812003041c29
GIT binary patch
literal 33858
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
literal 0
HcmV?d00001
diff --git a/website/static/img/devops_support_grey.png b/website/static/img/devops_support_grey.png
new file mode 100644
index 0000000000000000000000000000000000000000..1fb4ac96638abb27a2606e04163928c03f33aee1
GIT binary patch
literal 33793
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