@@ -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' }),
|
||||
},
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -26,6 +26,7 @@ module.exports = class GithubContributors extends GithubAuthService {
|
||||
{
|
||||
title: 'GitHub contributors',
|
||||
namedParams: {
|
||||
which: 'contributors',
|
||||
user: 'cdnjs',
|
||||
repo: 'cdnjs',
|
||||
},
|
||||
|
||||
@@ -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,
|
||||
},
|
||||
|
||||
@@ -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({
|
||||
|
||||
@@ -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 }),
|
||||
},
|
||||
]
|
||||
|
||||
@@ -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' }),
|
||||
},
|
||||
]
|
||||
|
||||
@@ -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 ${
|
||||
|
||||
Reference in New Issue
Block a user