1
0
mirror of https://github.com/verdaccio/verdaccio.git synced 2025-02-21 07:29:37 +01:00

Merge pull request #1360 from verdaccio/feat-error-code

feat: storage plugins can throw http status codes
This commit is contained in:
Juan Picado @jotadeveloper 2019-07-16 19:08:04 +02:00 committed by GitHub
commit 4f87750c18
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 27 additions and 22 deletions

@ -63,6 +63,7 @@
"@types/minimatch": "3.0.3", "@types/minimatch": "3.0.3",
"@types/node": "12.6.2", "@types/node": "12.6.2",
"@types/request": "2.48.2", "@types/request": "2.48.2",
"@types/semver": "6.0.1",
"@typescript-eslint/eslint-plugin": "1.12.0", "@typescript-eslint/eslint-plugin": "1.12.0",
"@verdaccio/babel-preset": "0.2.1", "@verdaccio/babel-preset": "0.2.1",
"@verdaccio/eslint-config": "0.0.1", "@verdaccio/eslint-config": "0.0.1",

@ -3,7 +3,7 @@ import UrlNode from 'url';
import _ from 'lodash'; import _ from 'lodash';
import { ErrorCode, isObject, getLatestVersion, tagVersion, validateName } from './utils'; import { ErrorCode, isObject, getLatestVersion, tagVersion, validateName } from './utils';
import { generatePackageTemplate, normalizePackage, generateRevision, getLatestReadme, cleanUpReadme, normalizeContributors } from './storage-utils'; import { generatePackageTemplate, normalizePackage, generateRevision, getLatestReadme, cleanUpReadme, normalizeContributors } from './storage-utils';
import { API_ERROR, DIST_TAGS, STORAGE, USERS } from './constants'; import { API_ERROR, DIST_TAGS, HTTP_STATUS, STORAGE, USERS } from './constants';
import { createTarballHash } from './crypto-utils'; import { createTarballHash } from './crypto-utils';
import { prepareSearchPackage } from './storage-utils'; import { prepareSearchPackage } from './storage-utils';
import loadPlugin from '../lib/plugin-loader'; import loadPlugin from '../lib/plugin-loader';
@ -34,10 +34,10 @@ class LocalStorage implements IStorage {
return callback(ErrorCode.getNotFound('this package cannot be added')); return callback(ErrorCode.getNotFound('this package cannot be added'));
} }
storage.createPackage(name, generatePackageTemplate(name), (err: VerdaccioError): void => { storage.createPackage(name, generatePackageTemplate(name), err => {
// FIXME: it will be fixed here https://github.com/verdaccio/verdaccio/pull/1360 // FIXME: it will be fixed here https://github.com/verdaccio/verdaccio/pull/1360
// @ts-ignore // @ts-ignore
if (_.isNull(err) === false && err.code === STORAGE.FILE_EXIST_ERROR) { if (_.isNull(err) === false && (err.code === STORAGE.FILE_EXIST_ERROR || err.code === HTTP_STATUS.CONFLICT)) {
return callback(ErrorCode.getConflict()); return callback(ErrorCode.getConflict());
} }
@ -65,7 +65,7 @@ class LocalStorage implements IStorage {
storage.readPackage(name, (err, data: Package): void => { storage.readPackage(name, (err, data: Package): void => {
if (_.isNil(err) === false) { if (_.isNil(err) === false) {
if (err.code === STORAGE.NO_SUCH_FILE_ERROR) { if (err.code === STORAGE.NO_SUCH_FILE_ERROR || err.code === HTTP_STATUS.NOT_FOUND) {
return callback(ErrorCode.getNotFound()); return callback(ErrorCode.getNotFound());
} else { } else {
return callback(err); return callback(err);
@ -419,13 +419,13 @@ class LocalStorage implements IStorage {
const writeStream: IUploadTarball = storage.writeTarball(filename); const writeStream: IUploadTarball = storage.writeTarball(filename);
writeStream.on('error', (err: VerdaccioError): void => { writeStream.on('error', err => {
// @ts-ignore // @ts-ignore
if (err.code === STORAGE.FILE_EXIST_ERROR) { if (err.code === STORAGE.FILE_EXIST_ERROR || err.code === HTTP_STATUS.CONFLICT) {
uploadStream.emit('error', ErrorCode.getConflict()); uploadStream.emit('error', ErrorCode.getConflict());
uploadStream.abort(); uploadStream.abort();
// @ts-ignore // @ts-ignore
} else if (err.code === STORAGE.NO_SUCH_FILE_ERROR) { } else if (err.code === STORAGE.NO_SUCH_FILE_ERROR || err.code === HTTP_STATUS.NOT_FOUND) {
// check if package exists to throw an appropriate message // check if package exists to throw an appropriate message
this.getPackageMetadata(name, function(_err: VerdaccioError, _res: Package): void { this.getPackageMetadata(name, function(_err: VerdaccioError, _res: Package): void {
if (_err) { if (_err) {
@ -531,9 +531,9 @@ class LocalStorage implements IStorage {
} }
}; };
readTarballStream.on('error', function(err: VerdaccioError): void { readTarballStream.on('error', function(err) {
// @ts-ignore // @ts-ignore
if (err && err.code === STORAGE.NO_SUCH_FILE_ERROR) { if (err.code === STORAGE.NO_SUCH_FILE_ERROR || err.code === HTTP_STATUS.NOT_FOUND) {
stream.emit('error', e404('no such file available')); stream.emit('error', e404('no such file available'));
} else { } else {
stream.emit('error', err); stream.emit('error', err);
@ -624,7 +624,7 @@ class LocalStorage implements IStorage {
private _readPackage(name: string, storage: any, callback: Callback): void { private _readPackage(name: string, storage: any, callback: Callback): void {
storage.readPackage(name, (err, result): void => { storage.readPackage(name, (err, result): void => {
if (err) { if (err) {
if (err.code === STORAGE.NO_SUCH_FILE_ERROR) { if (err.code === STORAGE.NO_SUCH_FILE_ERROR || err.code === HTTP_STATUS.NOT_FOUND) {
return callback(ErrorCode.getNotFound()); return callback(ErrorCode.getNotFound());
} else { } else {
return callback(this._internalError(err, STORAGE.PACKAGE_FILE_NAME, 'error reading')); return callback(this._internalError(err, STORAGE.PACKAGE_FILE_NAME, 'error reading'));
@ -666,7 +666,7 @@ class LocalStorage implements IStorage {
storage.readPackage(pkgName, (err, data): void => { storage.readPackage(pkgName, (err, data): void => {
// TODO: race condition // TODO: race condition
if (_.isNil(err) === false) { if (_.isNil(err) === false) {
if (err.code === STORAGE.NO_SUCH_FILE_ERROR) { if (err.code === STORAGE.NO_SUCH_FILE_ERROR || err.code === HTTP_STATUS.NOT_FOUND) {
data = generatePackageTemplate(pkgName); data = generatePackageTemplate(pkgName);
} else { } else {
return callback(this._internalError(err, STORAGE.PACKAGE_FILE_NAME, 'error reading')); return callback(this._internalError(err, STORAGE.PACKAGE_FILE_NAME, 'error reading'));

@ -263,7 +263,8 @@ export function parseAddress(urlAddress: any): any {
* @return {Array} sorted Array * @return {Array} sorted Array
*/ */
export function semverSort(listVersions: string[]): string[] { export function semverSort(listVersions: string[]): string[] {
return listVersions return (
listVersions
.filter(function(x): boolean { .filter(function(x): boolean {
if (!semver.parse(x, true)) { if (!semver.parse(x, true)) {
Logger.logger.warn({ ver: x }, 'ignoring bad version @{ver}'); Logger.logger.warn({ ver: x }, 'ignoring bad version @{ver}');
@ -271,8 +272,11 @@ export function semverSort(listVersions: string[]): string[] {
} }
return true; return true;
}) })
// FIXME: it seems the @types/semver do not handle a legitimate method named 'compareLoose'
// @ts-ignore
.sort(semver.compareLoose) .sort(semver.compareLoose)
.map(String); .map(String)
);
} }
/** /**

BIN
yarn.lock

Binary file not shown.