Compare commits
156 Commits
rollback-e
...
increase-t
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
afd23abd1d | ||
|
|
5e6d68123a | ||
|
|
6e4c46143f | ||
|
|
f419b39b09 | ||
|
|
fe5d4514ee | ||
|
|
60e75963a8 | ||
|
|
e965324911 | ||
|
|
781aedc353 | ||
|
|
3cf154053f | ||
|
|
8bf34a2307 | ||
|
|
d251b481f4 | ||
|
|
dc06b445c9 | ||
|
|
667a609b6e | ||
|
|
1f2ba9eba6 | ||
|
|
c07d0f901a | ||
|
|
bcdc02510d | ||
|
|
45331d1d1f | ||
|
|
a2376d1d21 | ||
|
|
7b40bd78d5 | ||
|
|
2960f3a30b | ||
|
|
888d47253c | ||
|
|
0a26450f7a | ||
|
|
486bfa3d9f | ||
|
|
d3f1a55503 | ||
|
|
bc533c694b | ||
|
|
040b52c1bd | ||
|
|
130cfc35e4 | ||
|
|
0c2742a911 | ||
|
|
2cdadcf70e | ||
|
|
5e929568f8 | ||
|
|
a9f8cfedc7 | ||
|
|
eb7e372003 | ||
|
|
ed612abd16 | ||
|
|
354fa26f5c | ||
|
|
e904a4302f | ||
|
|
708dfb5f5f | ||
|
|
22380c5e94 | ||
|
|
e94b9c1047 | ||
|
|
fd629a8d80 | ||
|
|
808c8aac70 | ||
|
|
fe90506247 | ||
|
|
92716012cb | ||
|
|
6988f55c6e | ||
|
|
d30c595c6c | ||
|
|
6e29466f18 | ||
|
|
69c89f0b7a | ||
|
|
ae9179cb99 | ||
|
|
6e48d932cc | ||
|
|
e9a8785d54 | ||
|
|
5b0777918a | ||
|
|
07bc0325ee | ||
|
|
22afe7b648 | ||
|
|
6dff32138b | ||
|
|
b80a0e6214 | ||
|
|
1e0d572bfa | ||
|
|
e74fac82bc | ||
|
|
fdb4e9bcfa | ||
|
|
13690bc638 | ||
|
|
492f07227e | ||
|
|
2558aec7de | ||
|
|
bab7ffc0ee | ||
|
|
34c571c7e2 | ||
|
|
cc62509897 | ||
|
|
d9582dfa3a | ||
|
|
531779fc20 | ||
|
|
b9b0417755 | ||
|
|
5f20604632 | ||
|
|
0e52f1dd81 | ||
|
|
1092cee0c6 | ||
|
|
a019d655c3 | ||
|
|
327dc57e4a | ||
|
|
51ebba7e9e | ||
|
|
b9ffea88f8 | ||
|
|
172b3b85ee | ||
|
|
fe03690aad | ||
|
|
64e806bba5 | ||
|
|
714344d297 | ||
|
|
0e632291da | ||
|
|
377a0362a7 | ||
|
|
3e2c9b20e0 | ||
|
|
4c8a72434b | ||
|
|
3ac24d3aae | ||
|
|
d6df4fbb5d | ||
|
|
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 | ||
|
|
7d7e675565 | ||
|
|
412226b228 | ||
|
|
7fde335187 | ||
|
|
0c24d6d686 | ||
|
|
e55a120615 | ||
|
|
285480b695 | ||
|
|
a3b53bc23c | ||
|
|
d281c69fc1 | ||
|
|
7819f55a9d | ||
|
|
856c918e95 | ||
|
|
3c7a0d72ee | ||
|
|
75eaca5e90 | ||
|
|
36589abfe5 | ||
|
|
1c8ab2a1c8 | ||
|
|
3028144ce2 |
@@ -7,7 +7,6 @@ main_steps: &main_steps
|
||||
- run:
|
||||
name: Install dependencies
|
||||
command: |
|
||||
npm install --dry-run
|
||||
npm ci
|
||||
environment:
|
||||
# https://docs.cypress.io/guides/getting-started/installing-cypress.html#Skipping-installation
|
||||
@@ -50,7 +49,6 @@ integration_steps: &integration_steps
|
||||
- run:
|
||||
name: Install dependencies
|
||||
command: |
|
||||
npm install --dry-run
|
||||
npm ci
|
||||
environment:
|
||||
CYPRESS_INSTALL_BINARY: 0
|
||||
@@ -73,7 +71,6 @@ services_steps: &services_steps
|
||||
- run:
|
||||
name: Install dependencies
|
||||
command: |
|
||||
npm install --dry-run
|
||||
npm ci
|
||||
environment:
|
||||
CYPRESS_INSTALL_BINARY: 0
|
||||
@@ -116,6 +113,7 @@ package_steps: &package_steps
|
||||
MOCHA_FILE: junit/badge-maker/v12/results.xml
|
||||
NODE_VERSION: v12
|
||||
CYPRESS_INSTALL_BINARY: 0
|
||||
NPM_CONFIG_ENGINE_STRICT: 'false'
|
||||
name: Run package tests on Node 12
|
||||
command: scripts/run_package_tests.sh
|
||||
|
||||
@@ -125,6 +123,7 @@ package_steps: &package_steps
|
||||
MOCHA_FILE: junit/badge-maker/v14/results.xml
|
||||
NODE_VERSION: v14
|
||||
CYPRESS_INSTALL_BINARY: 0
|
||||
NPM_CONFIG_ENGINE_STRICT: 'false'
|
||||
name: Run package tests on Node 14
|
||||
command: scripts/run_package_tests.sh
|
||||
|
||||
@@ -143,39 +142,33 @@ package_steps: &package_steps
|
||||
jobs:
|
||||
main:
|
||||
docker:
|
||||
- image: cimg/node:16.14
|
||||
environment:
|
||||
NPM_CONFIG_ENGINE_STRICT: 'true'
|
||||
NPM_CONFIG_STRICT_PEER_DEPS: 'true'
|
||||
- image: cimg/node:16.15
|
||||
|
||||
<<: *main_steps
|
||||
|
||||
main@node-17:
|
||||
docker:
|
||||
- image: cimg/node:17.7
|
||||
- image: cimg/node:17.9
|
||||
|
||||
<<: *main_steps
|
||||
|
||||
integration:
|
||||
docker:
|
||||
- image: cimg/node:16.14
|
||||
environment:
|
||||
NPM_CONFIG_ENGINE_STRICT: 'true'
|
||||
NPM_CONFIG_STRICT_PEER_DEPS: 'true'
|
||||
- image: cimg/node:16.15
|
||||
- image: redis
|
||||
|
||||
<<: *integration_steps
|
||||
|
||||
integration@node-17:
|
||||
docker:
|
||||
- image: cimg/node:17.7
|
||||
- image: cimg/node:17.9
|
||||
- image: redis
|
||||
|
||||
<<: *integration_steps
|
||||
|
||||
danger:
|
||||
docker:
|
||||
- image: cimg/node:16.14
|
||||
- image: cimg/node:16.15
|
||||
steps:
|
||||
- checkout
|
||||
|
||||
@@ -195,17 +188,14 @@ jobs:
|
||||
|
||||
frontend:
|
||||
docker:
|
||||
- image: cimg/node:16.14
|
||||
environment:
|
||||
NPM_CONFIG_ENGINE_STRICT: 'true'
|
||||
NPM_CONFIG_STRICT_PEER_DEPS: 'true'
|
||||
- image: cimg/node:16.15
|
||||
|
||||
steps:
|
||||
- checkout
|
||||
|
||||
- run:
|
||||
name: Install dependencies
|
||||
command: |
|
||||
npm install --dry-run
|
||||
npm ci
|
||||
environment:
|
||||
CYPRESS_INSTALL_BINARY: 0
|
||||
@@ -242,25 +232,20 @@ jobs:
|
||||
|
||||
services:
|
||||
docker:
|
||||
- image: cimg/node:16.14
|
||||
environment:
|
||||
NPM_CONFIG_ENGINE_STRICT: 'true'
|
||||
NPM_CONFIG_STRICT_PEER_DEPS: 'true'
|
||||
- image: cimg/node:16.15
|
||||
|
||||
<<: *services_steps
|
||||
|
||||
services@node-17:
|
||||
docker:
|
||||
- image: cimg/node:17.7
|
||||
- image: cimg/node:17.9
|
||||
|
||||
<<: *services_steps
|
||||
|
||||
e2e:
|
||||
docker:
|
||||
- image: cypress/base:16.13.0
|
||||
environment:
|
||||
NPM_CONFIG_ENGINE_STRICT: 'true'
|
||||
NPM_CONFIG_STRICT_PEER_DEPS: 'true'
|
||||
- image: cypress/base:16.14.0
|
||||
|
||||
steps:
|
||||
- checkout
|
||||
|
||||
@@ -272,7 +257,6 @@ jobs:
|
||||
- run:
|
||||
name: Install dependencies
|
||||
command: |
|
||||
npm install --dry-run
|
||||
npm ci
|
||||
|
||||
- run:
|
||||
|
||||
228
.github/actions/close-bot/package-lock.json
generated
vendored
228
.github/actions/close-bot/package-lock.json
generated
vendored
@@ -9,53 +9,53 @@
|
||||
"version": "0.0.0",
|
||||
"license": "CC0",
|
||||
"dependencies": {
|
||||
"@actions/core": "^1.6.0",
|
||||
"@actions/github": "^5.0.0"
|
||||
"@actions/core": "^1.8.2",
|
||||
"@actions/github": "^5.0.3"
|
||||
}
|
||||
},
|
||||
"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.8.2",
|
||||
"resolved": "https://registry.npmjs.org/@actions/core/-/core-1.8.2.tgz",
|
||||
"integrity": "sha512-FXcBL7nyik8K5ODeCKlxi+vts7torOkoDAKfeh61EAkAy1HAvwn9uVzZBY0f15YcQTcZZ2/iSGBFHEuioZWfDA==",
|
||||
"dependencies": {
|
||||
"@actions/http-client": "^1.0.11"
|
||||
"@actions/http-client": "^2.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@actions/github": {
|
||||
"version": "5.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@actions/github/-/github-5.0.0.tgz",
|
||||
"integrity": "sha512-QvE9eAAfEsS+yOOk0cylLBIO/d6WyWIOvsxxzdrPFaud39G6BOkUwScXZn1iBzQzHyu9SBkkLSWlohDWdsasAQ==",
|
||||
"version": "5.0.3",
|
||||
"resolved": "https://registry.npmjs.org/@actions/github/-/github-5.0.3.tgz",
|
||||
"integrity": "sha512-myjA/pdLQfhUGLtRZC/J4L1RXOG4o6aYdiEq+zr5wVVKljzbFld+xv10k1FX6IkIJtNxbAq44BdwSNpQ015P0A==",
|
||||
"dependencies": {
|
||||
"@actions/http-client": "^1.0.11",
|
||||
"@octokit/core": "^3.4.0",
|
||||
"@octokit/plugin-paginate-rest": "^2.13.3",
|
||||
"@octokit/plugin-rest-endpoint-methods": "^5.1.1"
|
||||
"@actions/http-client": "^2.0.1",
|
||||
"@octokit/core": "^3.6.0",
|
||||
"@octokit/plugin-paginate-rest": "^2.17.0",
|
||||
"@octokit/plugin-rest-endpoint-methods": "^5.13.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@actions/http-client": {
|
||||
"version": "1.0.11",
|
||||
"resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-1.0.11.tgz",
|
||||
"integrity": "sha512-VRYHGQV1rqnROJqdMvGUbY/Kn8vriQe/F9HR2AlYHzmKuM/p3kjNuXhmdBfcVgsvRWTz5C5XW5xvndZrVBuAYg==",
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.0.1.tgz",
|
||||
"integrity": "sha512-PIXiMVtz6VvyaRsGY268qvj57hXQEpsYogYOu2nrQhlf+XCGmZstmuZBbAybUl1nQGnvS1k1eEsQ69ZoD7xlSw==",
|
||||
"dependencies": {
|
||||
"tunnel": "0.0.6"
|
||||
"tunnel": "^0.0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/@octokit/auth-token": {
|
||||
"version": "2.4.5",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.5.tgz",
|
||||
"integrity": "sha512-BpGYsPgJt05M7/L/5FoE1PiAbdxXFZkX/3kDYcsvd1v6UhlnE5e96dTDr0ezX/EFwciQxf3cNV0loipsURU+WA==",
|
||||
"version": "2.5.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz",
|
||||
"integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==",
|
||||
"dependencies": {
|
||||
"@octokit/types": "^6.0.3"
|
||||
}
|
||||
},
|
||||
"node_modules/@octokit/core": {
|
||||
"version": "3.4.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.4.0.tgz",
|
||||
"integrity": "sha512-6/vlKPP8NF17cgYXqucdshWqmMZGXkuvtcrWCgU5NOI0Pl2GjlmZyWgBMrU8zJ3v2MJlM6++CiB45VKYmhiWWg==",
|
||||
"version": "3.6.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz",
|
||||
"integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==",
|
||||
"dependencies": {
|
||||
"@octokit/auth-token": "^2.4.4",
|
||||
"@octokit/graphql": "^4.5.8",
|
||||
"@octokit/request": "^5.4.12",
|
||||
"@octokit/request": "^5.6.3",
|
||||
"@octokit/request-error": "^2.0.5",
|
||||
"@octokit/types": "^6.0.3",
|
||||
"before-after-hook": "^2.2.0",
|
||||
@@ -63,9 +63,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@octokit/endpoint": {
|
||||
"version": "6.0.11",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.11.tgz",
|
||||
"integrity": "sha512-fUIPpx+pZyoLW4GCs3yMnlj2LfoXTWDUVPTC4V3MUEKZm48W+XYpeWSZCv+vYF1ZABUm2CqnDVf1sFtIYrj7KQ==",
|
||||
"version": "6.0.12",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz",
|
||||
"integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==",
|
||||
"dependencies": {
|
||||
"@octokit/types": "^6.0.3",
|
||||
"is-plain-object": "^5.0.0",
|
||||
@@ -73,37 +73,37 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@octokit/graphql": {
|
||||
"version": "4.6.2",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.6.2.tgz",
|
||||
"integrity": "sha512-WmsIR1OzOr/3IqfG9JIczI8gMJUMzzyx5j0XXQ4YihHtKlQc+u35VpVoOXhlKAlaBntvry1WpAzPl/a+s3n89Q==",
|
||||
"version": "4.8.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz",
|
||||
"integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==",
|
||||
"dependencies": {
|
||||
"@octokit/request": "^5.3.0",
|
||||
"@octokit/request": "^5.6.0",
|
||||
"@octokit/types": "^6.0.3",
|
||||
"universal-user-agent": "^6.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@octokit/openapi-types": {
|
||||
"version": "7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-7.0.0.tgz",
|
||||
"integrity": "sha512-gV/8DJhAL/04zjTI95a7FhQwS6jlEE0W/7xeYAzuArD0KVAVWDLP2f3vi98hs3HLTczxXdRK/mF0tRoQPpolEw=="
|
||||
"version": "11.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-11.2.0.tgz",
|
||||
"integrity": "sha512-PBsVO+15KSlGmiI8QAzaqvsNlZlrDlyAJYcrXBCvVUxCp7VnXjkwPoFHgjEJXx3WF9BAwkA6nfCUA7i9sODzKA=="
|
||||
},
|
||||
"node_modules/@octokit/plugin-paginate-rest": {
|
||||
"version": "2.13.3",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.13.3.tgz",
|
||||
"integrity": "sha512-46lptzM9lTeSmIBt/sVP/FLSTPGx6DCzAdSX3PfeJ3mTf4h9sGC26WpaQzMEq/Z44cOcmx8VsOhO+uEgE3cjYg==",
|
||||
"version": "2.17.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.17.0.tgz",
|
||||
"integrity": "sha512-tzMbrbnam2Mt4AhuyCHvpRkS0oZ5MvwwcQPYGtMv4tUa5kkzG58SVB0fcsLulOZQeRnOgdkZWkRUiyBlh0Bkyw==",
|
||||
"dependencies": {
|
||||
"@octokit/types": "^6.11.0"
|
||||
"@octokit/types": "^6.34.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@octokit/core": ">=2"
|
||||
}
|
||||
},
|
||||
"node_modules/@octokit/plugin-rest-endpoint-methods": {
|
||||
"version": "5.1.1",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.1.1.tgz",
|
||||
"integrity": "sha512-u4zy0rVA8darm/AYsIeWkRalhQR99qPL1D/EXHejV2yaECMdHfxXiTXtba8NMBSajOJe8+C9g+EqMKSvysx0dg==",
|
||||
"version": "5.13.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.13.0.tgz",
|
||||
"integrity": "sha512-uJjMTkN1KaOIgNtUPMtIXDOjx6dGYysdIFhgA52x4xSadQCz3b/zJexvITDVpANnfKPW/+E0xkOvLntqMYpviA==",
|
||||
"dependencies": {
|
||||
"@octokit/types": "^6.14.1",
|
||||
"@octokit/types": "^6.34.0",
|
||||
"deprecation": "^2.3.1"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -111,22 +111,22 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@octokit/request": {
|
||||
"version": "5.4.15",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.4.15.tgz",
|
||||
"integrity": "sha512-6UnZfZzLwNhdLRreOtTkT9n57ZwulCve8q3IT/Z477vThu6snfdkBuhxnChpOKNGxcQ71ow561Qoa6uqLdPtag==",
|
||||
"version": "5.6.3",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz",
|
||||
"integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==",
|
||||
"dependencies": {
|
||||
"@octokit/endpoint": "^6.0.1",
|
||||
"@octokit/request-error": "^2.0.0",
|
||||
"@octokit/types": "^6.7.1",
|
||||
"@octokit/request-error": "^2.1.0",
|
||||
"@octokit/types": "^6.16.1",
|
||||
"is-plain-object": "^5.0.0",
|
||||
"node-fetch": "^2.6.1",
|
||||
"node-fetch": "^2.6.7",
|
||||
"universal-user-agent": "^6.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@octokit/request-error": {
|
||||
"version": "2.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.0.5.tgz",
|
||||
"integrity": "sha512-T/2wcCFyM7SkXzNoyVNWjyVlUwBvW3igM3Btr/eKYiPmucXTtkxt2RBsf6gn3LTzaLSLTQtNmvg+dGsOxQrjZg==",
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz",
|
||||
"integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==",
|
||||
"dependencies": {
|
||||
"@octokit/types": "^6.0.3",
|
||||
"deprecation": "^2.0.0",
|
||||
@@ -134,17 +134,17 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@octokit/types": {
|
||||
"version": "6.14.2",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.14.2.tgz",
|
||||
"integrity": "sha512-wiQtW9ZSy4OvgQ09iQOdyXYNN60GqjCL/UdMsepDr1Gr0QzpW6irIKbH3REuAHXAhxkEk9/F2a3Gcs1P6kW5jA==",
|
||||
"version": "6.34.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.34.0.tgz",
|
||||
"integrity": "sha512-s1zLBjWhdEI2zwaoSgyOFoKSl109CUcVBCc7biPJ3aAf6LGLU6szDvi31JPU7bxfla2lqfhjbbg/5DdFNxOwHw==",
|
||||
"dependencies": {
|
||||
"@octokit/openapi-types": "^7.0.0"
|
||||
"@octokit/openapi-types": "^11.2.0"
|
||||
}
|
||||
},
|
||||
"node_modules/before-after-hook": {
|
||||
"version": "2.2.1",
|
||||
"resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.1.tgz",
|
||||
"integrity": "sha512-/6FKxSTWoJdbsLDF8tdIjaRiFXiE6UHsEHE3OPI/cwPURCVi1ukP0gmLn7XWEiFk5TcwQjjY5PWsU+j+tgXgmw=="
|
||||
"version": "2.2.2",
|
||||
"resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.2.tgz",
|
||||
"integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ=="
|
||||
},
|
||||
"node_modules/deprecation": {
|
||||
"version": "2.3.1",
|
||||
@@ -226,48 +226,48 @@
|
||||
},
|
||||
"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.8.2",
|
||||
"resolved": "https://registry.npmjs.org/@actions/core/-/core-1.8.2.tgz",
|
||||
"integrity": "sha512-FXcBL7nyik8K5ODeCKlxi+vts7torOkoDAKfeh61EAkAy1HAvwn9uVzZBY0f15YcQTcZZ2/iSGBFHEuioZWfDA==",
|
||||
"requires": {
|
||||
"@actions/http-client": "^1.0.11"
|
||||
"@actions/http-client": "^2.0.1"
|
||||
}
|
||||
},
|
||||
"@actions/github": {
|
||||
"version": "5.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@actions/github/-/github-5.0.0.tgz",
|
||||
"integrity": "sha512-QvE9eAAfEsS+yOOk0cylLBIO/d6WyWIOvsxxzdrPFaud39G6BOkUwScXZn1iBzQzHyu9SBkkLSWlohDWdsasAQ==",
|
||||
"version": "5.0.3",
|
||||
"resolved": "https://registry.npmjs.org/@actions/github/-/github-5.0.3.tgz",
|
||||
"integrity": "sha512-myjA/pdLQfhUGLtRZC/J4L1RXOG4o6aYdiEq+zr5wVVKljzbFld+xv10k1FX6IkIJtNxbAq44BdwSNpQ015P0A==",
|
||||
"requires": {
|
||||
"@actions/http-client": "^1.0.11",
|
||||
"@octokit/core": "^3.4.0",
|
||||
"@octokit/plugin-paginate-rest": "^2.13.3",
|
||||
"@octokit/plugin-rest-endpoint-methods": "^5.1.1"
|
||||
"@actions/http-client": "^2.0.1",
|
||||
"@octokit/core": "^3.6.0",
|
||||
"@octokit/plugin-paginate-rest": "^2.17.0",
|
||||
"@octokit/plugin-rest-endpoint-methods": "^5.13.0"
|
||||
}
|
||||
},
|
||||
"@actions/http-client": {
|
||||
"version": "1.0.11",
|
||||
"resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-1.0.11.tgz",
|
||||
"integrity": "sha512-VRYHGQV1rqnROJqdMvGUbY/Kn8vriQe/F9HR2AlYHzmKuM/p3kjNuXhmdBfcVgsvRWTz5C5XW5xvndZrVBuAYg==",
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.0.1.tgz",
|
||||
"integrity": "sha512-PIXiMVtz6VvyaRsGY268qvj57hXQEpsYogYOu2nrQhlf+XCGmZstmuZBbAybUl1nQGnvS1k1eEsQ69ZoD7xlSw==",
|
||||
"requires": {
|
||||
"tunnel": "0.0.6"
|
||||
"tunnel": "^0.0.6"
|
||||
}
|
||||
},
|
||||
"@octokit/auth-token": {
|
||||
"version": "2.4.5",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.5.tgz",
|
||||
"integrity": "sha512-BpGYsPgJt05M7/L/5FoE1PiAbdxXFZkX/3kDYcsvd1v6UhlnE5e96dTDr0ezX/EFwciQxf3cNV0loipsURU+WA==",
|
||||
"version": "2.5.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz",
|
||||
"integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==",
|
||||
"requires": {
|
||||
"@octokit/types": "^6.0.3"
|
||||
}
|
||||
},
|
||||
"@octokit/core": {
|
||||
"version": "3.4.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.4.0.tgz",
|
||||
"integrity": "sha512-6/vlKPP8NF17cgYXqucdshWqmMZGXkuvtcrWCgU5NOI0Pl2GjlmZyWgBMrU8zJ3v2MJlM6++CiB45VKYmhiWWg==",
|
||||
"version": "3.6.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz",
|
||||
"integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==",
|
||||
"requires": {
|
||||
"@octokit/auth-token": "^2.4.4",
|
||||
"@octokit/graphql": "^4.5.8",
|
||||
"@octokit/request": "^5.4.12",
|
||||
"@octokit/request": "^5.6.3",
|
||||
"@octokit/request-error": "^2.0.5",
|
||||
"@octokit/types": "^6.0.3",
|
||||
"before-after-hook": "^2.2.0",
|
||||
@@ -275,9 +275,9 @@
|
||||
}
|
||||
},
|
||||
"@octokit/endpoint": {
|
||||
"version": "6.0.11",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.11.tgz",
|
||||
"integrity": "sha512-fUIPpx+pZyoLW4GCs3yMnlj2LfoXTWDUVPTC4V3MUEKZm48W+XYpeWSZCv+vYF1ZABUm2CqnDVf1sFtIYrj7KQ==",
|
||||
"version": "6.0.12",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz",
|
||||
"integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==",
|
||||
"requires": {
|
||||
"@octokit/types": "^6.0.3",
|
||||
"is-plain-object": "^5.0.0",
|
||||
@@ -285,54 +285,54 @@
|
||||
}
|
||||
},
|
||||
"@octokit/graphql": {
|
||||
"version": "4.6.2",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.6.2.tgz",
|
||||
"integrity": "sha512-WmsIR1OzOr/3IqfG9JIczI8gMJUMzzyx5j0XXQ4YihHtKlQc+u35VpVoOXhlKAlaBntvry1WpAzPl/a+s3n89Q==",
|
||||
"version": "4.8.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz",
|
||||
"integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==",
|
||||
"requires": {
|
||||
"@octokit/request": "^5.3.0",
|
||||
"@octokit/request": "^5.6.0",
|
||||
"@octokit/types": "^6.0.3",
|
||||
"universal-user-agent": "^6.0.0"
|
||||
}
|
||||
},
|
||||
"@octokit/openapi-types": {
|
||||
"version": "7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-7.0.0.tgz",
|
||||
"integrity": "sha512-gV/8DJhAL/04zjTI95a7FhQwS6jlEE0W/7xeYAzuArD0KVAVWDLP2f3vi98hs3HLTczxXdRK/mF0tRoQPpolEw=="
|
||||
"version": "11.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-11.2.0.tgz",
|
||||
"integrity": "sha512-PBsVO+15KSlGmiI8QAzaqvsNlZlrDlyAJYcrXBCvVUxCp7VnXjkwPoFHgjEJXx3WF9BAwkA6nfCUA7i9sODzKA=="
|
||||
},
|
||||
"@octokit/plugin-paginate-rest": {
|
||||
"version": "2.13.3",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.13.3.tgz",
|
||||
"integrity": "sha512-46lptzM9lTeSmIBt/sVP/FLSTPGx6DCzAdSX3PfeJ3mTf4h9sGC26WpaQzMEq/Z44cOcmx8VsOhO+uEgE3cjYg==",
|
||||
"version": "2.17.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.17.0.tgz",
|
||||
"integrity": "sha512-tzMbrbnam2Mt4AhuyCHvpRkS0oZ5MvwwcQPYGtMv4tUa5kkzG58SVB0fcsLulOZQeRnOgdkZWkRUiyBlh0Bkyw==",
|
||||
"requires": {
|
||||
"@octokit/types": "^6.11.0"
|
||||
"@octokit/types": "^6.34.0"
|
||||
}
|
||||
},
|
||||
"@octokit/plugin-rest-endpoint-methods": {
|
||||
"version": "5.1.1",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.1.1.tgz",
|
||||
"integrity": "sha512-u4zy0rVA8darm/AYsIeWkRalhQR99qPL1D/EXHejV2yaECMdHfxXiTXtba8NMBSajOJe8+C9g+EqMKSvysx0dg==",
|
||||
"version": "5.13.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.13.0.tgz",
|
||||
"integrity": "sha512-uJjMTkN1KaOIgNtUPMtIXDOjx6dGYysdIFhgA52x4xSadQCz3b/zJexvITDVpANnfKPW/+E0xkOvLntqMYpviA==",
|
||||
"requires": {
|
||||
"@octokit/types": "^6.14.1",
|
||||
"@octokit/types": "^6.34.0",
|
||||
"deprecation": "^2.3.1"
|
||||
}
|
||||
},
|
||||
"@octokit/request": {
|
||||
"version": "5.4.15",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.4.15.tgz",
|
||||
"integrity": "sha512-6UnZfZzLwNhdLRreOtTkT9n57ZwulCve8q3IT/Z477vThu6snfdkBuhxnChpOKNGxcQ71ow561Qoa6uqLdPtag==",
|
||||
"version": "5.6.3",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz",
|
||||
"integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==",
|
||||
"requires": {
|
||||
"@octokit/endpoint": "^6.0.1",
|
||||
"@octokit/request-error": "^2.0.0",
|
||||
"@octokit/types": "^6.7.1",
|
||||
"@octokit/request-error": "^2.1.0",
|
||||
"@octokit/types": "^6.16.1",
|
||||
"is-plain-object": "^5.0.0",
|
||||
"node-fetch": "^2.6.1",
|
||||
"node-fetch": "^2.6.7",
|
||||
"universal-user-agent": "^6.0.0"
|
||||
}
|
||||
},
|
||||
"@octokit/request-error": {
|
||||
"version": "2.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.0.5.tgz",
|
||||
"integrity": "sha512-T/2wcCFyM7SkXzNoyVNWjyVlUwBvW3igM3Btr/eKYiPmucXTtkxt2RBsf6gn3LTzaLSLTQtNmvg+dGsOxQrjZg==",
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz",
|
||||
"integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==",
|
||||
"requires": {
|
||||
"@octokit/types": "^6.0.3",
|
||||
"deprecation": "^2.0.0",
|
||||
@@ -340,17 +340,17 @@
|
||||
}
|
||||
},
|
||||
"@octokit/types": {
|
||||
"version": "6.14.2",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.14.2.tgz",
|
||||
"integrity": "sha512-wiQtW9ZSy4OvgQ09iQOdyXYNN60GqjCL/UdMsepDr1Gr0QzpW6irIKbH3REuAHXAhxkEk9/F2a3Gcs1P6kW5jA==",
|
||||
"version": "6.34.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.34.0.tgz",
|
||||
"integrity": "sha512-s1zLBjWhdEI2zwaoSgyOFoKSl109CUcVBCc7biPJ3aAf6LGLU6szDvi31JPU7bxfla2lqfhjbbg/5DdFNxOwHw==",
|
||||
"requires": {
|
||||
"@octokit/openapi-types": "^7.0.0"
|
||||
"@octokit/openapi-types": "^11.2.0"
|
||||
}
|
||||
},
|
||||
"before-after-hook": {
|
||||
"version": "2.2.1",
|
||||
"resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.1.tgz",
|
||||
"integrity": "sha512-/6FKxSTWoJdbsLDF8tdIjaRiFXiE6UHsEHE3OPI/cwPURCVi1ukP0gmLn7XWEiFk5TcwQjjY5PWsU+j+tgXgmw=="
|
||||
"version": "2.2.2",
|
||||
"resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.2.tgz",
|
||||
"integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ=="
|
||||
},
|
||||
"deprecation": {
|
||||
"version": "2.3.1",
|
||||
|
||||
4
.github/actions/close-bot/package.json
vendored
4
.github/actions/close-bot/package.json
vendored
@@ -10,7 +10,7 @@
|
||||
"author": "chris48s",
|
||||
"license": "CC0",
|
||||
"dependencies": {
|
||||
"@actions/core": "^1.6.0",
|
||||
"@actions/github": "^5.0.0"
|
||||
"@actions/core": "^1.8.2",
|
||||
"@actions/github": "^5.0.3"
|
||||
}
|
||||
}
|
||||
|
||||
5
.github/dependabot.yml
vendored
5
.github/dependabot.yml
vendored
@@ -36,3 +36,8 @@ updates:
|
||||
day: friday
|
||||
time: '12:00'
|
||||
open-pull-requests-limit: 99
|
||||
- package-ecosystem: 'github-actions'
|
||||
directory: '/'
|
||||
schedule:
|
||||
interval: weekly
|
||||
open-pull-requests-limit: 99
|
||||
|
||||
2
.github/workflows/auto-close.yml
vendored
2
.github/workflows/auto-close.yml
vendored
@@ -10,7 +10,7 @@ jobs:
|
||||
if: github.actor == 'dependabot[bot]'
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Install action dependencies
|
||||
run: cd .github/actions/close-bot && npm ci
|
||||
|
||||
6
.github/workflows/build-docker-image.yml
vendored
6
.github/workflows/build-docker-image.yml
vendored
@@ -7,16 +7,16 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v1
|
||||
uses: docker/setup-buildx-action@v2
|
||||
|
||||
- name: Set Git Short SHA
|
||||
run: echo "SHORT_SHA=${GITHUB_SHA::7}" >> $GITHUB_ENV
|
||||
|
||||
- name: Build
|
||||
uses: docker/build-push-action@v2
|
||||
uses: docker/build-push-action@v3
|
||||
with:
|
||||
context: .
|
||||
push: false
|
||||
|
||||
11
.github/workflows/create-release.yml
vendored
11
.github/workflows/create-release.yml
vendored
@@ -4,6 +4,9 @@ on:
|
||||
pull_request:
|
||||
types: [closed]
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
jobs:
|
||||
create-release:
|
||||
if: |
|
||||
@@ -20,7 +23,7 @@ jobs:
|
||||
run: echo "::set-output name=date::$(date --rfc-3339=date)"
|
||||
|
||||
- name: Checkout branch "master"
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
ref: 'master'
|
||||
|
||||
@@ -31,16 +34,16 @@ jobs:
|
||||
tag: server-${{ steps.date.outputs.date }}
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v1
|
||||
uses: docker/setup-buildx-action@v2
|
||||
|
||||
- name: Login to DockerHub
|
||||
uses: docker/login-action@v1
|
||||
uses: docker/login-action@v2
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
|
||||
- name: Build and push snapshot release to DockerHub
|
||||
uses: docker/build-push-action@v2
|
||||
uses: docker/build-push-action@v3
|
||||
with:
|
||||
context: .
|
||||
push: true
|
||||
|
||||
15
.github/workflows/deploy-docs.yml
vendored
15
.github/workflows/deploy-docs.yml
vendored
@@ -3,12 +3,16 @@ on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
jobs:
|
||||
build-and-deploy:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2.3.1
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
@@ -18,9 +22,8 @@ jobs:
|
||||
npm run build-docs
|
||||
|
||||
- name: Deploy
|
||||
uses: JamesIves/github-pages-deploy-action@3.7.1
|
||||
uses: JamesIves/github-pages-deploy-action@v4
|
||||
with:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
BRANCH: gh-pages
|
||||
FOLDER: api-docs
|
||||
CLEAN: true
|
||||
branch: gh-pages
|
||||
folder: api-docs
|
||||
clean: true
|
||||
|
||||
6
.github/workflows/draft-release.yml
vendored
6
.github/workflows/draft-release.yml
vendored
@@ -5,12 +5,16 @@ on:
|
||||
# At 01:00 on the first day of every month
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
pull-requests: write
|
||||
contents: write
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Draft Release
|
||||
uses: ./.github/actions/draft-release
|
||||
|
||||
11
.github/workflows/enforce-dependency-review.yml
vendored
Normal file
11
.github/workflows/enforce-dependency-review.yml
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
name: 'Dependency Review'
|
||||
on: [pull_request]
|
||||
|
||||
jobs:
|
||||
dependency-review:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: 'Checkout Repository'
|
||||
uses: actions/checkout@v3
|
||||
- name: 'Dependency Review'
|
||||
uses: actions/dependency-review-action@v1
|
||||
8
.github/workflows/publish-docker-next.yml
vendored
8
.github/workflows/publish-docker-next.yml
vendored
@@ -9,13 +9,13 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v1
|
||||
uses: docker/setup-buildx-action@v2
|
||||
|
||||
- name: Login to DockerHub
|
||||
uses: docker/login-action@v1
|
||||
uses: docker/login-action@v2
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
@@ -24,7 +24,7 @@ jobs:
|
||||
run: echo "SHORT_SHA=${GITHUB_SHA::7}" >> $GITHUB_ENV
|
||||
|
||||
- name: Build and push
|
||||
uses: docker/build-push-action@v2
|
||||
uses: docker/build-push-action@v3
|
||||
with:
|
||||
context: .
|
||||
push: true
|
||||
|
||||
53
CHANGELOG.md
53
CHANGELOG.md
@@ -4,6 +4,59 @@ Note: this changelog is for the shields.io server. The changelog for the badge-m
|
||||
|
||||
---
|
||||
|
||||
## server-2022-06-01
|
||||
|
||||
- Update GitLab logo (2022) [#7984](https://github.com/badges/shields/issues/7984)
|
||||
- [GitHub] Added milestone property to GitHub issue details service [#7864](https://github.com/badges/shields/issues/7864)
|
||||
- [Spack] Package Manager: Update Endpoint [#7957](https://github.com/badges/shields/issues/7957)
|
||||
- Update Chocolatey API endpoint URL [#7952](https://github.com/badges/shields/issues/7952)
|
||||
- [Flathub]Add downloads badge [#7724](https://github.com/badges/shields/issues/7724)
|
||||
- replace the outdated Telegram logo with the newest [#7831](https://github.com/badges/shields/issues/7831)
|
||||
- add [PUB] points badge [#7918](https://github.com/badges/shields/issues/7918)
|
||||
- add [PUB] popularity badge [#7920](https://github.com/badges/shields/issues/7920)
|
||||
- add [PUB] likes badge [#7916](https://github.com/badges/shields/issues/7916)
|
||||
- Dependency updates
|
||||
|
||||
## 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)
|
||||
- fix [pypi] badges when package has null license [#7761](https://github.com/badges/shields/issues/7761)
|
||||
- Add a [pub] publisher badge [#7715](https://github.com/badges/shields/issues/7715)
|
||||
- Switch Steam file size badge to informational color [#7722](https://github.com/badges/shields/issues/7722)
|
||||
- Make W3C and Youtube documentation links clickable [#7721](https://github.com/badges/shields/issues/7721)
|
||||
- Improve Wercker examples [#7720](https://github.com/badges/shields/issues/7720)
|
||||
- Improve Cirrus CI examples [#7719](https://github.com/badges/shields/issues/7719)
|
||||
- Support [CodeClimate] responses with multiple data items [#7716](https://github.com/badges/shields/issues/7716)
|
||||
- Delete [TeamCityCoverage] and [BowerVersion] redirectors [#7718](https://github.com/badges/shields/issues/7718)
|
||||
- Deprecate [Shippable] service [#7717](https://github.com/badges/shields/issues/7717)
|
||||
- fix: restore version comparison updates from #4173 [#4254](https://github.com/badges/shields/issues/4254)
|
||||
- [piwheels], filter out versions with no files [#7696](https://github.com/badges/shields/issues/7696)
|
||||
- set a longer cacheLength on [librariesio] badges [#7692](https://github.com/badges/shields/issues/7692)
|
||||
- improve python version formatting [#7682](https://github.com/badges/shields/issues/7682)
|
||||
- Clarify GitHub All Contributors badge [#7690](https://github.com/badges/shields/issues/7690)
|
||||
- Support [HexPM] packages with no stable release [#7685](https://github.com/badges/shields/issues/7685)
|
||||
- Add Test at Scale Badge [#7612](https://github.com/badges/shields/issues/7612)
|
||||
- [packagist] api v2 support [#7681](https://github.com/badges/shields/issues/7681)
|
||||
- Add [piwheels] version badge [#7656](https://github.com/badges/shields/issues/7656)
|
||||
- Dependency updates
|
||||
|
||||
## server-2022-03-01
|
||||
|
||||
- Add [Conan] version service (#7460)
|
||||
|
||||
@@ -9,7 +9,7 @@ COPY package.json package-lock.json /usr/src/app/
|
||||
COPY badge-maker /usr/src/app/badge-maker/
|
||||
|
||||
RUN apk add python3 make g++
|
||||
RUN npm install -g "npm@>=7"
|
||||
RUN npm install -g "npm@>=8"
|
||||
# We need dev deps to build the front end. We don't need Cypress, though.
|
||||
RUN NODE_ENV=development CYPRESS_INSTALL_BINARY=0 npm ci
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
13
cypress.config.js
Normal file
13
cypress.config.js
Normal file
@@ -0,0 +1,13 @@
|
||||
import { defineConfig } from 'cypress'
|
||||
|
||||
export default defineConfig({
|
||||
fixturesFolder: false,
|
||||
env: {
|
||||
backend_url: 'http://localhost:8080',
|
||||
},
|
||||
e2e: {
|
||||
setupNodeEvents(on, config) {},
|
||||
baseUrl: 'http://localhost:3000',
|
||||
supportFile: false,
|
||||
},
|
||||
})
|
||||
@@ -1,9 +0,0 @@
|
||||
{
|
||||
"baseUrl": "http://localhost:3000",
|
||||
"fixturesFolder": false,
|
||||
"pluginsFile": false,
|
||||
"supportFile": false,
|
||||
"env": {
|
||||
"backend_url": "http://localhost:8080"
|
||||
}
|
||||
}
|
||||
@@ -25,7 +25,7 @@ and learn about the [GitHub workflow](http://try.github.io/).
|
||||
|
||||
#### Node, NPM
|
||||
|
||||
Node >=16 and NPM >=7 is required. If you don't already have them,
|
||||
Node >=16 and NPM >=8 is required. If you don't already have them,
|
||||
install node and npm: https://nodejs.org/en/download/
|
||||
|
||||
### Setup a dev install
|
||||
|
||||
@@ -40,7 +40,7 @@ If you are submitting a pull request for a custom logo, please:
|
||||
- Install SVGO
|
||||
- With npm: `npm install -g svgo`
|
||||
- With Homebrew: `brew install svgo`
|
||||
- Run the following command `svgo --precision=3 icon.svg icon.min.svg`
|
||||
- Run the following command `svgo --precision=3 icon.svg -o icon.min.svg`
|
||||
- Check if there is a loss of quality in the output, if so increase the precision.
|
||||
- The [SVGOMG Online Tool][svgomg]
|
||||
- Click "Open SVG" and select an SVG file.
|
||||
|
||||
@@ -16,9 +16,8 @@ Production hosting is managed by the Shields ops team:
|
||||
|
||||
| Component | Subcomponent | People with access |
|
||||
| ----------------------------- | ------------------------------- | --------------------------------------------------------------- |
|
||||
| shields-production-us | Account owner | @calebcartwright, @paulmelnikow |
|
||||
| shields-production-us | Full access | @calebcartwright, @chris48s, @paulmelnikow, @pyvesb |
|
||||
| shields-production-us | Access management | @calebcartwright, @chris48s, @paulmelnikow, @pyvesb |
|
||||
| shields-io-production | Full access | @calebcartwright, @chris48s, @paulmelnikow |
|
||||
| shields-io-production | Access management | @calebcartwright, @chris48s, @paulmelnikow |
|
||||
| Compose.io Redis | Account owner | @paulmelnikow |
|
||||
| Compose.io Redis | Account access | @paulmelnikow |
|
||||
| Compose.io Redis | Database connection credentials | @calebcartwright, @chris48s, @paulmelnikow, @pyvesb |
|
||||
@@ -95,13 +94,10 @@ The raster server `raster.shields.io` (a.k.a. the rasterizing proxy) is
|
||||
hosted on Heroku. It's managed in the
|
||||
[squint](https://github.com/badges/squint/) repo.
|
||||
|
||||
### Heroku Deployment
|
||||
### Fly.io Deployment
|
||||
|
||||
Both the badge server and frontend are served from Heroku.
|
||||
|
||||
After merging a commit to master, heroku should create a staging deploy. Check this has deployed correctly in the `shields-staging` pipeline and review https://shields-staging.herokuapp.com/
|
||||
|
||||
If we're happy with it, "promote to production". This will deploy what's on staging to the `shields-production-eu` and `shields-production-us` pieplines.
|
||||
Both the badge server and frontend are served from Fly.io. Deployments are
|
||||
triggered using GitHub actions in a private repo.
|
||||
|
||||
## DNS
|
||||
|
||||
@@ -109,19 +105,15 @@ DNS is registered with [DNSimple][].
|
||||
|
||||
[dnsimple]: https://dnsimple.com/
|
||||
|
||||
## Logs
|
||||
|
||||
Logs can be retrieved [from heroku](https://devcenter.heroku.com/articles/logging#log-retrieval).
|
||||
|
||||
## Error reporting
|
||||
|
||||
[Error reporting][sentry] is one of the most useful tools we have for monitoring
|
||||
the server. It's generously donated by [Sentry][sentry home]. We bundle
|
||||
[`raven`][raven] into the application, and the Sentry DSN is configured via
|
||||
`local-shields-io-production.yml` (see [documentation][sentry configuration]).
|
||||
[`@sentry/node`][sentry-node] into the application, and the Sentry DSN is configured
|
||||
via `local-shields-io-production.yml` (see [documentation][sentry configuration]).
|
||||
|
||||
[sentry]: https://sentry.io/shields/
|
||||
[raven]: https://www.npmjs.com/package/raven
|
||||
[sentry-node]: https://www.npmjs.com/package/@sentry/node
|
||||
[sentry home]: https://sentry.io/shields/
|
||||
[sentry configuration]: https://github.com/badges/shields/blob/master/doc/self-hosting.md#sentry
|
||||
|
||||
|
||||
@@ -119,7 +119,7 @@ machine.
|
||||
|
||||
If you want to host PNG badges, you can also self-host a [raster server][]
|
||||
which points to your badge server. It's a docker container. We host it on
|
||||
Heroku but should be possible to host on a wide variety of platforms.
|
||||
Fly.io but should be possible to host on a wide variety of platforms.
|
||||
|
||||
- In your raster instance, set `BASE_URL` to your Shields instance, e.g.
|
||||
`https://shields.example.co`.
|
||||
|
||||
@@ -1 +1 @@
|
||||
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M23.956 13.587l-1.344-4.133a4549.814 4549.814 0 0 0-2.663-8.189.456.456 0 0 0-.87 0l-2.658 8.189H7.585L4.92 1.265a.456.456 0 0 0-.87 0A4549.814 4549.814 0 0 0 .044 13.587a.908.908 0 0 0 .336 1.02L12 23.054l11.62-8.447a.908.908 0 0 0 .336-1.02" fill="#fc6d26"/><path d="M12 23.054l4.421-13.6H7.58z" fill="#e24329"/><path d="M7.579 9.454H1.388L12 23.054z" fill="#fc6d26"/><path d="M1.388 9.454L.044 13.587a.908.908 0 0 0 .336 1.02L12 23.054z" fill="#fca326"/><path d="M7.579 9.454L4.92 1.265a.456.456 0 0 0-.87 0L1.388 9.454z" fill="#e24329"/><path d="M16.421 9.454h6.191L12 23.054z" fill="#fc6d26"/><path d="M22.612 9.454l1.344 4.133a.908.908 0 0 1-.336 1.02L12 23.054z" fill="#fca326"/><path d="M16.421 9.454l2.658-8.189a.456.456 0 0 1 .87 0l2.663 8.189z" fill="#e24329"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="93 93 194 194"><defs><style>.b{fill:#fc6d26}</style></defs><path style="fill:#e24329" d="m282.83 170.73-.27-.69-26.14-68.22a6.81 6.81 0 0 0-2.69-3.24 7 7 0 0 0-8 .43 7 7 0 0 0-2.32 3.52l-17.65 54h-71.47l-17.65-54a6.86 6.86 0 0 0-2.32-3.53 7 7 0 0 0-8-.43 6.87 6.87 0 0 0-2.69 3.24L97.44 170l-.26.69a48.54 48.54 0 0 0 16.1 56.1l.09.07.24.17 39.82 29.82 19.7 14.91 12 9.06a8.07 8.07 0 0 0 9.76 0l12-9.06 19.7-14.91 40.06-30 .1-.08a48.56 48.56 0 0 0 16.08-56.04Z"/><path class="b" d="m282.83 170.73-.27-.69a88.3 88.3 0 0 0-35.15 15.8L190 229.25c19.55 14.79 36.57 27.64 36.57 27.64l40.06-30 .1-.08a48.56 48.56 0 0 0 16.1-56.08Z"/><path style="fill:#fca326" d="m153.43 256.89 19.7 14.91 12 9.06a8.07 8.07 0 0 0 9.76 0l12-9.06 19.7-14.91S209.55 244 190 229.25c-19.55 14.75-36.57 27.64-36.57 27.64Z"/><path class="b" d="M132.58 185.84A88.19 88.19 0 0 0 97.44 170l-.26.69a48.54 48.54 0 0 0 16.1 56.1l.09.07.24.17 39.82 29.82L190 229.21Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 847 B After Width: | Height: | Size: 986 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><circle cx="12" cy="12" r="12" fill="#2ca5e0"/><path d="M9.8 17.5c-.389 0-.323-.147-.457-.517L8.2 13.221 17 8" fill="#a9c9dd"/><path d="M9.8 17.5c.3 0 .433-.137.6-.3l1.6-1.556-1.996-1.203" fill="#c8daea"/><path d="M10.004 14.441l4.836 3.573c.552.304.95.147 1.088-.512l1.968-9.277c.202-.808-.308-1.174-.836-.935L5.501 11.748c-.789.316-.784.756-.144.952l2.967.926 6.867-4.332c.324-.197.622-.091.377.125" fill="#fff"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 24c6.627 0 12-5.373 12-12S18.627 0 12 0 0 5.373 0 12s5.373 12 12 12Z" fill="url(#a)"/><path fill-rule="evenodd" clip-rule="evenodd" d="M5.425 11.871a796.414 796.414 0 0 1 6.994-3.018c3.328-1.388 4.027-1.628 4.477-1.638.1 0 .32.02.47.14.12.1.15.23.17.33.02.1.04.31.02.47-.18 1.898-.96 6.504-1.36 8.622-.17.9-.5 1.199-.819 1.229-.7.06-1.229-.46-1.898-.9-1.06-.689-1.649-1.119-2.678-1.798-1.19-.78-.42-1.209.26-1.908.18-.18 3.247-2.978 3.307-3.228.01-.03.01-.15-.06-.21-.07-.06-.17-.04-.25-.02-.11.02-1.788 1.14-5.056 3.348-.48.33-.909.49-1.299.48-.43-.01-1.248-.24-1.868-.44-.75-.24-1.349-.37-1.299-.79.03-.22.33-.44.89-.669Z" fill="#fff"/><defs><linearGradient id="a" x1="11.99" y1="0" x2="11.99" y2="23.81" gradientUnits="userSpaceOnUse"><stop stop-color="#2AABEE"/><stop offset="1" stop-color="#229ED9"/></linearGradient></defs></svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 481 B After Width: | Height: | Size: 909 B |
3913
package-lock.json
generated
3913
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
96
package.json
96
package.json
@@ -21,14 +21,14 @@
|
||||
"url": "https://github.com/badges/shields"
|
||||
},
|
||||
"dependencies": {
|
||||
"@fontsource/lato": "^4.5.5",
|
||||
"@fontsource/lekton": "^4.5.6",
|
||||
"@fontsource/lato": "^4.5.8",
|
||||
"@fontsource/lekton": "^4.5.9",
|
||||
"@renovate/pep440": "^1.0.0",
|
||||
"@sentry/node": "^6.19.2",
|
||||
"@sentry/node": "^7.1.1",
|
||||
"@shields_io/camp": "^18.1.1",
|
||||
"badge-maker": "file:badge-maker",
|
||||
"bytes": "^3.1.2",
|
||||
"camelcase": "^6.3.0",
|
||||
"camelcase": "^7.0.0",
|
||||
"chalk": "^5.0.1",
|
||||
"check-node-version": "^4.2.1",
|
||||
"cloudflare-middleware": "^1.0.4",
|
||||
@@ -37,13 +37,13 @@
|
||||
"decamelize": "^3.2.0",
|
||||
"emojic": "^1.1.17",
|
||||
"escape-string-regexp": "^4.0.0",
|
||||
"fast-xml-parser": "^4.0.7",
|
||||
"glob": "^7.2.0",
|
||||
"fast-xml-parser": "^4.0.8",
|
||||
"glob": "^8.0.3",
|
||||
"global-agent": "^3.0.0",
|
||||
"got": "^12.0.2",
|
||||
"got": "^12.1.0",
|
||||
"graphql": "^15.6.1",
|
||||
"graphql-tag": "^2.12.6",
|
||||
"ioredis": "4.28.5",
|
||||
"ioredis": "5.0.6",
|
||||
"joi": "17.6.0",
|
||||
"joi-extension-semver": "5.0.0",
|
||||
"js-yaml": "^4.1.0",
|
||||
@@ -51,17 +51,17 @@
|
||||
"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",
|
||||
"path-to-regexp": "^6.2.1",
|
||||
"pretty-bytes": "^6.0.0",
|
||||
"priorityqueuejs": "^2.0.0",
|
||||
"prom-client": "^14.0.1",
|
||||
"qs": "^6.10.3",
|
||||
"qs": "^6.10.5",
|
||||
"query-string": "^7.1.1",
|
||||
"semver": "~7.3.5",
|
||||
"simple-icons": "6.15.0",
|
||||
"semver": "~7.3.7",
|
||||
"simple-icons": "6.23.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.18.2",
|
||||
"@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.16.0",
|
||||
"@typescript-eslint/parser": "^5.15.0",
|
||||
"@types/styled-components": "5.1.25",
|
||||
"@typescript-eslint/eslint-plugin": "^5.27.1",
|
||||
"@typescript-eslint/parser": "^5.27.0",
|
||||
"babel-plugin-inline-react-svg": "^2.0.1",
|
||||
"babel-preset-gatsby": "^2.9.0",
|
||||
"c8": "^7.11.0",
|
||||
"babel-preset-gatsby": "^2.14.0",
|
||||
"c8": "^7.11.3",
|
||||
"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.2",
|
||||
"danger": "^11.0.2",
|
||||
"concurrently": "^7.2.1",
|
||||
"cypress": "^10.0.3",
|
||||
"danger": "^11.0.7",
|
||||
"danger-plugin-no-test-shortcuts": "^2.0.0",
|
||||
"deepmerge": "^4.2.2",
|
||||
"eslint": "^7.32.0",
|
||||
@@ -179,31 +179,31 @@
|
||||
"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.0.6",
|
||||
"eslint-plugin-mocha": "^10.0.3",
|
||||
"eslint-plugin-import": "^2.26.0",
|
||||
"eslint-plugin-jsdoc": "^39.3.2",
|
||||
"eslint-plugin-mocha": "^10.0.5",
|
||||
"eslint-plugin-no-extension-in-require": "^0.2.0",
|
||||
"eslint-plugin-node": "^11.1.0",
|
||||
"eslint-plugin-promise": "^6.0.0",
|
||||
"eslint-plugin-react": "^7.29.4",
|
||||
"eslint-plugin-react-hooks": "^4.3.0",
|
||||
"eslint-plugin-promise": "^5.2.0",
|
||||
"eslint-plugin-react": "^7.30.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",
|
||||
"gatsby": "4.6.2",
|
||||
"gatsby-plugin-catch-links": "^4.9.0",
|
||||
"gatsby-plugin-catch-links": "^4.11.0",
|
||||
"gatsby-plugin-page-creator": "^4.7.0",
|
||||
"gatsby-plugin-react-helmet": "^5.10.0",
|
||||
"gatsby-plugin-remove-trailing-slashes": "^4.9.0",
|
||||
"gatsby-plugin-styled-components": "^5.2.0",
|
||||
"gatsby-plugin-typescript": "^4.9.0",
|
||||
"gatsby-plugin-styled-components": "^5.11.0",
|
||||
"gatsby-plugin-typescript": "^4.11.1",
|
||||
"humanize-string": "^2.1.0",
|
||||
"icedfrisby": "4.0.0",
|
||||
"icedfrisby-nock": "^2.1.0",
|
||||
"is-svg": "^4.3.2",
|
||||
"js-yaml-loader": "^1.2.2",
|
||||
"jsdoc": "^3.6.10",
|
||||
"lint-staged": "^12.3.7",
|
||||
"lint-staged": "^13.0.1",
|
||||
"lodash.debounce": "^4.0.8",
|
||||
"lodash.difference": "^4.5.0",
|
||||
"minimist": "^1.2.6",
|
||||
@@ -211,38 +211,38 @@
|
||||
"mocha-env-reporter": "^4.0.0",
|
||||
"mocha-junit-reporter": "^2.0.2",
|
||||
"mocha-yaml-loader": "^1.0.3",
|
||||
"nock": "13.2.4",
|
||||
"nock": "13.2.6",
|
||||
"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",
|
||||
"redis-server": "^1.2.2",
|
||||
"rimraf": "^3.0.2",
|
||||
"sazerac": "^2.0.0",
|
||||
"simple-git-hooks": "^2.7.0",
|
||||
"sinon": "^13.0.1",
|
||||
"simple-git-hooks": "^2.8.0",
|
||||
"sinon": "^14.0.0",
|
||||
"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",
|
||||
"ts-mocha": "^10.0.0",
|
||||
"tsd": "^0.20.0",
|
||||
"typescript": "^4.7.3",
|
||||
"url": "^0.11.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^16.13.0",
|
||||
"npm": ">=7.0.0"
|
||||
"node": ">=16.13.0",
|
||||
"npm": ">=8.0.0"
|
||||
},
|
||||
"type": "module",
|
||||
"collective": {
|
||||
|
||||
@@ -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,3 +1,9 @@
|
||||
/**
|
||||
* Common functions and schemas for tasks related to build status.
|
||||
*
|
||||
* @module
|
||||
*/
|
||||
|
||||
import Joi from 'joi'
|
||||
|
||||
const greenStatuses = [
|
||||
@@ -50,8 +56,23 @@ const allStatuses = greenStatuses
|
||||
.concat(redStatuses)
|
||||
.concat(otherStatuses)
|
||||
|
||||
/**
|
||||
* Joi schema for validating Build Status.
|
||||
* Checks if the build status is present in the list of allowed build status.
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
const isBuildStatus = Joi.equal(...allStatuses)
|
||||
|
||||
/**
|
||||
* Handles rendering concerns of badges that display build status.
|
||||
* Determines the message and color of the badge according to the build status.
|
||||
*
|
||||
* @param {object} attrs Refer to individual attributes
|
||||
* @param {string} [attrs.label] If provided then badge label is set to this value
|
||||
* @param {string} attrs.status Build status
|
||||
* @returns {object} Badge with label, message and color properties
|
||||
*/
|
||||
function renderBuildStatusBadge({ label, status }) {
|
||||
let message
|
||||
let color
|
||||
|
||||
@@ -3,7 +3,7 @@ import { createServiceFamily } from '../nuget/nuget-v2-service-family.js'
|
||||
export default createServiceFamily({
|
||||
defaultLabel: 'chocolatey',
|
||||
serviceBaseUrl: 'chocolatey',
|
||||
apiBaseUrl: 'https://www.chocolatey.org/api/v2',
|
||||
apiBaseUrl: 'https://community.chocolatey.org/api/v2',
|
||||
odataFormat: 'json',
|
||||
title: 'Chocolatey',
|
||||
examplePackageName: 'git',
|
||||
|
||||
@@ -1,10 +1,19 @@
|
||||
/**
|
||||
* Commonly-used functions for determining the colour to use for a badge,
|
||||
* including colours based off download count, version number, etc.
|
||||
*
|
||||
* @module
|
||||
*/
|
||||
|
||||
import moment from 'moment'
|
||||
import pep440 from '@renovate/pep440'
|
||||
|
||||
/**
|
||||
* Determines the color used for a badge based on version.
|
||||
*
|
||||
* @param {string|number} version Version used for determining badge color
|
||||
* @returns {string} Badge color
|
||||
*/
|
||||
function version(version) {
|
||||
if (typeof version !== 'string' && typeof version !== 'number') {
|
||||
throw new Error(`Can't generate a version color for ${version}`)
|
||||
@@ -21,6 +30,12 @@ function version(version) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines the color used for a badge based on PEP440 versioning.
|
||||
*
|
||||
* @param {string|number} version Version used for determining badge color
|
||||
* @returns {string} Badge color
|
||||
*/
|
||||
function pep440VersionColor(version) {
|
||||
if (!pep440.valid(version)) {
|
||||
return 'lightgrey'
|
||||
@@ -32,6 +47,18 @@ function pep440VersionColor(version) {
|
||||
return 'blue'
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines the color used for a badge by comparing the value and floor count values.
|
||||
* The color can vary from red to bright green depending on the range the value lies in.
|
||||
* Decreasing the value will shift the color towards red.
|
||||
* Increasing the value will shift the color towards bright green.
|
||||
*
|
||||
* @param {number} value Current value
|
||||
* @param {number} yellow Yellow color threshold, should be greater than 0
|
||||
* @param {number} yellowgreen Yellowgreen color threshold, should be greater than yellow
|
||||
* @param {number} green Green color threshold, should be greater than yellowgreen
|
||||
* @returns {string} Badge color
|
||||
*/
|
||||
function floorCount(value, yellow, yellowgreen, green) {
|
||||
if (value <= 0) {
|
||||
return 'red'
|
||||
@@ -46,14 +73,37 @@ function floorCount(value, yellow, yellowgreen, green) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines the color used for a badge by comparing the download count and floor values.
|
||||
* The color varies from red to bright green as the download count increases.
|
||||
*
|
||||
* @param {number} downloads Download count
|
||||
* @returns {string} Badge color
|
||||
*/
|
||||
function downloadCount(downloads) {
|
||||
return floorCount(downloads, 10, 100, 1000)
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines the color used for a badge by comparing percentage and floor values.
|
||||
* The color varies from red to bright green as the percentage increases.
|
||||
*
|
||||
* @param {number} percentage Percentage value
|
||||
* @returns {string} Badge color
|
||||
*/
|
||||
function coveragePercentage(percentage) {
|
||||
return floorCount(percentage, 80, 90, 100)
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines the color used for a badge by matching score with grade values.
|
||||
* The color varies from bright green to red as the score decreases.
|
||||
* The score can be one of the following grade value: ['A', 'B', 'C', 'D', 'E'].
|
||||
* The color defaults to red if the score does not matches with any of the grade values.
|
||||
*
|
||||
* @param {string} score Score value
|
||||
* @returns {string} Badge color
|
||||
*/
|
||||
function letterScore(score) {
|
||||
if (score === 'A') {
|
||||
return 'brightgreen'
|
||||
@@ -70,6 +120,18 @@ function letterScore(score) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a callback function that determines badge color from the colors array.
|
||||
* If the colors array is provided then for n steps, there should be n + 1 color.
|
||||
* If the colors array is not provided then it is chosen from the default colors array
|
||||
* according to the size of the steps array.
|
||||
*
|
||||
* @param {number[]} steps Steps array
|
||||
* @param {string[]} colors Colors array. If provided, should be of length steps.length + 1
|
||||
* @param {boolean} reversed If true then the colors array will be considered in reverse order
|
||||
* @returns {function(number): string} Function that finds the step index by comparing value
|
||||
* with steps array and returns color from colors array for the corresponding step index
|
||||
*/
|
||||
function colorScale(steps, colors, reversed) {
|
||||
if (steps === undefined) {
|
||||
throw Error('When invoking colorScale, steps should be provided.')
|
||||
@@ -110,6 +172,14 @@ function colorScale(steps, colors, reversed) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines the color used for a badge according to the age.
|
||||
* Age is calculated as days elapsed till current date.
|
||||
* The color varies from bright green to red as the age increases.
|
||||
*
|
||||
* @param {string} date Date string
|
||||
* @returns {string} Badge color
|
||||
*/
|
||||
function age(date) {
|
||||
const colorByAge = colorScale([7, 30, 180, 365, 730], undefined, true)
|
||||
const daysElapsed = moment().diff(moment(date), 'days')
|
||||
|
||||
@@ -1,5 +1,18 @@
|
||||
/**
|
||||
* Common functions and utilities for tasks related to contributor count.
|
||||
*
|
||||
* @module
|
||||
*/
|
||||
|
||||
import { metric } from './text-formatters.js'
|
||||
|
||||
/**
|
||||
* Determines the color used for a badge based on the contributor count.
|
||||
* The color varies from red to bright green as the contributor count increases.
|
||||
*
|
||||
* @param {number} contributorCount Contributor count
|
||||
* @returns {string} Badge color
|
||||
*/
|
||||
function contributorColor(contributorCount) {
|
||||
if (contributorCount > 2) {
|
||||
return 'brightgreen'
|
||||
@@ -10,6 +23,15 @@ function contributorColor(contributorCount) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles rendering concerns of badges that display contributor count.
|
||||
* Determines the message and color of the badge according to the contributor count.
|
||||
*
|
||||
* @param {object} attrs Refer to individual attributes
|
||||
* @param {string} [attrs.label] If provided then badge label is set to this value
|
||||
* @param {number} attrs.contributorCount Contributor count
|
||||
* @returns {object} Badge with label, message and color properties
|
||||
*/
|
||||
function renderContributorBadge({ label, contributorCount }) {
|
||||
return {
|
||||
label,
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
import { Deprecated } from './index.js'
|
||||
|
||||
function enforceDeprecation(effectiveDate) {
|
||||
if (Date.now() >= effectiveDate.getTime()) {
|
||||
throw new Deprecated()
|
||||
}
|
||||
}
|
||||
|
||||
export { enforceDeprecation }
|
||||
@@ -1,15 +0,0 @@
|
||||
import { expect } from 'chai'
|
||||
import { Deprecated } from '../core/base-service/errors.js'
|
||||
import { enforceDeprecation } from './deprecation-helpers.js'
|
||||
|
||||
describe('enforceDeprecation', function () {
|
||||
it('throws Deprecated for a date in the past', function () {
|
||||
expect(() => enforceDeprecation(new Date())).to.throw(Deprecated)
|
||||
})
|
||||
|
||||
it('does not throw for a date in the future', function () {
|
||||
expect(() =>
|
||||
enforceDeprecation(new Date(Date.now() + 10000))
|
||||
).not.to.throw()
|
||||
})
|
||||
})
|
||||
@@ -1,22 +1,54 @@
|
||||
/**
|
||||
* Common functions and utilities for tasks related to dynamic badges.
|
||||
*
|
||||
* @module
|
||||
*/
|
||||
|
||||
import Joi from 'joi'
|
||||
import toArray from '../core/base-service/to-array.js'
|
||||
import validate from '../core/base-service/validate.js'
|
||||
import { InvalidResponse } from './index.js'
|
||||
|
||||
/**
|
||||
* Map of error codes and their corresponding error messages.
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
const errorMessages = {
|
||||
404: 'resource not found',
|
||||
}
|
||||
|
||||
/**
|
||||
* Joi schema for validating individual value.
|
||||
* Checks if the individual value is of type string or number.
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
const individualValueSchema = Joi.alternatives()
|
||||
.try(Joi.string(), Joi.number())
|
||||
.required()
|
||||
|
||||
/**
|
||||
* Joi schema for validating compound value.
|
||||
* Checks if the compound value is of type individualValueSchema, array of individualValueSchema or empty array.
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
const compoundValueSchema = Joi.alternatives().try(
|
||||
individualValueSchema,
|
||||
Joi.array().items(individualValueSchema).required(),
|
||||
Joi.array().length(0)
|
||||
)
|
||||
|
||||
/**
|
||||
* Look up the value in the data object by key and validate the value against compoundValueSchema.
|
||||
*
|
||||
* @param {object} attrs Refer to individual attributes
|
||||
* @param {object} attrs.data Object containing the data for validation
|
||||
* @param {string} attrs.key Key to retrieve the data from object for validation
|
||||
* @throws {InvalidResponse|Error} Error if Joi validation fails due to invalid or no schema
|
||||
* @returns {object} Value if Joi validation is success
|
||||
*/
|
||||
function transformAndValidate({ data, key }) {
|
||||
return validate(
|
||||
{
|
||||
@@ -30,6 +62,20 @@ function transformAndValidate({ data, key }) {
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles rendering concerns of dynamic badges.
|
||||
* Determines the label of the badge according to the tag and defaultLabel.
|
||||
* Determines the message of the badge according to the prefix, suffix and value.
|
||||
* Sets the color of the badge to blue.
|
||||
*
|
||||
* @param {object} attrs Refer to individual attributes
|
||||
* @param {string} attrs.defaultLabel default badge label
|
||||
* @param {string} [attrs.tag] If provided then this value will be appended to the badge label, e.g. `foobar@v1.23`
|
||||
* @param {any} attrs.value Value or array of value to be used for the badge message
|
||||
* @param {string} [attrs.prefix] If provided then the badge message will use this value as a prefix
|
||||
* @param {string} [attrs.suffix] If provided then the badge message will use this value as a suffix
|
||||
* @returns {object} Badge with label, message and color properties
|
||||
*/
|
||||
function renderDynamicBadge({
|
||||
defaultLabel,
|
||||
tag,
|
||||
|
||||
33
services/flathub/flathub-downloads.service.js
Normal file
33
services/flathub/flathub-downloads.service.js
Normal file
@@ -0,0 +1,33 @@
|
||||
import Joi from 'joi'
|
||||
import { BaseJsonService } from '../index.js'
|
||||
import { renderDownloadsBadge } from '../downloads.js'
|
||||
|
||||
const schema = Joi.object({
|
||||
installs_total: Joi.number().integer().required(),
|
||||
}).required()
|
||||
|
||||
export default class FlathubDownloads extends BaseJsonService {
|
||||
static category = 'downloads'
|
||||
static route = { base: 'flathub/downloads', pattern: ':packageName' }
|
||||
static examples = [
|
||||
{
|
||||
title: 'Flathub',
|
||||
namedParams: {
|
||||
packageName: 'org.mozilla.firefox',
|
||||
},
|
||||
staticPreview: renderDownloadsBadge({ downloads: '277136' }),
|
||||
},
|
||||
]
|
||||
|
||||
static defaultBadgeData = { label: 'installs' }
|
||||
|
||||
async handle({ packageName }) {
|
||||
const data = await this._requestJson({
|
||||
schema,
|
||||
url: `https://flathub.org/api/v2/stats/${encodeURIComponent(
|
||||
packageName
|
||||
)}`,
|
||||
})
|
||||
return renderDownloadsBadge({ downloads: data.installs_total })
|
||||
}
|
||||
}
|
||||
14
services/flathub/flathub-downloads.tester.js
Normal file
14
services/flathub/flathub-downloads.tester.js
Normal file
@@ -0,0 +1,14 @@
|
||||
import { isMetric } from '../test-validators.js'
|
||||
import { createServiceTester } from '../tester.js'
|
||||
export const t = await createServiceTester()
|
||||
|
||||
t.create('Flathub Downloads (valid)')
|
||||
.get('/org.mozilla.firefox.json')
|
||||
.expectBadge({
|
||||
label: 'installs',
|
||||
message: isMetric,
|
||||
})
|
||||
|
||||
t.create('Flathub Downloads (not found)')
|
||||
.get('/not.a.package.json')
|
||||
.expectBadge({ label: 'installs', message: 'not found' })
|
||||
@@ -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),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -140,6 +140,26 @@ const ageUpdateMap = {
|
||||
}),
|
||||
}
|
||||
|
||||
const milestoneMap = {
|
||||
schema: Joi.object({
|
||||
...commonSchemaFields,
|
||||
milestone: Joi.object({
|
||||
title: Joi.string().required(),
|
||||
}).allow(null),
|
||||
}).required(),
|
||||
transform: ({ json }) => {
|
||||
if (!json.milestone) {
|
||||
throw new InvalidResponse({ prettyMessage: 'no milestone' })
|
||||
}
|
||||
return json.milestone.title
|
||||
},
|
||||
render: ({ value }) => ({
|
||||
label: 'milestone',
|
||||
message: value,
|
||||
color: 'informational',
|
||||
}),
|
||||
}
|
||||
|
||||
const propertyMap = {
|
||||
state: stateMap,
|
||||
title: titleMap,
|
||||
@@ -148,6 +168,7 @@ const propertyMap = {
|
||||
comments: commentsMap,
|
||||
age: ageUpdateMap,
|
||||
'last-update': ageUpdateMap,
|
||||
milestone: milestoneMap,
|
||||
}
|
||||
|
||||
export default class GithubIssueDetail extends GithubAuthV3Service {
|
||||
@@ -155,7 +176,7 @@ export default class GithubIssueDetail extends GithubAuthV3Service {
|
||||
static route = {
|
||||
base: 'github',
|
||||
pattern:
|
||||
':issueKind(issues|pulls)/detail/:property(state|title|author|label|comments|age|last-update)/:user/:repo/:number([0-9]+)',
|
||||
':issueKind(issues|pulls)/detail/:property(state|title|author|label|comments|age|last-update|milestone)/:user/:repo/:number([0-9]+)',
|
||||
}
|
||||
|
||||
static examples = [
|
||||
@@ -182,6 +203,7 @@ export default class GithubIssueDetail extends GithubAuthV3Service {
|
||||
'comments',
|
||||
'age',
|
||||
'last update',
|
||||
'milestone',
|
||||
],
|
||||
documentation,
|
||||
},
|
||||
|
||||
@@ -90,6 +90,14 @@ describe('GithubIssueDetail', function () {
|
||||
message: formatDate('2019-04-02T20:09:31Z'),
|
||||
color: age('2019-04-02T20:09:31Z'),
|
||||
})
|
||||
given({
|
||||
property: 'milestone',
|
||||
value: 'MS 1',
|
||||
}).expect({
|
||||
label: 'milestone',
|
||||
message: 'MS 1',
|
||||
color: 'informational',
|
||||
})
|
||||
})
|
||||
|
||||
test(GithubIssueDetail.prototype.transform, () => {
|
||||
@@ -178,6 +186,13 @@ describe('GithubIssueDetail', function () {
|
||||
value: '2019-04-02T20:09:31Z',
|
||||
isPR: false,
|
||||
})
|
||||
given({
|
||||
property: 'milestone',
|
||||
json: { milestone: { title: 'MS 1' } },
|
||||
}).expect({
|
||||
value: 'MS 1',
|
||||
isPR: false,
|
||||
})
|
||||
})
|
||||
|
||||
context('transform()', function () {
|
||||
@@ -194,4 +209,19 @@ describe('GithubIssueDetail', function () {
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
context('transform()', function () {
|
||||
it('throws InvalidResponse error when issue has no milestone', function () {
|
||||
try {
|
||||
GithubIssueDetail.prototype.transform({
|
||||
property: 'milestone',
|
||||
json: { milestone: null },
|
||||
})
|
||||
expect.fail('Expected to throw')
|
||||
} catch (e) {
|
||||
expect(e).to.be.an.instanceof(InvalidResponse)
|
||||
expect(e.prettyMessage).to.equal('no milestone')
|
||||
}
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@@ -64,3 +64,16 @@ t.create('github pull request merge state (pull request not found)')
|
||||
label: 'issue/pull request',
|
||||
message: 'issue, pull request or repo not found',
|
||||
})
|
||||
|
||||
t.create('github issue milestone')
|
||||
.get('/issues/detail/milestone/badges/shields/4949.json')
|
||||
.expectBadge({
|
||||
label: 'milestone',
|
||||
message: 'badge-maker v3.4',
|
||||
})
|
||||
|
||||
t.create('github issue milestone (without milestone)')
|
||||
.get('/issues/detail/milestone/badges/shields/979.json')
|
||||
.expectBadge({
|
||||
message: 'no milestone',
|
||||
})
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
|
||||
89
services/gitlab/gitlab-license.service.js
Normal file
89
services/gitlab/gitlab-license.service.js
Normal file
@@ -0,0 +1,89 @@
|
||||
import Joi from 'joi'
|
||||
import { optionalUrl } from '../validators.js'
|
||||
import { renderLicenseBadge } from '../licenses.js'
|
||||
import GitLabBase from './gitlab-base.js'
|
||||
|
||||
const schema = Joi.object({
|
||||
license: Joi.object({
|
||||
name: Joi.string().required(),
|
||||
}).allow(null),
|
||||
}).required()
|
||||
|
||||
const queryParamSchema = Joi.object({
|
||||
gitlab_url: optionalUrl,
|
||||
}).required()
|
||||
|
||||
const documentation = `
|
||||
<p>
|
||||
You may use your GitLab Project Id (e.g. 13083) or your Project Path (e.g. gitlab-org/gitlab-foss )
|
||||
</p>
|
||||
`
|
||||
const commonProps = {
|
||||
namedParams: {
|
||||
project: 'gitlab-org/gitlab-foss',
|
||||
},
|
||||
documentation,
|
||||
}
|
||||
|
||||
export default class GitlabLicense extends GitLabBase {
|
||||
static category = 'license'
|
||||
|
||||
static route = {
|
||||
base: 'gitlab/v/license',
|
||||
pattern: ':project+',
|
||||
queryParamSchema,
|
||||
}
|
||||
|
||||
static examples = [
|
||||
{
|
||||
title: 'GitLab',
|
||||
...commonProps,
|
||||
staticPreview: {
|
||||
label: 'license',
|
||||
message: 'MIT License',
|
||||
color: 'green',
|
||||
},
|
||||
},
|
||||
{
|
||||
title: 'GitLab (custom server)',
|
||||
...commonProps,
|
||||
queryParams: { gitlab_url: 'https://jihulab.com' },
|
||||
staticPreview: {
|
||||
label: 'license',
|
||||
message: 'MIT License',
|
||||
color: 'green',
|
||||
},
|
||||
},
|
||||
]
|
||||
|
||||
static defaultBadgeData = { label: 'license' }
|
||||
|
||||
static render({ license }) {
|
||||
if (license) {
|
||||
return renderLicenseBadge({ license })
|
||||
} else {
|
||||
return { message: 'not specified' }
|
||||
}
|
||||
}
|
||||
|
||||
async fetch({ project, baseUrl }) {
|
||||
// https://docs.gitlab.com/ee/api/projects.html#get-single-project
|
||||
return super.fetch({
|
||||
schema,
|
||||
url: `${baseUrl}/api/v4/projects/${encodeURIComponent(project)}`,
|
||||
options: { searchParams: { license: '1' } },
|
||||
errorMessages: {
|
||||
404: 'repo not found',
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
async handle({ project }, { gitlab_url: baseUrl = 'https://gitlab.com' }) {
|
||||
const { license: licenseObject } = await this.fetch({
|
||||
project,
|
||||
baseUrl,
|
||||
})
|
||||
const license = licenseObject ? licenseObject.name : undefined
|
||||
return this.constructor.render({ license })
|
||||
}
|
||||
}
|
||||
57
services/gitlab/gitlab-license.tester.js
Normal file
57
services/gitlab/gitlab-license.tester.js
Normal file
@@ -0,0 +1,57 @@
|
||||
import { licenseToColor } from '../licenses.js'
|
||||
import { createServiceTester } from '../tester.js'
|
||||
export const t = await createServiceTester()
|
||||
|
||||
const publicDomainLicenseColor = licenseToColor('MIT License')
|
||||
const unknownLicenseColor = licenseToColor()
|
||||
|
||||
t.create('License')
|
||||
.get('/guoxudong.io/shields-test/licenced-test.json')
|
||||
.expectBadge({
|
||||
label: 'license',
|
||||
message: 'MIT License',
|
||||
color: `${publicDomainLicenseColor}`,
|
||||
})
|
||||
|
||||
t.create('License for repo without a license')
|
||||
.get('/guoxudong.io/shields-test/no-license-test.json')
|
||||
.expectBadge({
|
||||
label: 'license',
|
||||
message: 'not specified',
|
||||
color: 'lightgrey',
|
||||
})
|
||||
|
||||
t.create('Other license').get('/gitlab-org/gitlab-foss.json').expectBadge({
|
||||
label: 'license',
|
||||
message: 'Other',
|
||||
color: unknownLicenseColor,
|
||||
})
|
||||
|
||||
t.create('License for unknown repo')
|
||||
.get('/user1/gitlab-does-not-have-this-repo.json')
|
||||
.expectBadge({
|
||||
label: 'license',
|
||||
message: 'repo not found',
|
||||
color: 'red',
|
||||
})
|
||||
|
||||
t.create('Mocking License')
|
||||
.get('/group/project.json')
|
||||
.intercept(nock =>
|
||||
nock('https://gitlab.com')
|
||||
.get('/api/v4/projects/group%2Fproject?license=1')
|
||||
.reply(200, {
|
||||
license: {
|
||||
key: 'apache-2.0',
|
||||
name: 'Apache License 2.0',
|
||||
nickname: '',
|
||||
html_url: 'http://choosealicense.com/licenses/apache-2.0/',
|
||||
source_url: '',
|
||||
},
|
||||
})
|
||||
)
|
||||
.expectBadge({
|
||||
label: 'license',
|
||||
message: 'Apache License 2.0',
|
||||
color: unknownLicenseColor,
|
||||
})
|
||||
@@ -31,7 +31,7 @@ export default class JitPackVersion extends BaseJsonService {
|
||||
static defaultBadgeData = { label: 'jitpack' }
|
||||
|
||||
async fetch({ vcs, user, repo }) {
|
||||
const url = `https://jitpack.io/api/builds/com.${vcs}.${user}/${repo}/latest`
|
||||
const url = `https://jitpack.io/api/builds/com.${vcs}.${user}/${repo}/latestOk`
|
||||
|
||||
return this._requestJson({
|
||||
schema,
|
||||
|
||||
@@ -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',
|
||||
})
|
||||
53
services/pub/pub-likes.service.js
Normal file
53
services/pub/pub-likes.service.js
Normal file
@@ -0,0 +1,53 @@
|
||||
import Joi from 'joi'
|
||||
import { BaseJsonService } from '../index.js'
|
||||
import { metric } from '../text-formatters.js'
|
||||
import { nonNegativeInteger } from '../validators.js'
|
||||
|
||||
const documentation = `<p>A measure of how many developers have liked a package. This provides a raw measure of the overall sentiment of a package from peer developers.</p>`
|
||||
|
||||
const keywords = ['dart', 'flutter']
|
||||
|
||||
const schema = Joi.object({
|
||||
likeCount: nonNegativeInteger,
|
||||
}).required()
|
||||
|
||||
const title = 'Pub Likes'
|
||||
|
||||
export default class PubLikes extends BaseJsonService {
|
||||
static category = 'rating'
|
||||
|
||||
static route = { base: 'pub/likes', pattern: ':packageName' }
|
||||
|
||||
static examples = [
|
||||
{
|
||||
title,
|
||||
keywords,
|
||||
documentation,
|
||||
namedParams: { packageName: 'analysis_options' },
|
||||
staticPreview: this.render({ likeCount: 1000 }),
|
||||
},
|
||||
]
|
||||
|
||||
static defaultBadgeData = { label: 'likes' }
|
||||
|
||||
static render({ likeCount }) {
|
||||
return {
|
||||
label: 'likes',
|
||||
message: metric(likeCount),
|
||||
color: 'blue',
|
||||
}
|
||||
}
|
||||
|
||||
async fetch({ packageName }) {
|
||||
return this._requestJson({
|
||||
schema,
|
||||
url: `https://pub.dev/api/packages/${packageName}/score`,
|
||||
})
|
||||
}
|
||||
|
||||
async handle({ packageName }) {
|
||||
const score = await this.fetch({ packageName })
|
||||
const likeCount = score.likeCount
|
||||
return this.constructor.render({ likeCount })
|
||||
}
|
||||
}
|
||||
22
services/pub/pub-likes.tester.js
Normal file
22
services/pub/pub-likes.tester.js
Normal file
@@ -0,0 +1,22 @@
|
||||
import { isMetric } from '../test-validators.js'
|
||||
import { createServiceTester } from '../tester.js'
|
||||
|
||||
export const t = await createServiceTester()
|
||||
|
||||
t.create('pub likes (valid)').get('/analysis_options.json').expectBadge({
|
||||
label: 'likes',
|
||||
message: isMetric,
|
||||
color: 'blue',
|
||||
})
|
||||
|
||||
t.create('pub likes (not found)').get('/analysisoptions.json').expectBadge({
|
||||
label: 'likes',
|
||||
message: 'not found',
|
||||
color: 'red',
|
||||
})
|
||||
|
||||
t.create('pub likes (invalid)').get('/analysis-options.json').expectBadge({
|
||||
label: 'likes',
|
||||
message: 'invalid',
|
||||
color: 'lightgrey',
|
||||
})
|
||||
55
services/pub/pub-points.service.js
Normal file
55
services/pub/pub-points.service.js
Normal file
@@ -0,0 +1,55 @@
|
||||
import Joi from 'joi'
|
||||
import { floorCount } from '../color-formatters.js'
|
||||
import { BaseJsonService } from '../index.js'
|
||||
import { nonNegativeInteger } from '../validators.js'
|
||||
|
||||
const documentation = `<p>A measure of quality. This includes several dimensions of quality such as code style, platform support, and maintainability.</p>`
|
||||
|
||||
const keywords = ['dart', 'flutter']
|
||||
|
||||
const schema = Joi.object({
|
||||
grantedPoints: nonNegativeInteger,
|
||||
maxPoints: nonNegativeInteger,
|
||||
}).required()
|
||||
|
||||
const title = 'Pub Points'
|
||||
|
||||
export default class PubPoints extends BaseJsonService {
|
||||
static category = 'rating'
|
||||
|
||||
static route = { base: 'pub/points', pattern: ':packageName' }
|
||||
|
||||
static examples = [
|
||||
{
|
||||
title,
|
||||
keywords,
|
||||
documentation,
|
||||
namedParams: { packageName: 'analysis_options' },
|
||||
staticPreview: this.render({ grantedPoints: 120, maxPoints: 130 }),
|
||||
},
|
||||
]
|
||||
|
||||
static defaultBadgeData = { label: 'points' }
|
||||
|
||||
static render({ grantedPoints, maxPoints }) {
|
||||
return {
|
||||
label: 'points',
|
||||
message: `${grantedPoints}/${maxPoints}`,
|
||||
color: floorCount((grantedPoints / maxPoints) * 100, 40, 60, 80),
|
||||
}
|
||||
}
|
||||
|
||||
async fetch({ packageName }) {
|
||||
return this._requestJson({
|
||||
schema,
|
||||
url: `https://pub.dev/api/packages/${packageName}/score`,
|
||||
})
|
||||
}
|
||||
|
||||
async handle({ packageName }) {
|
||||
const score = await this.fetch({ packageName })
|
||||
const grantedPoints = score.grantedPoints
|
||||
const maxPoints = score.maxPoints
|
||||
return this.constructor.render({ grantedPoints, maxPoints })
|
||||
}
|
||||
}
|
||||
23
services/pub/pub-points.tester.js
Normal file
23
services/pub/pub-points.tester.js
Normal file
@@ -0,0 +1,23 @@
|
||||
import Joi from 'joi'
|
||||
import { createServiceTester } from '../tester.js'
|
||||
|
||||
export const t = await createServiceTester()
|
||||
|
||||
t.create('pub points (valid)')
|
||||
.get('/analysis_options.json')
|
||||
.expectBadge({
|
||||
label: 'points',
|
||||
message: Joi.string().regex(/^\d+\/130$/),
|
||||
})
|
||||
|
||||
t.create('pub points (not found)').get('/analysisoptions.json').expectBadge({
|
||||
label: 'points',
|
||||
message: 'not found',
|
||||
color: 'red',
|
||||
})
|
||||
|
||||
t.create('pub points (invalid)').get('/analysis-options.json').expectBadge({
|
||||
label: 'points',
|
||||
message: 'invalid',
|
||||
color: 'lightgrey',
|
||||
})
|
||||
53
services/pub/pub-popularity.service.js
Normal file
53
services/pub/pub-popularity.service.js
Normal file
@@ -0,0 +1,53 @@
|
||||
import Joi from 'joi'
|
||||
import { floorCount } from '../color-formatters.js'
|
||||
import { BaseJsonService } from '../index.js'
|
||||
|
||||
const documentation = `<p>A measure of how many developers use a package, providing insight into what other developers are using.</p>`
|
||||
|
||||
const keywords = ['dart', 'flutter']
|
||||
|
||||
const schema = Joi.object({
|
||||
popularityScore: Joi.number().min(0).max(1).required(),
|
||||
}).required()
|
||||
|
||||
const title = 'Pub Popularity'
|
||||
|
||||
export default class PubPopularity extends BaseJsonService {
|
||||
static category = 'rating'
|
||||
|
||||
static route = { base: 'pub/popularity', pattern: ':packageName' }
|
||||
|
||||
static examples = [
|
||||
{
|
||||
title,
|
||||
keywords,
|
||||
documentation,
|
||||
namedParams: { packageName: 'analysis_options' },
|
||||
staticPreview: this.render({ popularityScore: 0.9 }),
|
||||
},
|
||||
]
|
||||
|
||||
static defaultBadgeData = { label: 'popularity' }
|
||||
|
||||
static render({ popularityScore }) {
|
||||
const roundedScore = Math.round(popularityScore * 100)
|
||||
return {
|
||||
label: 'popularity',
|
||||
message: `${roundedScore}%`,
|
||||
color: floorCount(roundedScore, 40, 60, 80),
|
||||
}
|
||||
}
|
||||
|
||||
async fetch({ packageName }) {
|
||||
return this._requestJson({
|
||||
schema,
|
||||
url: `https://pub.dev/api/packages/${packageName}/score`,
|
||||
})
|
||||
}
|
||||
|
||||
async handle({ packageName }) {
|
||||
const score = await this.fetch({ packageName })
|
||||
const popularityScore = score.popularityScore
|
||||
return this.constructor.render({ popularityScore })
|
||||
}
|
||||
}
|
||||
23
services/pub/pub-popularity.tester.js
Normal file
23
services/pub/pub-popularity.tester.js
Normal file
@@ -0,0 +1,23 @@
|
||||
import { isIntegerPercentage } from '../test-validators.js'
|
||||
import { createServiceTester } from '../tester.js'
|
||||
|
||||
export const t = await createServiceTester()
|
||||
|
||||
t.create('pub popularity (valid)').get('/analysis_options.json').expectBadge({
|
||||
label: 'popularity',
|
||||
message: isIntegerPercentage,
|
||||
})
|
||||
|
||||
t.create('pub popularity (not found)')
|
||||
.get('/analysisoptions.json')
|
||||
.expectBadge({
|
||||
label: 'popularity',
|
||||
message: 'not found',
|
||||
color: 'red',
|
||||
})
|
||||
|
||||
t.create('pub popularity (invalid)').get('/analysis-options.json').expectBadge({
|
||||
label: 'popularity',
|
||||
message: 'invalid',
|
||||
color: 'lightgrey',
|
||||
})
|
||||
@@ -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',
|
||||
})
|
||||
|
||||
@@ -62,7 +62,10 @@ t.create('valid repo -- unregistered')
|
||||
color: COLOR_MAP.unregistered,
|
||||
})
|
||||
|
||||
t.create('invalid repo').get('/github.com/repo/invalid-repo.json').expectBadge({
|
||||
label: 'reuse',
|
||||
message: 'Not a Git repository',
|
||||
})
|
||||
t.create('invalid repo')
|
||||
.timeout(10000)
|
||||
.get('/github.com/repo/invalid-repo.json')
|
||||
.expectBadge({
|
||||
label: 'reuse',
|
||||
message: 'Not a Git repository',
|
||||
})
|
||||
|
||||
@@ -53,8 +53,8 @@ export default class ScoopVersion extends ConditionalGithubAuthV3Service {
|
||||
if (!this.buckets) {
|
||||
this.buckets = await fetchJsonFromRepo(this, {
|
||||
schema: bucketsSchema,
|
||||
user: 'lukesampson',
|
||||
repo: 'scoop',
|
||||
user: 'ScoopInstaller',
|
||||
repo: 'Scoop',
|
||||
branch: 'master',
|
||||
filename: 'buckets.json',
|
||||
})
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -17,7 +17,7 @@ export default class SpackVersion extends BaseJsonService {
|
||||
{
|
||||
title: 'Spack',
|
||||
namedParams: { packageName: 'adios2' },
|
||||
staticPreview: this.render({ version: '2.3.1' }),
|
||||
staticPreview: this.render({ version: '2.8.0' }),
|
||||
keywords: ['hpc'],
|
||||
},
|
||||
]
|
||||
@@ -29,10 +29,9 @@ export default class SpackVersion extends BaseJsonService {
|
||||
}
|
||||
|
||||
async fetch({ packageName }) {
|
||||
const firstLetter = packageName[0]
|
||||
return this._requestJson({
|
||||
schema,
|
||||
url: `https://packages.spack.io/api/${firstLetter}/${packageName}.json`,
|
||||
url: `https://packages.spack.io/data/packages/${packageName}.json`,
|
||||
errorMessages: {
|
||||
404: 'package not found',
|
||||
},
|
||||
|
||||
@@ -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