Skip to content

Commit

Permalink
feat: 馃幐 Add custom error which outputs the package name too
Browse files Browse the repository at this point in the history
Closes: lirantal#9
  • Loading branch information
emimuresan committed Oct 12, 2019
1 parent 76a5b3c commit 0904df3
Show file tree
Hide file tree
Showing 7 changed files with 73 additions and 3 deletions.
12 changes: 12 additions & 0 deletions packages/lockfile-lint-api/__tests__/validators.host.test.js
@@ -1,4 +1,5 @@
const ValidatorHost = require('../src/validators/ValidateHost')
const PackageError = require('../src/common/PackageError')

describe('Validator: Host', () => {
it('validator should throw an error when provided a string', () => {
Expand Down Expand Up @@ -142,4 +143,15 @@ describe('Validator: Host', () => {
]
})
})

it('validator should throw a descriptive error when one is encounterd in a package', () => {
const mockedPackages = {
'@babel/code-frame': {
resolved: 'debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791'
}
}
const validator = new ValidatorHost({packages: mockedPackages})

expect(() => validator.validate(['npm'])).toThrow(PackageError)
})
})
12 changes: 12 additions & 0 deletions packages/lockfile-lint-api/__tests__/validators.https.test.js
@@ -1,4 +1,5 @@
const ValidatorHTTPS = require('../src/validators/ValidateHttps')
const PackageError = require('../src/common/PackageError')

describe('Validator: HTTPS', () => {
it('validator should throw an error when provided a string', () => {
Expand Down Expand Up @@ -58,4 +59,15 @@ describe('Validator: HTTPS', () => {
errors: []
})
})

it('validator should throw a descriptive error when one is encounterd in a package', () => {
const mockedPackages = {
'@babel/code-frame': {
resolved: 'debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791'
}
}
const validator = new ValidatorHTTPS({packages: mockedPackages})

expect(() => validator.validate(['npm'])).toThrow(PackageError)
})
})
12 changes: 12 additions & 0 deletions packages/lockfile-lint-api/__tests__/validators.scheme.test.js
@@ -1,4 +1,5 @@
const ValidatorScheme = require('../src/validators/ValidateScheme')
const PackageError = require('../src/common/PackageError')

describe('Validator: Protocol', () => {
it('validator should throw an error when provided a string', () => {
Expand Down Expand Up @@ -58,4 +59,15 @@ describe('Validator: Protocol', () => {
errors: []
})
})

it('validator should throw a descriptive error when one is encounterd in a package', () => {
const mockedPackages = {
'@babel/code-frame': {
resolved: 'debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791'
}
}
const validator = new ValidatorScheme({packages: mockedPackages})

expect(() => validator.validate(['npm'])).toThrow(PackageError)
})
})
15 changes: 15 additions & 0 deletions packages/lockfile-lint-api/src/common/PackageError.js
@@ -0,0 +1,15 @@
'use strict'

module.exports = class PackageError extends Error {
/**
* constructor
* @param {string} packageName - the name of the package where the error occured
* @param {string} error - the original error object
*/
constructor (packageName = '', error = {}) {
super()
this.name = error.name || 'Error'
this.message = `Encountered error ${error.message} in package: "${packageName}"`
this.stack = error.stack
}
}
8 changes: 7 additions & 1 deletion packages/lockfile-lint-api/src/validators/ValidateHost.js
@@ -1,6 +1,7 @@
'use strict'

const {URL} = require('url')
const PackageError = require('../common/PackageError')

const REGISTRY = {
npm: 'registry.npmjs.org',
Expand Down Expand Up @@ -28,7 +29,12 @@ module.exports = class ValidateHost {
}

for (const [packageName, packageMetadata] of Object.entries(this.packages)) {
const packageResolvedURL = new URL(packageMetadata.resolved)
let packageResolvedURL = {}
try {
packageResolvedURL = new URL(packageMetadata.resolved)
} catch (error) {
throw new PackageError(packageName, error)
}

const allowedHosts = hosts.map(hostValue => {
// eslint-disable-next-line security/detect-object-injection
Expand Down
8 changes: 7 additions & 1 deletion packages/lockfile-lint-api/src/validators/ValidateHttps.js
@@ -1,6 +1,7 @@
'use strict'

const {URL} = require('url')
const PackageError = require('../common/PackageError')

const HTTPS_PROTOCOL = 'https:'

Expand All @@ -20,7 +21,12 @@ module.exports = class ValidateHttps {
}

for (const [packageName, packageMetadata] of Object.entries(this.packages)) {
const packageResolvedURL = new URL(packageMetadata.resolved)
let packageResolvedURL = {}
try {
packageResolvedURL = new URL(packageMetadata.resolved)
} catch (error) {
throw new PackageError(packageName, error)
}

if (packageResolvedURL.protocol !== HTTPS_PROTOCOL) {
validationResult.errors.push({
Expand Down
9 changes: 8 additions & 1 deletion packages/lockfile-lint-api/src/validators/ValidateScheme.js
@@ -1,6 +1,7 @@
'use strict'

const {URL} = require('url')
const PackageError = require('../common/PackageError')

module.exports = class ValidateProtocol {
constructor ({packages} = {}) {
Expand All @@ -22,7 +23,13 @@ module.exports = class ValidateProtocol {
}

for (const [packageName, packageMetadata] of Object.entries(this.packages)) {
const packageResolvedURL = new URL(packageMetadata.resolved)
let packageResolvedURL = {}
try {
packageResolvedURL = new URL(packageMetadata.resolved)
} catch (error) {
throw new PackageError(packageName, error)
}

if (schemes.indexOf(packageResolvedURL.protocol) === -1) {
// throw new Error(`detected invalid origin for package: ${packageName}`)
validationResult.errors.push({
Expand Down

0 comments on commit 0904df3

Please sign in to comment.