Compare commits
58 Commits
server-202
...
server-202
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bab13b9c32 | ||
|
|
f219e3cd19 | ||
|
|
7aaeda5886 | ||
|
|
7cf8739847 | ||
|
|
7214db0fff | ||
|
|
85aec52df0 | ||
|
|
f2a8b4a8f8 | ||
|
|
8632764467 | ||
|
|
f729743e23 | ||
|
|
53363a224a | ||
|
|
60c942c9fd | ||
|
|
cad326a725 | ||
|
|
a4ff4897e5 | ||
|
|
cabe115e4c | ||
|
|
677e635f67 | ||
|
|
3aeeb02183 | ||
|
|
3b2056ae5f | ||
|
|
18fc921376 | ||
|
|
1000dd190d | ||
|
|
0dd71964d4 | ||
|
|
204eefcb47 | ||
|
|
f78ffc21cf | ||
|
|
f3247b101a | ||
|
|
292f86e249 | ||
|
|
ec2bbf41b1 | ||
|
|
482be064c1 | ||
|
|
4f219f1b92 | ||
|
|
1fcc7e4b98 | ||
|
|
8b82e6d7fc | ||
|
|
d6d5c02ed5 | ||
|
|
560d267844 | ||
|
|
eeacb2f80a | ||
|
|
87157d47b8 | ||
|
|
3ffaa74879 | ||
|
|
8b48b8fd61 | ||
|
|
2a2e96a8fd | ||
|
|
6608cf318d | ||
|
|
dbd82d6dcb | ||
|
|
a56a71c623 | ||
|
|
58f5506bfb | ||
|
|
35f60cfd42 | ||
|
|
607e27f213 | ||
|
|
6ea690c446 | ||
|
|
9a8c05de18 | ||
|
|
a550fc60bf | ||
|
|
0f388f687f | ||
|
|
6bcf2fd264 | ||
|
|
1e76507ebd | ||
|
|
a24c2be1b9 | ||
|
|
a78226f754 | ||
|
|
4c68d830ec | ||
|
|
7b51bc6859 | ||
|
|
c6586f0f50 | ||
|
|
7da986f60f | ||
|
|
75bb074258 | ||
|
|
ac52741b2d | ||
|
|
8821ff85fc | ||
|
|
4382706352 |
14
.github/actions/close-bot/package-lock.json
generated
vendored
14
.github/actions/close-bot/package-lock.json
generated
vendored
@@ -9,14 +9,14 @@
|
||||
"version": "0.0.0",
|
||||
"license": "CC0",
|
||||
"dependencies": {
|
||||
"@actions/core": "^1.6.0",
|
||||
"@actions/core": "^1.7.0",
|
||||
"@actions/github": "^5.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@actions/core": {
|
||||
"version": "1.6.0",
|
||||
"resolved": "https://registry.npmjs.org/@actions/core/-/core-1.6.0.tgz",
|
||||
"integrity": "sha512-NB1UAZomZlCV/LmJqkLhNTqtKfFXJZAUPcfl/zqG7EfsQdeUJtaWO98SGbuQ3pydJ3fHl2CvI/51OKYlCYYcaw==",
|
||||
"version": "1.7.0",
|
||||
"resolved": "https://registry.npmjs.org/@actions/core/-/core-1.7.0.tgz",
|
||||
"integrity": "sha512-7fPSS7yKOhTpgLMbw7lBLc1QJWvJBBAgyTX2PEhagWcKK8t0H8AKCoPMfnrHqIm5cRYH4QFPqD1/ruhuUE7YcQ==",
|
||||
"dependencies": {
|
||||
"@actions/http-client": "^1.0.11"
|
||||
}
|
||||
@@ -226,9 +226,9 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@actions/core": {
|
||||
"version": "1.6.0",
|
||||
"resolved": "https://registry.npmjs.org/@actions/core/-/core-1.6.0.tgz",
|
||||
"integrity": "sha512-NB1UAZomZlCV/LmJqkLhNTqtKfFXJZAUPcfl/zqG7EfsQdeUJtaWO98SGbuQ3pydJ3fHl2CvI/51OKYlCYYcaw==",
|
||||
"version": "1.7.0",
|
||||
"resolved": "https://registry.npmjs.org/@actions/core/-/core-1.7.0.tgz",
|
||||
"integrity": "sha512-7fPSS7yKOhTpgLMbw7lBLc1QJWvJBBAgyTX2PEhagWcKK8t0H8AKCoPMfnrHqIm5cRYH4QFPqD1/ruhuUE7YcQ==",
|
||||
"requires": {
|
||||
"@actions/http-client": "^1.0.11"
|
||||
}
|
||||
|
||||
2
.github/actions/close-bot/package.json
vendored
2
.github/actions/close-bot/package.json
vendored
@@ -10,7 +10,7 @@
|
||||
"author": "chris48s",
|
||||
"license": "CC0",
|
||||
"dependencies": {
|
||||
"@actions/core": "^1.6.0",
|
||||
"@actions/core": "^1.7.0",
|
||||
"@actions/github": "^5.0.1"
|
||||
}
|
||||
}
|
||||
|
||||
14
.github/workflows/enforce-dependency-review.yml
vendored
Normal file
14
.github/workflows/enforce-dependency-review.yml
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
name: 'Dependency Review'
|
||||
on: [pull_request]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
dependency-review:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: 'Checkout Repository'
|
||||
uses: actions/checkout@v3
|
||||
- name: 'Dependency Review'
|
||||
uses: actions/dependency-review-action@v1
|
||||
15
CHANGELOG.md
15
CHANGELOG.md
@@ -4,8 +4,23 @@ Note: this changelog is for the shields.io server. The changelog for the badge-m
|
||||
|
||||
---
|
||||
|
||||
## server-2022-05-03
|
||||
|
||||
- [OSSFScorecard] Create scorecard badge service [#7687](https://github.com/badges/shields/issues/7687)
|
||||
- Stringify [githublanguagecount] message [#7881](https://github.com/badges/shields/issues/7881)
|
||||
- Stringify and trim whitespace from a few services [#7880](https://github.com/badges/shields/issues/7880)
|
||||
- add labels to Dockerfile [#7862](https://github.com/badges/shields/issues/7862)
|
||||
- handle missing 'fly-client-ip' [#7814](https://github.com/badges/shields/issues/7814)
|
||||
- Dependency updates
|
||||
|
||||
## server-2022-04-03
|
||||
|
||||
- Breaking change: This release updates ioredis from v4 to v5.
|
||||
If you are using redis for GitHub token pooling, redis connection strings of the form
|
||||
`redis://junkusername:authpassword@example.com:1234` will need to be updated to
|
||||
`redis://:authpassword@example.com:1234`. See the
|
||||
[ioredis upgrade guide](https://github.com/luin/ioredis/wiki/Upgrading-from-v4-to-v5)
|
||||
for further details.
|
||||
- fix installation issue on npm >= 8.5.5 [#7809](https://github.com/badges/shields/issues/7809)
|
||||
- two fixes for [packagist] schemas [#7782](https://github.com/badges/shields/issues/7782)
|
||||
- allow requireCloudflare setting to work when hosted on fly.io [#7781](https://github.com/badges/shields/issues/7781)
|
||||
|
||||
@@ -23,6 +23,8 @@ FROM node:16-alpine
|
||||
|
||||
ARG version=dev
|
||||
ENV DOCKER_SHIELDS_VERSION=$version
|
||||
LABEL version=$version
|
||||
LABEL fly.version=$version
|
||||
|
||||
# Run the server using production configs.
|
||||
ENV NODE_ENV production
|
||||
|
||||
@@ -6,13 +6,20 @@ public:
|
||||
enabled: true
|
||||
url: https://metrics.shields.io/telegraf
|
||||
instanceIdFrom: env-var
|
||||
instanceIdEnvVarName: HEROKU_DYNO_ID
|
||||
instanceIdEnvVarName: FLY_ALLOC_ID
|
||||
envLabel: shields-production
|
||||
|
||||
ssl:
|
||||
isSecure: true
|
||||
isSecure: false
|
||||
|
||||
cors:
|
||||
allowedOrigin: ['http://shields.io', 'https://shields.io']
|
||||
|
||||
services:
|
||||
gitlab:
|
||||
authorizedOrigins: 'https://gitlab.com'
|
||||
|
||||
rasterUrl: 'https://raster.shields.io'
|
||||
userAgentBase: 'Shields.io'
|
||||
requireCloudflare: true
|
||||
requestTimeoutSeconds: 20
|
||||
|
||||
@@ -1,66 +0,0 @@
|
||||
<!doctype html><meta charset=utf-8>
|
||||
<title> Shields.io Admin Monitoring Interface </title>
|
||||
<style>
|
||||
#monitorPlatform { display: none; }
|
||||
</style>
|
||||
|
||||
<div id=passwordRequest>
|
||||
<p> Please enter your admin secret here:
|
||||
<input type=password id=secretInput>
|
||||
</div>
|
||||
<div id=monitorPlatform>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
(function() {
|
||||
let network;
|
||||
const onLoad = function() {
|
||||
const secretInput = document.getElementById('secretInput');
|
||||
const onSecretChange = function() {
|
||||
const secret = secretInput.value;
|
||||
const authentication = `monitor:${secret}`;
|
||||
const headers = new Headers({
|
||||
Authorization: `Basic ${btoa(authentication)}`
|
||||
})
|
||||
fetch('/sys/network', {headers})
|
||||
.then(res => res.json())
|
||||
.then(networkData => {
|
||||
network = networkData;
|
||||
// Show monitor platform.
|
||||
monitorPlatform.style.display = 'block';
|
||||
passwordRequest.parentNode.removeChild(passwordRequest);
|
||||
|
||||
// Show logs for each server.
|
||||
network.ips.forEach(ip => {
|
||||
const logger = document.createElement('div');
|
||||
const pre = document.createElement('pre');
|
||||
logger.textContent = ip;
|
||||
logger.appendChild(pre);
|
||||
monitorPlatform.appendChild(logger);
|
||||
|
||||
// Set up the websocket.
|
||||
const setUpWebsocket = () => {
|
||||
const websocket = new WebSocket(
|
||||
(window.location.protocol === 'http:' ? 'ws' : 'wss') + '://' +
|
||||
ip + ':' + window.location.port + '/sys/logs');
|
||||
websocket.addEventListener('message', event => {
|
||||
pre.textContent += event.data + '\n';
|
||||
});
|
||||
websocket.addEventListener('close', () => {
|
||||
setTimeout(setUpWebsocket, 100);
|
||||
});
|
||||
websocket.addEventListener('open', () => {
|
||||
websocket.send(JSON.stringify({secret}));
|
||||
});
|
||||
};
|
||||
setUpWebsocket();
|
||||
});
|
||||
})
|
||||
.catch(alert)
|
||||
};
|
||||
secretInput.addEventListener('change', onSecretChange);
|
||||
};
|
||||
|
||||
addEventListener('DOMContentLoaded', onLoad);
|
||||
}());
|
||||
</script>
|
||||
@@ -319,6 +319,8 @@ class Server {
|
||||
// On Fly we can use the Fly-Client-IP header
|
||||
// https://fly.io/docs/reference/runtime-environment/#request-headers
|
||||
req.ip = req.headers['fly-client-ip']
|
||||
? req.headers['fly-client-ip']
|
||||
: req.socket.remoteAddress
|
||||
} else {
|
||||
req.ip = req.socket.remoteAddress
|
||||
}
|
||||
|
||||
1781
package-lock.json
generated
1781
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
60
package.json
60
package.json
@@ -24,7 +24,7 @@
|
||||
"@fontsource/lato": "^4.5.5",
|
||||
"@fontsource/lekton": "^4.5.6",
|
||||
"@renovate/pep440": "^1.0.0",
|
||||
"@sentry/node": "^6.19.3",
|
||||
"@sentry/node": "^6.19.7",
|
||||
"@shields_io/camp": "^18.1.1",
|
||||
"badge-maker": "file:badge-maker",
|
||||
"bytes": "^3.1.2",
|
||||
@@ -38,12 +38,12 @@
|
||||
"emojic": "^1.1.17",
|
||||
"escape-string-regexp": "^4.0.0",
|
||||
"fast-xml-parser": "^4.0.7",
|
||||
"glob": "^7.2.0",
|
||||
"glob": "^8.0.1",
|
||||
"global-agent": "^3.0.0",
|
||||
"got": "^12.0.3",
|
||||
"got": "^12.0.4",
|
||||
"graphql": "^15.6.1",
|
||||
"graphql-tag": "^2.12.6",
|
||||
"ioredis": "5.0.3",
|
||||
"ioredis": "5.0.4",
|
||||
"joi": "17.6.0",
|
||||
"joi-extension-semver": "5.0.0",
|
||||
"js-yaml": "^4.1.0",
|
||||
@@ -51,7 +51,7 @@
|
||||
"lodash.countby": "^4.6.0",
|
||||
"lodash.groupby": "^4.6.0",
|
||||
"lodash.times": "^4.3.2",
|
||||
"moment": "^2.29.1",
|
||||
"moment": "^2.29.3",
|
||||
"node-env-flag": "^0.1.0",
|
||||
"parse-link-header": "^2.0.0",
|
||||
"path-to-regexp": "^6.2.0",
|
||||
@@ -60,8 +60,8 @@
|
||||
"prom-client": "^14.0.1",
|
||||
"qs": "^6.10.3",
|
||||
"query-string": "^7.1.1",
|
||||
"semver": "~7.3.5",
|
||||
"simple-icons": "6.17.0",
|
||||
"semver": "~7.3.7",
|
||||
"simple-icons": "6.19.0",
|
||||
"webextension-store-meta": "^1.0.5",
|
||||
"xmldom": "~0.6.0",
|
||||
"xpath": "~0.0.32"
|
||||
@@ -141,25 +141,25 @@
|
||||
]
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.17.8",
|
||||
"@babel/core": "^7.17.9",
|
||||
"@babel/polyfill": "^7.12.1",
|
||||
"@babel/register": "7.17.7",
|
||||
"@istanbuljs/schema": "^0.1.3",
|
||||
"@mapbox/react-click-to-select": "^2.2.1",
|
||||
"@types/chai": "^4.3.0",
|
||||
"@types/lodash.debounce": "^4.0.6",
|
||||
"@types/lodash.groupby": "^4.6.6",
|
||||
"@types/mocha": "^9.1.0",
|
||||
"@types/chai": "^4.3.1",
|
||||
"@types/lodash.debounce": "^4.0.7",
|
||||
"@types/lodash.groupby": "^4.6.7",
|
||||
"@types/mocha": "^9.1.1",
|
||||
"@types/node": "^16.7.10",
|
||||
"@types/react-helmet": "^6.1.5",
|
||||
"@types/react-modal": "^3.13.1",
|
||||
"@types/react-select": "^4.0.17",
|
||||
"@types/styled-components": "5.1.24",
|
||||
"@typescript-eslint/eslint-plugin": "^5.17.0",
|
||||
"@types/styled-components": "5.1.25",
|
||||
"@typescript-eslint/eslint-plugin": "^5.21.0",
|
||||
"@typescript-eslint/parser": "^5.15.0",
|
||||
"babel-plugin-inline-react-svg": "^2.0.1",
|
||||
"babel-preset-gatsby": "^2.11.1",
|
||||
"c8": "^7.11.0",
|
||||
"babel-preset-gatsby": "^2.13.0",
|
||||
"c8": "^7.11.2",
|
||||
"caller": "^1.1.0",
|
||||
"chai": "^4.3.6",
|
||||
"chai-as-promised": "^7.1.1",
|
||||
@@ -167,9 +167,9 @@
|
||||
"chai-string": "^1.4.0",
|
||||
"child-process-promise": "^2.2.1",
|
||||
"clipboard-copy": "^4.0.1",
|
||||
"concurrently": "^7.0.0",
|
||||
"cypress": "^9.5.3",
|
||||
"danger": "^11.0.2",
|
||||
"concurrently": "^7.1.0",
|
||||
"cypress": "^9.6.0",
|
||||
"danger": "^11.0.5",
|
||||
"danger-plugin-no-test-shortcuts": "^2.0.0",
|
||||
"deepmerge": "^4.2.2",
|
||||
"eslint": "^7.32.0",
|
||||
@@ -179,14 +179,14 @@
|
||||
"eslint-config-standard-react": "^11.0.1",
|
||||
"eslint-plugin-chai-friendly": "^0.7.2",
|
||||
"eslint-plugin-cypress": "^2.12.1",
|
||||
"eslint-plugin-import": "^2.25.4",
|
||||
"eslint-plugin-jsdoc": "^38.1.6",
|
||||
"eslint-plugin-import": "^2.26.0",
|
||||
"eslint-plugin-jsdoc": "^39.2.9",
|
||||
"eslint-plugin-mocha": "^10.0.3",
|
||||
"eslint-plugin-no-extension-in-require": "^0.2.0",
|
||||
"eslint-plugin-node": "^11.1.0",
|
||||
"eslint-plugin-promise": "^5.2.0",
|
||||
"eslint-plugin-react": "^7.29.4",
|
||||
"eslint-plugin-react-hooks": "^4.4.0",
|
||||
"eslint-plugin-react-hooks": "^4.5.0",
|
||||
"eslint-plugin-sort-class-members": "^1.14.1",
|
||||
"fetch-ponyfill": "^7.1.0",
|
||||
"form-data": "^4.0.0",
|
||||
@@ -203,7 +203,7 @@
|
||||
"is-svg": "^4.3.2",
|
||||
"js-yaml-loader": "^1.2.2",
|
||||
"jsdoc": "^3.6.10",
|
||||
"lint-staged": "^12.3.7",
|
||||
"lint-staged": "^12.4.1",
|
||||
"lodash.debounce": "^4.0.8",
|
||||
"lodash.difference": "^4.5.0",
|
||||
"minimist": "^1.2.6",
|
||||
@@ -213,16 +213,16 @@
|
||||
"mocha-yaml-loader": "^1.0.3",
|
||||
"nock": "13.2.4",
|
||||
"node-mocks-http": "^1.11.0",
|
||||
"nodemon": "^2.0.15",
|
||||
"nodemon": "^2.0.16",
|
||||
"npm-run-all": "^4.1.5",
|
||||
"open-cli": "^7.0.1",
|
||||
"portfinder": "^1.0.28",
|
||||
"prettier": "2.6.1",
|
||||
"prettier": "2.6.2",
|
||||
"react": "^17.0.2",
|
||||
"react-dom": "^17.0.2",
|
||||
"react-error-overlay": "^6.0.10",
|
||||
"react-error-overlay": "^6.0.11",
|
||||
"react-helmet": "^6.1.0",
|
||||
"react-modal": "^3.14.4",
|
||||
"react-modal": "^3.15.1",
|
||||
"react-pose": "^4.0.10",
|
||||
"react-select": "^4.3.1",
|
||||
"read-all-stdin-sync": "^1.0.5",
|
||||
@@ -230,14 +230,14 @@
|
||||
"rimraf": "^3.0.2",
|
||||
"sazerac": "^2.0.0",
|
||||
"simple-git-hooks": "^2.7.0",
|
||||
"sinon": "^13.0.1",
|
||||
"sinon": "^13.0.2",
|
||||
"sinon-chai": "^3.7.0",
|
||||
"snap-shot-it": "^7.9.6",
|
||||
"start-server-and-test": "1.14.0",
|
||||
"styled-components": "^5.3.5",
|
||||
"ts-mocha": "^9.0.2",
|
||||
"tsd": "^0.19.1",
|
||||
"typescript": "^4.6.3",
|
||||
"tsd": "^0.20.0",
|
||||
"typescript": "^4.6.4",
|
||||
"url": "^0.11.0"
|
||||
},
|
||||
"engines": {
|
||||
|
||||
@@ -21,8 +21,8 @@ export default class Bitrise extends BaseJsonService {
|
||||
static examples = [
|
||||
{
|
||||
title: 'Bitrise',
|
||||
namedParams: { appId: 'cde737473028420d', branch: 'master' },
|
||||
queryParams: { token: 'GCIdEzacE4GW32jLVrZb7A' },
|
||||
namedParams: { appId: '3ff11fe8457bd304', branch: 'master' },
|
||||
queryParams: { token: 'lESRN9rEFFfDq92JtXs_jw' },
|
||||
staticPreview: this.render({ status: 'success' }),
|
||||
},
|
||||
]
|
||||
|
||||
@@ -3,14 +3,14 @@ import { createServiceTester } from '../tester.js'
|
||||
export const t = await createServiceTester()
|
||||
|
||||
t.create('deploy status')
|
||||
.get('/cde737473028420d.json?token=GCIdEzacE4GW32jLVrZb7A')
|
||||
.get('/3ff11fe8457bd304.json?token=lESRN9rEFFfDq92JtXs_jw')
|
||||
.expectBadge({
|
||||
label: 'bitrise',
|
||||
message: isBuildStatus,
|
||||
})
|
||||
|
||||
t.create('deploy status with branch')
|
||||
.get('/cde737473028420d/master.json?token=GCIdEzacE4GW32jLVrZb7A')
|
||||
.get('/3ff11fe8457bd304/master.json?token=lESRN9rEFFfDq92JtXs_jw')
|
||||
.expectBadge({
|
||||
label: 'bitrise',
|
||||
message: isBuildStatus,
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import Joi from 'joi'
|
||||
import { floorCount as floorCountColor } from '../color-formatters.js'
|
||||
import { metric } from '../text-formatters.js'
|
||||
import { BaseJsonService } from '../index.js'
|
||||
|
||||
const ownerSchema = Joi.array().required()
|
||||
@@ -20,7 +21,7 @@ export default class GemOwner extends BaseJsonService {
|
||||
|
||||
static render({ count }) {
|
||||
return {
|
||||
message: count,
|
||||
message: metric(count),
|
||||
color: floorCountColor(count, 10, 50, 100),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -307,7 +307,9 @@ export default class GithubIssues extends GithubAuthV4Service {
|
||||
|
||||
return {
|
||||
label: `${labelPrefix}${labelText}${labelSuffix}`,
|
||||
message: `${metric(issueCount)} ${messageSuffix}`,
|
||||
message: `${metric(issueCount)}${
|
||||
messageSuffix ? ' ' : ''
|
||||
}${messageSuffix}`,
|
||||
color: issueCount > 0 ? 'yellow' : 'brightgreen',
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import { metric } from '../text-formatters.js'
|
||||
import { BaseGithubLanguage } from './github-languages-base.js'
|
||||
import { documentation } from './github-helpers.js'
|
||||
|
||||
@@ -20,7 +21,7 @@ export default class GithubLanguageCount extends BaseGithubLanguage {
|
||||
|
||||
static render({ count }) {
|
||||
return {
|
||||
message: count,
|
||||
message: metric(count),
|
||||
color: 'blue',
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,7 +75,7 @@ export default class GithubMilestoneDetail extends GithubAuthV3Service {
|
||||
}
|
||||
|
||||
return {
|
||||
label: `${milestone.title} ${label}`,
|
||||
label: `${milestone.title}${label ? ' ' : ''}${label}`,
|
||||
message: metric(milestoneMetric),
|
||||
color,
|
||||
}
|
||||
|
||||
@@ -43,7 +43,7 @@ export default class GithubMilestone extends GithubAuthV3Service {
|
||||
static render({ user, repo, variant, milestones }) {
|
||||
const milestoneLength = milestones.length
|
||||
let color
|
||||
let label = ''
|
||||
let qualifier = ''
|
||||
|
||||
switch (variant) {
|
||||
case 'all':
|
||||
@@ -51,16 +51,16 @@ export default class GithubMilestone extends GithubAuthV3Service {
|
||||
break
|
||||
case 'open':
|
||||
color = 'red'
|
||||
label = 'active'
|
||||
qualifier = 'active'
|
||||
break
|
||||
case 'closed':
|
||||
color = 'green'
|
||||
label = 'completed'
|
||||
qualifier = 'completed'
|
||||
break
|
||||
}
|
||||
|
||||
return {
|
||||
label: `${label} milestones`,
|
||||
label: `${qualifier}${qualifier ? ' ' : ''}milestones`,
|
||||
message: metric(milestoneLength),
|
||||
color,
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import Joi from 'joi'
|
||||
import { nonNegativeInteger } from '../validators.js'
|
||||
import { BaseJsonService } from '../index.js'
|
||||
import { metric } from '../text-formatters.js'
|
||||
|
||||
// https://developer.opencollective.com/#/api/collectives?id=get-info
|
||||
const collectiveDetailsSchema = Joi.object().keys({
|
||||
@@ -30,12 +31,11 @@ export default class OpencollectiveBase extends BaseJsonService {
|
||||
}
|
||||
|
||||
static render(backersCount, label) {
|
||||
const badge = {
|
||||
message: backersCount,
|
||||
return {
|
||||
label,
|
||||
message: metric(backersCount),
|
||||
color: backersCount > 0 ? 'brightgreen' : 'lightgrey',
|
||||
}
|
||||
if (label) badge.label = label
|
||||
return badge
|
||||
}
|
||||
|
||||
async fetchCollectiveInfo(collective) {
|
||||
|
||||
55
services/ossf-scorecard/ossf-scorecard.service.js
Normal file
55
services/ossf-scorecard/ossf-scorecard.service.js
Normal file
@@ -0,0 +1,55 @@
|
||||
import Joi from 'joi'
|
||||
import { BaseJsonService } from '../index.js'
|
||||
import { colorScale } from '../color-formatters.js'
|
||||
|
||||
const schema = Joi.object({
|
||||
score: Joi.number().min(0).required(),
|
||||
}).required()
|
||||
|
||||
const ossfScorecardColorScale = colorScale(
|
||||
[2, 5, 8, 10],
|
||||
['red', 'yellow', 'yellowgreen', 'green', 'brightgreen']
|
||||
)
|
||||
|
||||
export default class OSSFScorecard extends BaseJsonService {
|
||||
static category = 'analysis'
|
||||
|
||||
static route = { base: 'ossf-scorecard', pattern: ':host/:orgName/:repoName' }
|
||||
|
||||
static examples = [
|
||||
{
|
||||
title: 'OSSF-Scorecard Score',
|
||||
namedParams: {
|
||||
host: 'github.com',
|
||||
orgName: 'rohankh532',
|
||||
repoName: 'org-workflow-add',
|
||||
},
|
||||
staticPreview: this.render({ score: '7.5' }),
|
||||
},
|
||||
]
|
||||
|
||||
static defaultBadgeData = { label: 'score' }
|
||||
|
||||
static render({ score }) {
|
||||
return {
|
||||
message: score,
|
||||
color: ossfScorecardColorScale(score),
|
||||
}
|
||||
}
|
||||
|
||||
async fetch({ host, orgName, repoName }) {
|
||||
return this._requestJson({
|
||||
schema,
|
||||
url: `https://api.securityscorecards.dev/projects/${host}/${orgName}/${repoName}`,
|
||||
errorMessages: {
|
||||
404: 'invalid repo path',
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
async handle({ host, orgName, repoName }) {
|
||||
const { score } = await this.fetch({ host, orgName, repoName })
|
||||
|
||||
return this.constructor.render({ score })
|
||||
}
|
||||
}
|
||||
25
services/ossf-scorecard/ossf-scorecard.tester.js
Normal file
25
services/ossf-scorecard/ossf-scorecard.tester.js
Normal file
@@ -0,0 +1,25 @@
|
||||
import Joi from 'joi'
|
||||
import { createServiceTester } from '../tester.js'
|
||||
export const t = await createServiceTester()
|
||||
|
||||
t.create('score valid')
|
||||
.get('/github.com/rohankh532/org-workflow-add.json')
|
||||
.expectBadge({
|
||||
label: 'score',
|
||||
message: Joi.number().min(0),
|
||||
color: Joi.string().allow(
|
||||
'red',
|
||||
'yellow',
|
||||
'yellowgreen',
|
||||
'green',
|
||||
'brightgreen'
|
||||
),
|
||||
})
|
||||
|
||||
t.create('score ivalid')
|
||||
.get('/github.com/invalid-user/invalid-repo.json')
|
||||
.expectBadge({
|
||||
label: 'score',
|
||||
message: 'invalid repo path',
|
||||
color: 'red',
|
||||
})
|
||||
@@ -12,7 +12,7 @@ t.create('package not verified publisher').get('/utf.json').expectBadge({
|
||||
color: 'lightgrey',
|
||||
})
|
||||
|
||||
t.create('package not found').get('/does-not-exist.json').expectBadge({
|
||||
t.create('package not found').get('/doesnotexist.json').expectBadge({
|
||||
label: 'publisher',
|
||||
message: 'not found',
|
||||
})
|
||||
|
||||
@@ -18,7 +18,7 @@ t.create('package pre-release version')
|
||||
message: isVPlusTripleDottedVersion,
|
||||
})
|
||||
|
||||
t.create('package not found').get('/v/does-not-exist.json').expectBadge({
|
||||
t.create('package not found').get('/v/doesnotexist.json').expectBadge({
|
||||
label: 'pub',
|
||||
message: 'not found',
|
||||
})
|
||||
|
||||
@@ -12,9 +12,7 @@ export const t = await createServiceTester()
|
||||
// https://docs.sonarqube.org/7.0/MetricDefinitions.html
|
||||
// https://sonarcloud.io/api/measures/component?componentKey=org.sonarsource.sonarqube:sonarqube&metricKeys=public_documented_api_density
|
||||
t.create('Documented API Density (not found)')
|
||||
.get(
|
||||
'/org.sonarsource.sonarqube%3Asonarqube.json?server=https://sonarcloud.io'
|
||||
)
|
||||
.get('/brave_brave-core.json?server=https://sonarcloud.io')
|
||||
.expectBadge({
|
||||
label: 'public documented api density',
|
||||
message: 'metric not found',
|
||||
|
||||
@@ -10,7 +10,7 @@ export const t = await createServiceTester()
|
||||
|
||||
t.create('Tech Debt')
|
||||
.get(
|
||||
'/tech_debt/org.sonarsource.sonarqube%3Asonarqube.json?server=https://sonarcloud.io'
|
||||
'/tech_debt/brave_brave-core.json?server=https://sonarcloud.io&sonarVersion=9.0'
|
||||
)
|
||||
.expectBadge({
|
||||
label: 'tech debt',
|
||||
@@ -18,9 +18,7 @@ t.create('Tech Debt')
|
||||
})
|
||||
|
||||
t.create('Tech Debt (branch)')
|
||||
.get(
|
||||
'/tech_debt/org.sonarsource.sonarqube%3Asonarqube/master.json?server=https://sonarcloud.io'
|
||||
)
|
||||
.get('/tech_debt/brave_brave-core/master.json?server=https://sonarcloud.io')
|
||||
.expectBadge({
|
||||
label: 'tech debt',
|
||||
message: isPercentage,
|
||||
|
||||
@@ -17,9 +17,7 @@ const isViolationsLongFormMetric = Joi.alternatives(
|
||||
|
||||
t.create('Violations')
|
||||
.timeout(10000)
|
||||
.get(
|
||||
'/violations/org.sonarsource.sonarqube%3Asonarqube.json?server=https://sonarcloud.io'
|
||||
)
|
||||
.get('/violations/brave_brave-core.json?server=https://sonarcloud.io')
|
||||
.expectBadge({
|
||||
label: 'violations',
|
||||
message: isMetric,
|
||||
@@ -27,9 +25,7 @@ t.create('Violations')
|
||||
|
||||
t.create('Violations (branch)')
|
||||
.timeout(10000)
|
||||
.get(
|
||||
'/violations/org.sonarsource.sonarqube%3Asonarqube/master.json?server=https://sonarcloud.io'
|
||||
)
|
||||
.get('/violations/brave_brave-core/master.json?server=https://sonarcloud.io')
|
||||
.expectBadge({
|
||||
label: 'violations',
|
||||
message: isMetric,
|
||||
@@ -67,7 +63,7 @@ t.create('Violations (legacy API supported)')
|
||||
t.create('Violations Long Format')
|
||||
.timeout(10000)
|
||||
.get(
|
||||
'/violations/org.sonarsource.sonarqube%3Asonarqube.json?server=https://sonarcloud.io&format=long'
|
||||
'/violations/brave_brave-core.json?server=https://sonarcloud.io&format=long'
|
||||
)
|
||||
.expectBadge({
|
||||
label: 'violations',
|
||||
@@ -126,9 +122,7 @@ t.create('Violations Long Format (legacy API supported)')
|
||||
|
||||
t.create('Blocker Violations')
|
||||
.timeout(10000)
|
||||
.get(
|
||||
'/blocker_violations/org.sonarsource.sonarqube%3Asonarqube.json?server=https://sonarcloud.io'
|
||||
)
|
||||
.get('/blocker_violations/brave_brave-core.json?server=https://sonarcloud.io')
|
||||
.expectBadge({
|
||||
label: 'blocker violations',
|
||||
message: isMetric,
|
||||
@@ -166,7 +160,7 @@ t.create('Blocker Violations (legacy API supported)')
|
||||
t.create('Critical Violations')
|
||||
.timeout(10000)
|
||||
.get(
|
||||
'/critical_violations/org.sonarsource.sonarqube%3Asonarqube.json?server=https://sonarcloud.io'
|
||||
'/critical_violations/brave_brave-core.json?server=https://sonarcloud.io'
|
||||
)
|
||||
.expectBadge({
|
||||
label: 'critical violations',
|
||||
|
||||
@@ -69,7 +69,7 @@ export default class SwaggerValidatorService extends BaseJsonService {
|
||||
} else if (valMessages.length === 1) {
|
||||
const { message, level } = valMessages[0]
|
||||
if (level === 'error' && message === `Can't read from file ${specUrl}`) {
|
||||
throw new NotFound({ prettyMessage: 'spec not found or unreadable ' })
|
||||
throw new NotFound({ prettyMessage: 'spec not found or unreadable' })
|
||||
}
|
||||
}
|
||||
if (valMessages.every(msg => msg.level === 'warning')) {
|
||||
|
||||
23
services/wordpress/wordpress-version-color.integration.js
Normal file
23
services/wordpress/wordpress-version-color.integration.js
Normal file
@@ -0,0 +1,23 @@
|
||||
import { expect } from 'chai'
|
||||
import { versionColorForWordpressVersion } from './wordpress-version-color.js'
|
||||
|
||||
describe('versionColorForWordpressVersion()', function () {
|
||||
it('generates correct colours for given versions', async function () {
|
||||
this.timeout(5e3)
|
||||
|
||||
expect(await versionColorForWordpressVersion('11.2.0')).to.equal(
|
||||
'brightgreen'
|
||||
)
|
||||
expect(await versionColorForWordpressVersion('11.2')).to.equal(
|
||||
'brightgreen'
|
||||
)
|
||||
expect(await versionColorForWordpressVersion('3.2.0')).to.equal('yellow')
|
||||
expect(await versionColorForWordpressVersion('3.2')).to.equal('yellow')
|
||||
expect(await versionColorForWordpressVersion('4.7-beta.3')).to.equal(
|
||||
'yellow'
|
||||
)
|
||||
expect(await versionColorForWordpressVersion('cheese')).to.equal(
|
||||
'lightgrey'
|
||||
)
|
||||
})
|
||||
})
|
||||
@@ -1,8 +1,5 @@
|
||||
import { expect } from 'chai'
|
||||
import {
|
||||
toSemver,
|
||||
versionColorForWordpressVersion,
|
||||
} from './wordpress-version-color.js'
|
||||
import { toSemver } from './wordpress-version-color.js'
|
||||
|
||||
describe('toSemver() function', function () {
|
||||
it('coerces versions', function () {
|
||||
@@ -13,24 +10,3 @@ describe('toSemver() function', function () {
|
||||
expect(toSemver('foobar')).to.equal('foobar')
|
||||
})
|
||||
})
|
||||
|
||||
describe('versionColorForWordpressVersion()', function () {
|
||||
it('generates correct colours for given versions', async function () {
|
||||
this.timeout(5e3)
|
||||
|
||||
expect(await versionColorForWordpressVersion('11.2.0')).to.equal(
|
||||
'brightgreen'
|
||||
)
|
||||
expect(await versionColorForWordpressVersion('11.2')).to.equal(
|
||||
'brightgreen'
|
||||
)
|
||||
expect(await versionColorForWordpressVersion('3.2.0')).to.equal('yellow')
|
||||
expect(await versionColorForWordpressVersion('3.2')).to.equal('yellow')
|
||||
expect(await versionColorForWordpressVersion('4.7-beta.3')).to.equal(
|
||||
'yellow'
|
||||
)
|
||||
expect(await versionColorForWordpressVersion('cheese')).to.equal(
|
||||
'lightgrey'
|
||||
)
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user