Validate namedParams in examples (#2786)

Fix #2784
This commit is contained in:
Paul Melnikow
2019-01-16 19:38:36 -05:00
committed by GitHub
parent 97e719f226
commit 7d4acba5c1
8 changed files with 38 additions and 17 deletions

View File

@@ -20,13 +20,13 @@ module.exports = class BowerVersion extends BaseBowerService {
return [
{
title: 'Bower',
namedParams: { vtype: 'v', packageName: 'bootstrap' },
namedParams: { packageName: 'bootstrap' },
pattern: 'v/:packageName',
staticPreview: renderVersionBadge({ version: '4.2.1' }),
},
{
title: 'Bower Pre Release',
namedParams: { vtype: 'vpre', packageName: 'bootstrap' },
namedParams: { packageName: 'bootstrap' },
pattern: 'vpre/:packageName',
staticPreview: renderVersionBadge({ version: '4.2.1' }),
},

View File

@@ -34,11 +34,10 @@ module.exports = class CIIBestPracticesService extends BaseJsonService {
return [
{
title: 'CII Best Practices Level',
pattern: 'level/:projectId',
namedParams: {
metric: 'level',
projectId: '1',
},
pattern: 'level/:projectId',
staticPreview: this.render({
message: 'gold',
color: '#E9C504',
@@ -47,11 +46,10 @@ module.exports = class CIIBestPracticesService extends BaseJsonService {
},
{
title: 'CII Best Practices Tiered Percentage',
pattern: 'percentage/:projectId',
namedParams: {
metric: 'percentage',
projectId: '29',
},
pattern: 'percentage/:projectId',
staticPreview: this.render({
message: '107%',
color: 'brightgreen',
@@ -60,11 +58,10 @@ module.exports = class CIIBestPracticesService extends BaseJsonService {
},
{
title: 'CII Best Practices Summary',
pattern: 'summary/:projectId',
namedParams: {
metric: 'summary',
projectId: '33',
},
pattern: 'summary/:projectId',
staticPreview: this.render({
message: 'in progress 94%',
color: '#C4C21D',

View File

@@ -26,6 +26,7 @@ module.exports = class GithubContributors extends GithubAuthService {
{
title: 'GitHub contributors',
namedParams: {
which: 'contributors',
user: 'cdnjs',
repo: 'cdnjs',
},

View File

@@ -31,21 +31,19 @@ module.exports = class LeanpubBookSummaryService extends BaseJsonService {
return [
{
title: 'Leanpub Book Page Count',
pattern: 'pages/:book',
namedParams: {
metric: 'pages',
book: 'juice-shop',
},
pattern: 'pages/:book',
staticPreview: this.render({ label: 'pages', message: 226 }),
keywords,
},
{
title: 'Leanpub Book Total Copies Sold',
pattern: 'sold/:book',
namedParams: {
metric: 'sold',
book: 'juice-shop',
},
pattern: 'sold/:book',
staticPreview: this.render({ label: 'sold', message: 2691 }),
keywords,
},

View File

@@ -39,7 +39,6 @@ module.exports = class NpmDependencyVersion extends NpmBase {
pattern: ':packageName/dev/:dependency',
namedParams: {
packageName: 'react-boxplot',
kind: 'dev',
dependency: 'eslint-config-standard',
},
staticPreview: this.render({

View File

@@ -94,13 +94,13 @@ function createServiceFamily({
{
title,
pattern: 'v/:packageName',
namedParams: { which: 'v', packageName: examplePackageName },
namedParams: { packageName: examplePackageName },
staticPreview: this.render({ version: exampleVersion }),
},
{
title: `${title} (with prereleases)`,
pattern: 'vpre/:packageName',
namedParams: { which: 'vpre', packageName: examplePackageName },
namedParams: { packageName: examplePackageName },
staticPreview: this.render({ version: examplePrereleaseVersion }),
},
]

View File

@@ -72,13 +72,13 @@ class PowershellGalleryVersion extends BaseXmlService {
{
title: 'PowerShell Gallery',
pattern: 'v/:packageName',
namedParams: { which: 'v', packageName: 'Azure.Storage' },
namedParams: { packageName: 'Azure.Storage' },
staticPreview: this.render({ version: '4.4.0' }),
},
{
title: 'PowerShell Gallery (with prereleases)',
pattern: 'vpre/:packageName',
namedParams: { which: 'vpre', packageName: 'Azure.Storage' },
namedParams: { packageName: 'Azure.Storage' },
staticPreview: this.render({ version: '4.4.1-preview' }),
},
]

View File

@@ -1,6 +1,7 @@
'use strict'
const Joi = require('joi')
const pathToRegexp = require('path-to-regexp')
const optionalObjectOfKeyValues = Joi.object().pattern(
/./,
@@ -65,6 +66,31 @@ function validateExample(example, index, ServiceClass) {
} at index ${index} also declares a dynamic previewUrl, which is not allowed`
)
}
// Make sure we can build the full URL using these patterns.
try {
pathToRegexp.compile(pattern || ServiceClass.route.pattern)(namedParams)
} catch (e) {
throw Error(
`In example for ${
ServiceClass.name
} at index ${index}, ${e.message.toLowerCase()}`
)
}
// Make sure there are no extra keys.
let keys = []
pathToRegexp(pattern || ServiceClass.route.pattern, keys)
keys = keys.map(({ name }) => name)
const extraKeys = Object.keys(namedParams).filter(k => !keys.includes(k))
if (extraKeys.length) {
throw Error(
`In example for ${
ServiceClass.name
} at index ${index}, namedParams contains unknown keys: ${extraKeys.join(
', '
)}`
)
}
} else if (!previewUrl) {
throw Error(
`Example for ${