Skip to content

Commit

Permalink
migrate examples to openApi part 35; affects [npm] (badges#9866)
Browse files Browse the repository at this point in the history
* migrate some services from examples to openApi

* clarify docs on scoped/unscoped packages
  • Loading branch information
chris48s authored Jan 6, 2024
1 parent a388c6e commit 9493d00
Show file tree
Hide file tree
Showing 7 changed files with 164 additions and 174 deletions.
3 changes: 3 additions & 0 deletions services/npm/npm-base.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@ export const queryParamSchema = Joi.object({
registry_uri: optionalUrl,
}).required()

export const packageNameDescription =
'This may be the name of an unscoped package like `package-name` or a [scoped package](https://docs.npmjs.com/about-scopes) like `@author/package-name`'

// Abstract class for NPM badges which display data about the latest version
// of a package.
export default class NpmBase extends BaseJsonService {
Expand Down
38 changes: 19 additions & 19 deletions services/npm/npm-collaborators.service.js
Original file line number Diff line number Diff line change
@@ -1,30 +1,30 @@
import { pathParam, queryParam } from '../index.js'
import { renderContributorBadge } from '../contributor-count.js'
import NpmBase from './npm-base.js'

const keywords = ['node']
import NpmBase, { packageNameDescription } from './npm-base.js'

export default class NpmCollaborators extends NpmBase {
static category = 'activity'

static route = this.buildRoute('npm/collaborators', { withTag: false })

static examples = [
{
title: 'npm collaborators',
pattern: ':packageName',
namedParams: { packageName: 'prettier' },
staticPreview: this.render({ collaborators: 6 }),
keywords,
},
{
title: 'npm collaborators',
pattern: ':packageName',
namedParams: { packageName: 'prettier' },
queryParams: { registry_uri: 'https://registry.npmjs.com' },
staticPreview: this.render({ collaborators: 6 }),
keywords,
static openApi = {
'/npm/collaborators/{packageName}': {
get: {
summary: 'NPM Collaborators',
parameters: [
pathParam({
name: 'packageName',
example: 'prettier',
description: packageNameDescription,
}),
queryParam({
name: 'registry_uri',
example: 'https://registry.npmjs.com',
}),
],
},
},
]
}

static defaultBadgeData = {
label: 'npm collaborators',
Expand Down
133 changes: 50 additions & 83 deletions services/npm/npm-dependency-version.service.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { pathParam, queryParam } from '../index.js'
import { getDependencyVersion } from '../package-json-helpers.js'
import NpmBase from './npm-base.js'

const { queryParamSchema } = NpmBase
const keywords = ['node']
import NpmBase, {
queryParamSchema,
packageNameDescription,
} from './npm-base.js'

export default class NpmDependencyVersion extends NpmBase {
static category = 'platform-support'
Expand All @@ -14,89 +15,55 @@ export default class NpmDependencyVersion extends NpmBase {
queryParamSchema,
}

static examples = [
{
title: 'npm peer dependency version',
pattern: ':packageName/peer/:dependency',
namedParams: {
packageName: 'react-boxplot',
dependency: 'prop-types',
},
staticPreview: this.render({
dependency: 'prop-types',
range: '^15.5.4',
}),
keywords,
},
{
title: 'npm peer dependency version (scoped)',
pattern: ':scope?/:packageName/peer/:dependencyScope?/:dependency',
namedParams: {
scope: '@swellaby',
packageName: 'eslint-config',
dependency: 'eslint',
},
staticPreview: this.render({
dependency: 'eslint',
range: '^3.0.0',
}),
keywords,
},
{
title: 'npm dev dependency version',
pattern: ':packageName/dev/:dependency',
namedParams: {
packageName: 'react-boxplot',
dependency: 'eslint-config-standard',
static openApi = {
'/npm/dependency-version/{packageName}/{dependency}': {
get: {
summary: 'NPM (prod) Dependency Version',
parameters: [
pathParam({
name: 'packageName',
example: 'react-boxplot',
description: packageNameDescription,
}),
pathParam({
name: 'dependency',
example: 'simple-statistics',
description: packageNameDescription,
}),
queryParam({
name: 'registry_uri',
example: 'https://registry.npmjs.com',
}),
],
},
staticPreview: this.render({
dependency: 'eslint-config-standard',
range: '^12.0.0',
}),
keywords,
},
{
title: 'npm dev dependency version (scoped)',
pattern: ':scope?/:packageName/dev/:dependencyScope?/:dependency',
namedParams: {
packageName: 'mocha',
dependencyScope: '@mocha',
dependency: 'contributors',
'/npm/dependency-version/{packageName}/{kind}/{dependency}': {
get: {
summary: 'NPM dev or peer Dependency Version',
parameters: [
pathParam({
name: 'packageName',
example: 'react-boxplot',
description: packageNameDescription,
}),
pathParam({
name: 'kind',
example: 'dev',
schema: { type: 'string', enum: this.getEnum('kind') },
}),
pathParam({
name: 'dependency',
example: 'prop-types',
description: packageNameDescription,
}),
queryParam({
name: 'registry_uri',
example: 'https://registry.npmjs.com',
}),
],
},
staticPreview: this.render({
dependency: '@mocha/contributors',
range: '^1.0.3',
}),
keywords,
},
{
title: 'npm (prod) dependency version',
pattern: ':packageName/:dependency',
namedParams: {
packageName: 'react-boxplot',
dependency: 'simple-statistics',
},
staticPreview: this.render({
dependency: 'simple-statistics',
range: '^6.1.1',
}),
keywords,
},
{
title: 'npm (prod) dependency version (scoped)',
pattern: ':scope?/:packageName/:dependencyScope?/:dependency',
namedParams: {
packageName: 'got',
dependencyScope: '@sindresorhus',
dependency: 'is',
},
staticPreview: this.render({
dependency: '@sindresorhus/is',
range: '^0.15.0',
}),
keywords,
},
]
}

static defaultBadgeData = {
label: 'dependency',
Expand Down
29 changes: 21 additions & 8 deletions services/npm/npm-downloads.service.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import Joi from 'joi'
import { renderDownloadsBadge } from '../downloads.js'
import { nonNegativeInteger } from '../validators.js'
import { BaseJsonService } from '../index.js'
import { BaseJsonService, pathParams } from '../index.js'
import { packageNameDescription } from './npm-base.js'

// https://github.com/npm/registry/blob/master/docs/download-counts.md#output
const pointResponseSchema = Joi.object({
Expand Down Expand Up @@ -50,14 +51,26 @@ export default class NpmDownloads extends BaseJsonService {
pattern: ':interval(dw|dm|dy|dt)/:scope(@.+)?/:packageName',
}

static examples = [
{
title: 'npm',
namedParams: { interval: 'dw', packageName: 'localeval' },
staticPreview: this.render({ interval: 'dw', downloadCount: 30000 }),
keywords: ['node'],
static openApi = {
'/npm/{interval}/{packageName}': {
get: {
summary: 'NPM Downloads',
parameters: pathParams(
{
name: 'interval',
example: 'dw',
description: 'Weekly, Monthly, Yearly, or Total downloads',
schema: { type: 'string', enum: this.getEnum('interval') },
},
{
name: 'packageName',
example: 'localeval',
description: packageNameDescription,
},
),
},
},
]
}

// For testing.
static _intervalMap = intervalMap
Expand Down
36 changes: 19 additions & 17 deletions services/npm/npm-license.service.js
Original file line number Diff line number Diff line change
@@ -1,29 +1,31 @@
import { pathParam, queryParam } from '../index.js'
import { renderLicenseBadge } from '../licenses.js'
import toArray from '../../core/base-service/to-array.js'
import NpmBase from './npm-base.js'
import NpmBase, { packageNameDescription } from './npm-base.js'

export default class NpmLicense extends NpmBase {
static category = 'license'

static route = this.buildRoute('npm/l', { withTag: false })

static examples = [
{
title: 'NPM',
pattern: ':packageName',
namedParams: { packageName: 'express' },
staticPreview: this.render({ licenses: ['MIT'] }),
keywords: ['node'],
static openApi = {
'/npm/l/{packageName}': {
get: {
summary: 'NPM License',
parameters: [
pathParam({
name: 'packageName',
example: 'express',
description: packageNameDescription,
}),
queryParam({
name: 'registry_uri',
example: 'https://registry.npmjs.com',
}),
],
},
},
{
title: 'NPM',
pattern: ':packageName',
namedParams: { packageName: 'express' },
queryParams: { registry_uri: 'https://registry.npmjs.com' },
staticPreview: this.render({ licenses: ['MIT'] }),
keywords: ['node'],
},
]
}

static render({ licenses }) {
return renderLicenseBadge({ licenses })
Expand Down
21 changes: 14 additions & 7 deletions services/npm/npm-type-definitions.service.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { pathParams } from '../index.js'
import NpmBase from './npm-base.js'
import { pathParam, queryParam } from '../index.js'
import NpmBase, { packageNameDescription } from './npm-base.js'

// For this badge to correctly detect type definitions, either the relevant
// dependencies must be declared, or the `types` key must be set in
Expand All @@ -12,11 +12,18 @@ export default class NpmTypeDefinitions extends NpmBase {
static openApi = {
'/npm/types/{packageName}': {
get: {
summary: 'npm type definitions',
parameters: pathParams({
name: 'packageName',
example: 'chalk',
}),
summary: 'NPM Type Definitions',
parameters: [
pathParam({
name: 'packageName',
example: 'chalk',
description: packageNameDescription,
}),
queryParam({
name: 'registry_uri',
example: 'https://registry.npmjs.com',
}),
],
},
},
}
Expand Down
Loading

0 comments on commit 9493d00

Please sign in to comment.