From e2fa581644e14e28e5147ceee015bcc869bf069c Mon Sep 17 00:00:00 2001 From: Ayush Sharma Date: Mon, 21 Jan 2019 22:08:07 +0100 Subject: [PATCH 01/11] fix: adds _id to normalise metadata (#1194) --- src/lib/storage-utils.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/lib/storage-utils.js b/src/lib/storage-utils.js index 715037fb2..112561ac5 100644 --- a/src/lib/storage-utils.js +++ b/src/lib/storage-utils.js @@ -53,6 +53,10 @@ function normalizePackage(pkg: Package) { pkg._rev = DEFAULT_REVISION; } + if (_.isString(pkg._id) === false) { + pkg._id = pkg.name; + } + // normalize dist-tags normalizeDistTags(pkg); @@ -107,7 +111,7 @@ export function normalizeContributors(contributors: Array): Array Date: Tue, 22 Jan 2019 07:16:52 +0100 Subject: [PATCH 02/11] chore(release): 3.10.2 --- CHANGELOG.md | 16 ++++++++++++++++ package.json | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a4e69799a..8963eee17 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,22 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + +## [3.10.2](https://github.com/verdaccio/verdaccio/compare/v3.10.1...v3.10.2) (2019-01-22) + + +### Bug Fixes + +* add logic to catch clause ([#1183](https://github.com/verdaccio/verdaccio/issues/1183)) ([056d396](https://github.com/verdaccio/verdaccio/commit/056d396)) +* adds _id to normalise metadata ([#1194](https://github.com/verdaccio/verdaccio/issues/1194)) ([e2fa581](https://github.com/verdaccio/verdaccio/commit/e2fa581)) +* remove some unneeded checks ([#1182](https://github.com/verdaccio/verdaccio/issues/1182)) ([ab56d75](https://github.com/verdaccio/verdaccio/commit/ab56d75)) +* remove unused object ([#1185](https://github.com/verdaccio/verdaccio/issues/1185)) ([e9b3907](https://github.com/verdaccio/verdaccio/commit/e9b3907)) +* remove unused parameters from processBody method invocation ([#1184](https://github.com/verdaccio/verdaccio/issues/1184)) ([064f7cf](https://github.com/verdaccio/verdaccio/commit/064f7cf)) +* remove use of comma separator ([#1186](https://github.com/verdaccio/verdaccio/issues/1186)) ([f20fefa](https://github.com/verdaccio/verdaccio/commit/f20fefa)) +* remove useless assignment to local variable emailCopy ([#1181](https://github.com/verdaccio/verdaccio/issues/1181)) ([13b8347](https://github.com/verdaccio/verdaccio/commit/13b8347)) + + + ## [3.10.1](https://github.com/verdaccio/verdaccio/compare/v3.10.0...v3.10.1) (2018-12-20) diff --git a/package.json b/package.json index 97e712c5f..7ccaaefea 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "verdaccio", - "version": "3.10.1", + "version": "3.10.2", "description": "Private npm repository server", "author": { "name": "Alex Kocharin", From a3590558d7845811c22e8365328120c70506611c Mon Sep 17 00:00:00 2001 From: Rostislav Simonik Date: Sun, 27 Jan 2019 10:19:46 +0100 Subject: [PATCH 03/11] feat: introduce server keepAliveTimeout into config files Set default timeout to 60 seconds (it's workaround for issue reported in issues/301). --- conf/default.yaml | 6 ++++++ conf/full.yaml | 6 ++++++ src/lib/bootstrap.js | 5 ++++- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/conf/default.yaml b/conf/default.yaml index 8e3bb14f6..cdea139da 100644 --- a/conf/default.yaml +++ b/conf/default.yaml @@ -50,6 +50,12 @@ packages: # if package is not available locally, proxy requests to 'npmjs' registry proxy: npmjs +# You can specify HTTP/1.1 server keep alive timeout in seconds for incomming connections. +# A value of 0 makes the http server behave similarly to Node.js versions prior to 8.0.0, which did not have a keep-alive timeout. +# WORKAROUND: Through given configuration you can workaround following issue https://github.com/verdaccio/verdaccio/issues/301. Set to 0 in case 60 is not enought. +server: + keepAliveTimeout: 60 + # To use `npm audit` uncomment the following section middlewares: audit: diff --git a/conf/full.yaml b/conf/full.yaml index 1af6251e8..c578e29e4 100644 --- a/conf/full.yaml +++ b/conf/full.yaml @@ -115,6 +115,12 @@ packages: # - [::1]:4873 # ipv6 # - unix:/tmp/verdaccio.sock # unix socket +# You can specify HTTP/1.1 server keep alive timeout in seconds for incomming connections. +# A value of 0 makes the http server behave similarly to Node.js versions prior to 8.0.0, which did not have a keep-alive timeout. +# WORKAROUND: Through given configuration you can workaround following issue https://github.com/verdaccio/verdaccio/issues/301. Set to 0 in case 60 is not enought. +server: + keepAliveTimeout: 60 + # Configure HTTPS, it is required if you use "https" protocol above. #https: # key: path/to/server.key diff --git a/src/lib/bootstrap.js b/src/lib/bootstrap.js index 585d41253..1d4ce449a 100644 --- a/src/lib/bootstrap.js +++ b/src/lib/bootstrap.js @@ -89,7 +89,10 @@ function startVerdaccio(config: any, } else { // http webServer = http.createServer(app); } - + if (config.server && config.server.keepAliveTimeout) { + // $FlowFixMe library definition for node is not up to date (doesn't contain recent 8.0 changes) + webServer.keepAliveTimeout = config.server.keepAliveTimeout; + } unlinkAddressPath(addr); callback(webServer, addr, pkgName, pkgVersion); From 23b02c01fccfbf0b34af02f1281cc13a407d0395 Mon Sep 17 00:00:00 2001 From: "Juan Picado @jotadeveloper" Date: Sun, 27 Jan 2019 10:42:20 +0100 Subject: [PATCH 04/11] chore(release): 3.11.0 --- CHANGELOG.md | 10 ++++++++++ package.json | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8963eee17..51df7d7d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,16 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + +# [3.11.0](https://github.com/verdaccio/verdaccio/compare/v3.10.2...v3.11.0) (2019-01-27) + + +### Features + +* introduce server keepAliveTimeout into config files ([a359055](https://github.com/verdaccio/verdaccio/commit/a359055)) + + + ## [3.10.2](https://github.com/verdaccio/verdaccio/compare/v3.10.1...v3.10.2) (2019-01-22) diff --git a/package.json b/package.json index 7ccaaefea..cb231553d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "verdaccio", - "version": "3.10.2", + "version": "3.11.0", "description": "Private npm repository server", "author": { "name": "Alex Kocharin", From 95686be47d5feabd3e35a7ce1ec291a82ebfbff1 Mon Sep 17 00:00:00 2001 From: BuffayBu Date: Tue, 29 Jan 2019 11:54:47 +0800 Subject: [PATCH 05/11] =?UTF-8?q?fix:=20don=E2=80=99t=20packages=20that=20?= =?UTF-8?q?have=20no=20uplinks=20after=20reading=20(#1204)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib/storage.js | 4 +++- test/unit/api/store.spec.js | 28 ++++++++++++++++++++++++---- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/lib/storage.js b/src/lib/storage.js index e13ac4290..98ae440f9 100644 --- a/src/lib/storage.js +++ b/src/lib/storage.js @@ -487,7 +487,9 @@ class Storage implements IStorageHandler { , null , upLinksErrors ); } - + if (upLinks.length === 0) { + return callback(null, packageInfo); + } self.localStorage.updateVersions(name, packageInfo, function(err, packageJsonLocal: Package) { if (err) { return callback(err); diff --git a/test/unit/api/store.spec.js b/test/unit/api/store.spec.js index 02c884e0f..b4dee0bca 100644 --- a/test/unit/api/store.spec.js +++ b/test/unit/api/store.spec.js @@ -2,6 +2,8 @@ import _ from 'lodash'; import path from 'path'; +import fs from 'fs'; +import rimraf from 'rimraf'; // $FlowFixMe import configExample from '../partials/config/index'; import AppConfig from '../../../src/lib/config'; @@ -16,12 +18,12 @@ import {DOMAIN_SERVERS} from '../../functional/config.functional'; setup(configExample.logs); +const storagePath = path.join(__dirname, '../partials/store/test-storage-store.spec'); const mockServerPort: number = 55548; const generateStorage = async function(port = mockServerPort, configDefault = configExample) { const storageConfig = _.clone(configDefault); - const storage = path.join(__dirname, '../partials/store/test-storage-store.spec'); storageConfig.self_path = __dirname; - storageConfig.storage = storage; + storageConfig.storage = storagePath; storageConfig.uplinks = { npmjs: { url: `http://${DOMAIN_SERVERS}:${port}` @@ -37,8 +39,11 @@ const generateStorage = async function(port = mockServerPort, configDefault = co describe('StorageTest', () => { let mockRegistry; - beforeAll(async () => { - mockRegistry = await mockServer(mockServerPort).init(); + beforeAll(done => { + rimraf(storagePath, async () => { + mockRegistry = await mockServer(mockServerPort).init(); + done() + }) }); afterAll(function(done) { @@ -90,5 +95,20 @@ describe('StorageTest', () => { done(); }); }); + + test('should not touch if the package exists and has no uplinks', async (done) => { + const storage: IStorageHandler = await generateStorage(); + const metadataPath = path.join(storagePath, 'npm_test/package.json') + fs.mkdirSync(path.join(storagePath, 'npm_test')) + fs.copyFileSync(path.join(__dirname, '../partials/metadata'), metadataPath) + const metadata = JSON.parse(fs.readFileSync(metadataPath).toString()) + const prevStat = fs.statSync(metadataPath) + storage._syncUplinksMetadata('npm_test', metadata, {}, (err) => { + expect(err).toBeFalsy() + const nextStat = fs.statSync(metadataPath) + expect(nextStat).toEqual(prevStat) + done() + }) + }) }); }); From e62ef8df99aee72250f1e684d1aa1040e71ff7ab Mon Sep 17 00:00:00 2001 From: BuffayBu Date: Tue, 29 Jan 2019 11:59:31 +0800 Subject: [PATCH 06/11] =?UTF-8?q?fix:=20don=E2=80=99t=20make=20change=20if?= =?UTF-8?q?=20`time`=20fields=20match=20(#1167)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib/local-storage.js | 2 +- test/unit/api/local-storage.spec.js | 23 +++++++++++++++---- .../partials/metadata-update-versions-tags | 8 ++++++- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/lib/local-storage.js b/src/lib/local-storage.js index ffbc5d8a0..2bd3ac9a3 100644 --- a/src/lib/local-storage.js +++ b/src/lib/local-storage.js @@ -185,7 +185,7 @@ class LocalStorage implements IStorage { } } - if ('time' in packageInfo) { + if ('time' in packageInfo && !_.isEqual(packageLocalJson.time, packageInfo.time)) { packageLocalJson.time = packageInfo.time; change = true; } diff --git a/test/unit/api/local-storage.spec.js b/test/unit/api/local-storage.spec.js index 2a081cae8..600581554 100644 --- a/test/unit/api/local-storage.spec.js +++ b/test/unit/api/local-storage.spec.js @@ -2,6 +2,7 @@ import rimRaf from 'rimraf'; import path from 'path'; +import fs from 'fs'; import LocalStorage from '../../../src/lib/local-storage'; import AppConfig from '../../../src/lib/config'; // $FlowFixMe @@ -250,14 +251,16 @@ describe('LocalStorage', () => { }); describe('LocalStorage::updateVersions', () => { - test('should update versions from external source', async (done) => { - const metadata = JSON.parse(readMetadata('metadata-update-versions-tags')); - const pkgName = 'add-update-versions-test-1'; - const version = '1.0.2'; + const metadata = JSON.parse(readMetadata('metadata-update-versions-tags')); + const pkgName = 'add-update-versions-test-1'; + const version = '1.0.2'; + beforeAll(async () => { await addPackageToStore(pkgName, generatePackageTemplate(pkgName)); await addNewVersion(pkgName, '1.0.1'); await addNewVersion(pkgName, version); + }) + test('should update versions from external source', async (done) => { storage.updateVersions(pkgName, metadata, (err, data) => { expect(err).toBeNull(); expect(data.versions['1.0.1']).toBeDefined(); @@ -274,6 +277,18 @@ describe('LocalStorage', () => { done(); }); }); + + test('should not update if the metadata match', done => { + const metadataPath = path.join(configExample.storage, pkgName, 'package.json') + const prevStat = fs.statSync(metadataPath) + storage.updateVersions(pkgName, metadata, (err, data) => { + expect(err).toBeNull() + const nextStat = fs.statSync(metadataPath) + expect(nextStat).toHaveProperty('ctime', prevStat.ctime) + expect(nextStat).toHaveProperty('mtime', prevStat.mtime) + done() + }) + }) }); describe('LocalStorage::changePackage', () => { diff --git a/test/unit/partials/metadata-update-versions-tags b/test/unit/partials/metadata-update-versions-tags index 4679888fc..9a10d432b 100644 --- a/test/unit/partials/metadata-update-versions-tags +++ b/test/unit/partials/metadata-update-versions-tags @@ -82,7 +82,13 @@ "beta": "1.0.2", "next": "1.0.4" }, - "time": {}, + "time": { + "modified": "2019-01-29T03:20:04.000Z", + "created": "2019-01-29T03:20:00.000Z", + "1.0.1": "2019-01-29T03:20:01.000Z", + "1.0.2": "2019-01-29T03:20:02.000Z", + "1.0.4": "2019-01-29T03:20:04.000Z" + }, "_distfiles": {}, "_attachments": {}, "_uplinks": {}, From 35f0b539d96e8e193b8ba7562fd5b280e55155ff Mon Sep 17 00:00:00 2001 From: BuffayBu Date: Tue, 29 Jan 2019 14:03:04 +0800 Subject: [PATCH 07/11] test: use node v6 compatible fs api --- test/unit/api/store.spec.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/unit/api/store.spec.js b/test/unit/api/store.spec.js index b4dee0bca..0eed92228 100644 --- a/test/unit/api/store.spec.js +++ b/test/unit/api/store.spec.js @@ -98,9 +98,10 @@ describe('StorageTest', () => { test('should not touch if the package exists and has no uplinks', async (done) => { const storage: IStorageHandler = await generateStorage(); + const metadataSource = path.join(__dirname, '../partials/metadata') const metadataPath = path.join(storagePath, 'npm_test/package.json') fs.mkdirSync(path.join(storagePath, 'npm_test')) - fs.copyFileSync(path.join(__dirname, '../partials/metadata'), metadataPath) + fs.writeFileSync(metadataPath, fs.readFileSync(metadataSource)); const metadata = JSON.parse(fs.readFileSync(metadataPath).toString()) const prevStat = fs.statSync(metadataPath) storage._syncUplinksMetadata('npm_test', metadata, {}, (err) => { From f7685f781e49748dac52281f9b7c7edbaf0c8732 Mon Sep 17 00:00:00 2001 From: BuffayBu Date: Wed, 30 Jan 2019 11:10:10 +0800 Subject: [PATCH 08/11] test(local-storage): isolate tests & replace the hacky test --- test/unit/api/local-storage.spec.js | 47 ++++++++++++++++++----------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/test/unit/api/local-storage.spec.js b/test/unit/api/local-storage.spec.js index 600581554..8d398c767 100644 --- a/test/unit/api/local-storage.spec.js +++ b/test/unit/api/local-storage.spec.js @@ -2,7 +2,6 @@ import rimRaf from 'rimraf'; import path from 'path'; -import fs from 'fs'; import LocalStorage from '../../../src/lib/local-storage'; import AppConfig from '../../../src/lib/config'; // $FlowFixMe @@ -27,6 +26,13 @@ describe('LocalStorage', () => { const pkgNameScoped = `@scope/${pkgName}-scope`; const tarballName: string = `${pkgName}-add-tarball-1.0.4.tgz`; const tarballName2: string = `${pkgName}-add-tarball-1.0.5.tgz`; + + const getStorage = (LocalStorageClass = LocalStorage) => { + const config: Config = new AppConfig(configExample); + config.self_path = path.join('../partials/store'); + return new LocalStorageClass(config, Logger.logger); + } + const getPackageMetadataFromStore = (pkgName: string) => { return new Promise((resolve) => { storage.getPackageMetadata(pkgName, (err, data ) => { @@ -78,10 +84,7 @@ describe('LocalStorage', () => { }; beforeAll(() => { - const config: Config = new AppConfig(configExample); - config.self_path = path.join('../partials/store'); - - storage = new LocalStorage(config, Logger.logger); + storage = getStorage(); }); test('should be defined', () => { @@ -254,15 +257,24 @@ describe('LocalStorage', () => { const metadata = JSON.parse(readMetadata('metadata-update-versions-tags')); const pkgName = 'add-update-versions-test-1'; const version = '1.0.2'; - beforeAll(async () => { - await addPackageToStore(pkgName, generatePackageTemplate(pkgName)); - await addNewVersion(pkgName, '1.0.1'); - await addNewVersion(pkgName, version); + let _storage; + beforeEach(done => { + class MockLocalStorage extends LocalStorage {} + // $FlowFixMe + MockLocalStorage.prototype._writePackage = jest.fn(LocalStorage.prototype._writePackage) + _storage = getStorage(MockLocalStorage); + rimRaf(path.join(configExample.storage, pkgName), async () => { + await addPackageToStore(pkgName, generatePackageTemplate(pkgName)); + await addNewVersion(pkgName, '1.0.1'); + await addNewVersion(pkgName, version); + done(); + }) }) test('should update versions from external source', async (done) => { - storage.updateVersions(pkgName, metadata, (err, data) => { + _storage.updateVersions(pkgName, metadata, (err, data) => { expect(err).toBeNull(); + expect(_storage._writePackage).toHaveBeenCalledTimes(1); expect(data.versions['1.0.1']).toBeDefined(); expect(data.versions[version]).toBeDefined(); expect(data.versions['1.0.4']).toBeDefined(); @@ -279,14 +291,13 @@ describe('LocalStorage', () => { }); test('should not update if the metadata match', done => { - const metadataPath = path.join(configExample.storage, pkgName, 'package.json') - const prevStat = fs.statSync(metadataPath) - storage.updateVersions(pkgName, metadata, (err, data) => { - expect(err).toBeNull() - const nextStat = fs.statSync(metadataPath) - expect(nextStat).toHaveProperty('ctime', prevStat.ctime) - expect(nextStat).toHaveProperty('mtime', prevStat.mtime) - done() + _storage.updateVersions(pkgName, metadata, e => { + expect(e).toBeNull() + _storage.updateVersions(pkgName, metadata, err => { + expect(err).toBeNull() + expect(_storage._writePackage).toHaveBeenCalledTimes(1); + done() + }) }) }) }); From 933034f3c92542db77de5b5cfceaf156cd03409e Mon Sep 17 00:00:00 2001 From: BuffayBu Date: Wed, 30 Jan 2019 11:19:54 +0800 Subject: [PATCH 09/11] test(storage): replace the hacky test --- test/unit/api/store.spec.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/unit/api/store.spec.js b/test/unit/api/store.spec.js index 0eed92228..ee93fc40b 100644 --- a/test/unit/api/store.spec.js +++ b/test/unit/api/store.spec.js @@ -103,11 +103,11 @@ describe('StorageTest', () => { fs.mkdirSync(path.join(storagePath, 'npm_test')) fs.writeFileSync(metadataPath, fs.readFileSync(metadataSource)); const metadata = JSON.parse(fs.readFileSync(metadataPath).toString()) - const prevStat = fs.statSync(metadataPath) + // $FlowFixMe + storage.localStorage.updateVersions = jest.fn(storage.localStorage.updateVersions) storage._syncUplinksMetadata('npm_test', metadata, {}, (err) => { - expect(err).toBeFalsy() - const nextStat = fs.statSync(metadataPath) - expect(nextStat).toEqual(prevStat) + expect(err).toBeNull() + expect(storage.localStorage.updateVersions).not.toHaveBeenCalled() done() }) }) From 09ac72990c259305eef2658829e1d01a65e4ac0b Mon Sep 17 00:00:00 2001 From: BuffayBu Date: Wed, 30 Jan 2019 11:21:36 +0800 Subject: [PATCH 10/11] test(storage): add semicolons --- test/unit/api/store.spec.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/test/unit/api/store.spec.js b/test/unit/api/store.spec.js index ee93fc40b..9ea50ff48 100644 --- a/test/unit/api/store.spec.js +++ b/test/unit/api/store.spec.js @@ -98,18 +98,18 @@ describe('StorageTest', () => { test('should not touch if the package exists and has no uplinks', async (done) => { const storage: IStorageHandler = await generateStorage(); - const metadataSource = path.join(__dirname, '../partials/metadata') - const metadataPath = path.join(storagePath, 'npm_test/package.json') - fs.mkdirSync(path.join(storagePath, 'npm_test')) + const metadataSource = path.join(__dirname, '../partials/metadata'); + const metadataPath = path.join(storagePath, 'npm_test/package.json'); + fs.mkdirSync(path.join(storagePath, 'npm_test')); fs.writeFileSync(metadataPath, fs.readFileSync(metadataSource)); - const metadata = JSON.parse(fs.readFileSync(metadataPath).toString()) + const metadata = JSON.parse(fs.readFileSync(metadataPath).toString()); // $FlowFixMe - storage.localStorage.updateVersions = jest.fn(storage.localStorage.updateVersions) + storage.localStorage.updateVersions = jest.fn(storage.localStorage.updateVersions); storage._syncUplinksMetadata('npm_test', metadata, {}, (err) => { - expect(err).toBeNull() - expect(storage.localStorage.updateVersions).not.toHaveBeenCalled() - done() - }) - }) + expect(err).toBeNull(); + expect(storage.localStorage.updateVersions).not.toHaveBeenCalled(); + done(); + }); + }); }); }); From ad4dc37e390c7ffaf79998265a9943e9ae16af0e Mon Sep 17 00:00:00 2001 From: "Juan Picado @jotadeveloper" Date: Thu, 31 Jan 2019 19:54:31 +0100 Subject: [PATCH 11/11] chore(release): 3.11.1 --- CHANGELOG.md | 11 +++++++++++ package.json | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 51df7d7d0..d5c219726 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,17 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + +## [3.11.1](https://github.com/verdaccio/verdaccio/compare/v3.11.0...v3.11.1) (2019-01-31) + + +### Bug Fixes + +* don’t make change if `time` fields match ([#1167](https://github.com/verdaccio/verdaccio/issues/1167)) ([e62ef8d](https://github.com/verdaccio/verdaccio/commit/e62ef8d)) +* don’t packages that have no uplinks after reading ([#1204](https://github.com/verdaccio/verdaccio/issues/1204)) ([95686be](https://github.com/verdaccio/verdaccio/commit/95686be)) + + + # [3.11.0](https://github.com/verdaccio/verdaccio/compare/v3.10.2...v3.11.0) (2019-01-27) diff --git a/package.json b/package.json index cb231553d..852568bee 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "verdaccio", - "version": "3.11.0", + "version": "3.11.1", "description": "Private npm repository server", "author": { "name": "Alex Kocharin",