While Next.js can handle static sites, we've had a few issues with it, notably a performance hit at runtime and some bugginess around routing and SSR. Gatsby being fully intended for high-performance static sites makes it a great technical fit for the Shields frontend. The `createPages()` API should be a really nice way to add a page for each service family, for example. This migrates the frontend from Next.js to Gatsby. Gatsby is a powerful tool, which has a bit of downside as there's a lot to dig through. Overall I found configuration easier than Next.js. There are a lot of plugins and for the most part they worked out of the box. The documentation is good. Links are cleaner now: there is no #. This will break old links though perhaps we could add some redirection to help with that. The only one I’m really concerned about `/#/endpoint`. I’m not sure if folks are deep-linking to the category pages. There are a lot of enhancements we could add, in order to speed up the site even more. In particular we could think about inlining the SVGs rather than making separate requests for each one. While Gatsby recommends GraphQL, it's not required. To keep things simple and reduce the learning curve, I did not use it here. Close #1943 Fix #2837 Fix #2616
250 lines
9.2 KiB
JSON
250 lines
9.2 KiB
JSON
{
|
|
"name": "shields.io",
|
|
"version": "0.0.0",
|
|
"description": "Shields.io server and frontend",
|
|
"private": true,
|
|
"keywords": [
|
|
"GitHub",
|
|
"badge",
|
|
"SVG",
|
|
"image",
|
|
"shields.io"
|
|
],
|
|
"homepage": "http://shields.io",
|
|
"bugs": {
|
|
"url": "https://github.com/badges/shields/issues",
|
|
"email": "thaddee.tyl@gmail.com"
|
|
},
|
|
"license": "CC0-1.0",
|
|
"author": "Thaddée Tyl <thaddee.tyl@gmail.com>",
|
|
"repository": {
|
|
"type": "git",
|
|
"url": "https://github.com/badges/shields"
|
|
},
|
|
"dependencies": {
|
|
"bytes": "^3.1.0",
|
|
"camp": "~17.2.2",
|
|
"chalk": "^2.4.2",
|
|
"check-node-version": "^3.1.0",
|
|
"chrome-web-store-item-property": "~1.1.2",
|
|
"config": "^3.0.1",
|
|
"cross-env": "^5.2.0",
|
|
"dotenv": "^6.2.0",
|
|
"emojic": "^1.1.15",
|
|
"escape-string-regexp": "^1.0.5",
|
|
"fast-xml-parser": "^3.12.12",
|
|
"fsos": "^1.1.3",
|
|
"gh-badges": "file:gh-badges",
|
|
"glob": "^7.1.1",
|
|
"joi": "14.3.1",
|
|
"js-yaml": "^3.12.1",
|
|
"joi-extension-semver": "2.0.0",
|
|
"jsonpath": "~1.0.0",
|
|
"lodash.countby": "^4.6.0",
|
|
"lodash.throttle": "^4.1.1",
|
|
"lodash.times": "^4.3.2",
|
|
"moment": "^2.24.0",
|
|
"node-env-flag": "^0.1.0",
|
|
"parse-link-header": "^1.0.1",
|
|
"path-to-regexp": "^3.0.0",
|
|
"pretty-bytes": "^5.0.0",
|
|
"priorityqueuejs": "^1.0.0",
|
|
"prom-client": "^11.2.1",
|
|
"query-string": "^6.0.0",
|
|
"raven": "^2.4.2",
|
|
"redis": "~2.8.0",
|
|
"request": "~2.88.0",
|
|
"semver": "~5.6.0",
|
|
"simple-icons": "1.9.19",
|
|
"xml2js": "~0.4.16",
|
|
"xmldom": "~0.1.27",
|
|
"xpath": "~0.0.27"
|
|
},
|
|
"scripts": {
|
|
"coverage:test:server": "echo \"Deprecated; run `npm run coverage:test:core` instead.\" && npm run coverage:test:core",
|
|
"coverage:test:core": "nyc npm run test:core",
|
|
"coverage:test:frontend": "nyc --nycrc-path .nycrc-frontend.json npm run test:frontend",
|
|
"coverage:test:package": "nyc npm run test:package",
|
|
"coverage:test:entrypoint": "nyc npm run test:entrypoint",
|
|
"coverage:test:integration": "nyc npm run test:integration",
|
|
"coverage:test:services": "nyc npm run test:services",
|
|
"coverage:clean": "rimraf .nyc_output coverage",
|
|
"precoverage:test": "run-s --silent coverage:clean defs features",
|
|
"coverage:test": "run-s --silent --continue-on-error coverage:test:server coverage:test:package coverage:test:entrypoint coverage:test:frontend coverage:test:integration",
|
|
"coverage:report:generate": "nyc report",
|
|
"coverage:report:open": "opn coverage/lcov-report/index.html",
|
|
"coverage:report": "run-s --silent coverage:report:generate coverage:report:open",
|
|
"lint": "eslint \"**/*.js\"",
|
|
"prettier": "prettier --write \"**/*.@(js|md|json|yml)\"",
|
|
"prettier-check": "prettier-check \"**/*.@(js|md|json|yml)\"",
|
|
"danger": "danger",
|
|
"test:server": "echo \"Deprecated; run `npm run test:core` instead.\" && npm run test:core",
|
|
"test:js:server": "echo \"Deprecated; run `npm run test:core` instead.\" && npm run test:core",
|
|
"test:js:frontend": "echo \"Deprecated; run `npm run test:frontend` instead.\" && npm run test:frontend",
|
|
"test:js:package": "echo \"Deprecated; run `npm run test:package` instead.\" && npm run test:package",
|
|
"test:frontend": "cross-env NODE_ENV=test mocha --opts mocha.opts --require @babel/polyfill --require @babel/register --require mocha-yaml-loader --require frontend/mocha-ignore-pngs \"frontend/**/*.spec.js\"",
|
|
"test:core": "cross-env NODE_CONFIG_ENV=test mocha --opts mocha.opts \"core/**/*.spec.js\" \"lib/**/*.spec.js\" \"services/**/*.spec.js\"",
|
|
"test:package": "mocha --opts mocha.opts \"gh-badges/**/*.spec.js\"",
|
|
"test:entrypoint": "cross-env NODE_CONFIG_ENV=test mocha --opts mocha.opts entrypoint.spec.js",
|
|
"test:integration": "cross-env NODE_CONFIG_ENV=test mocha --opts mocha.opts \"core/**/*.integration.js\" \"services/**/*.integration.js\"",
|
|
"test:services": "cross-env NODE_CONFIG_ENV=test mocha --opts mocha.opts --delay core/service-test-runner/cli.js",
|
|
"test:services:trace": "cross-env NODE_CONFIG_ENV=test TRACE_SERVICES=true npm run test:services -- $*",
|
|
"test:services:pr:prepare": "node core/service-test-runner/pull-request-services-cli.js > pull-request-services.log",
|
|
"test:services:pr:run": "cross-env NODE_CONFIG_ENV=test mocha --opts mocha.opts --delay core/service-test-runner/cli.js --stdin < pull-request-services.log",
|
|
"test:services:pr": "run-s --silent test:services:pr:prepare test:services:pr:run",
|
|
"pretest": "run-s --silent defs features",
|
|
"test": "run-s --silent --continue-on-error lint test:frontend test:package test:server test:entrypoint prettier-check",
|
|
"depcheck": "check-node-version --node \">= 8.0\"",
|
|
"postinstall": "run-s --silent depcheck",
|
|
"prebuild": "run-s --silent depcheck",
|
|
"features": "node scripts/export-supported-features-cli.js > supported-features.json",
|
|
"defs": "node scripts/export-service-definitions-cli.js > service-definitions.yml",
|
|
"build": "run-s defs features && gatsby build",
|
|
"heroku-postbuild": "run-s --silent build",
|
|
"start:server": "cross-env NODE_CONFIG_ENV=development node server 8080",
|
|
"now-start": "node server",
|
|
"prestart": "run-s --silent depcheck defs features",
|
|
"start": "concurrently --names server,frontend \"npm run start:server\" \"cross-env GATSBY_BASE_URL=http://localhost:8080 gatsby develop --port 3000\"",
|
|
"refactoring-report": "node scripts/refactoring-cli.js",
|
|
"badge": "cross-env NODE_CONFIG_ENV=test TRACE_SERVICES=true node scripts/badge-cli.js"
|
|
},
|
|
"lint-staged": {
|
|
"**/*.js": [
|
|
"eslint --fix",
|
|
"prettier --write",
|
|
"git add"
|
|
]
|
|
},
|
|
"devDependencies": {
|
|
"@babel/core": "^7.2.2",
|
|
"@babel/plugin-proposal-class-properties": "^7.3.0",
|
|
"@babel/plugin-proposal-object-rest-spread": "^7.3.2",
|
|
"@babel/polyfill": "^7.2.5",
|
|
"@babel/preset-env": "^7.3.1",
|
|
"@babel/register": "7.0.0",
|
|
"@mapbox/react-click-to-select": "^2.2.0",
|
|
"babel-eslint": "^10.0.0",
|
|
"babel-plugin-inline-react-svg": "^1.0.1",
|
|
"babel-plugin-istanbul": "^5.1.0",
|
|
"babel-preset-gatsby": "^0.1.6",
|
|
"caller": "^1.0.1",
|
|
"chai": "^4.1.2",
|
|
"chai-datetime": "^1.5.0",
|
|
"chai-enzyme": "^1.0.0-beta.1",
|
|
"chai-string": "^1.4.0",
|
|
"chainsmoker": "^0.1.0",
|
|
"child-process-promise": "^2.2.1",
|
|
"clipboard-copy": "^2.0.1",
|
|
"concurrently": "^4.1.0",
|
|
"danger": "^7.0.7",
|
|
"danger-plugin-no-test-shortcuts": "^2.0.0",
|
|
"enzyme": "^3.8.0",
|
|
"enzyme-adapter-react-16": "^1.9.1",
|
|
"eol": "^0.9.1",
|
|
"eslint": "^5.13.0",
|
|
"eslint-config-prettier": "^4.0.0",
|
|
"eslint-config-standard": "^12.0.0",
|
|
"eslint-config-standard-jsx": "^6.0.2",
|
|
"eslint-config-standard-react": "^7.0.2",
|
|
"eslint-plugin-chai-friendly": "^0.4.1",
|
|
"eslint-plugin-import": "^2.16.0",
|
|
"eslint-plugin-mocha": "^5.2.1",
|
|
"eslint-plugin-no-extension-in-require": "^0.2.0",
|
|
"eslint-plugin-node": "^8.0.1",
|
|
"eslint-plugin-promise": "^4.0.0",
|
|
"eslint-plugin-react": "^7.12.4",
|
|
"eslint-plugin-standard": "^4.0.0",
|
|
"fetch-ponyfill": "^6.0.0",
|
|
"fs-readfile-promise": "^3.0.1",
|
|
"gatsby": "^2.0.107",
|
|
"gatsby-plugin-catch-links": "^2.0.10",
|
|
"gatsby-plugin-page-creator": "^2.0.6",
|
|
"gatsby-plugin-react-helmet": "^3.0.5",
|
|
"gatsby-plugin-remove-trailing-slashes": "^2.0.7",
|
|
"gatsby-plugin-styled-components": "^3.0.5",
|
|
"gatsby-source-filesystem": "^2.0.19",
|
|
"got": "^9.6.0",
|
|
"humanize-string": "^1.0.2",
|
|
"husky": "^1.3.1",
|
|
"icedfrisby": "2.0.0-alpha.2",
|
|
"icedfrisby-nock": "^1.1.0",
|
|
"is-png": "^1.1.0",
|
|
"is-svg": "^3.0.0",
|
|
"js-yaml-loader": "^1.0.1",
|
|
"lint-staged": "^8.1.3",
|
|
"lodash.debounce": "^4.0.8",
|
|
"lodash.difference": "^4.5.0",
|
|
"lodash.groupby": "^4.6.0",
|
|
"minimist": "^1.2.0",
|
|
"mkdirp": "^0.5.1",
|
|
"mocha": "^5.0.0",
|
|
"mocha-env-reporter": "^3.0.0",
|
|
"mocha-junit-reporter": "^1.18.0",
|
|
"mocha-yaml-loader": "^1.0.3",
|
|
"nock": "11.0.0-beta.6",
|
|
"node-fetch": "^2.3.0",
|
|
"node-mocks-http": "^1.7.3",
|
|
"npm-run-all": "^4.1.5",
|
|
"nyc": "^13.2.0",
|
|
"opn-cli": "^4.0.0",
|
|
"portfinder": "^1.0.20",
|
|
"prettier": "1.16.4",
|
|
"prettier-check": "^2.0.0",
|
|
"pretty": "^2.0.0",
|
|
"prop-types": "^15.6.0",
|
|
"react": "^16.7.0",
|
|
"react-dom": "^16.7.0",
|
|
"react-error-overlay": "^5.1.2",
|
|
"react-helmet": "^5.2.0",
|
|
"react-modal": "^3.8.1",
|
|
"react-pose": "^4.0.6",
|
|
"react-select": "^2.3.0",
|
|
"read-all-stdin-sync": "^1.0.5",
|
|
"redis-server": "^1.2.2",
|
|
"require-hacker": "^3.0.1",
|
|
"rimraf": "^2.6.3",
|
|
"sazerac": "^0.4.2",
|
|
"sinon": "^7.2.3",
|
|
"sinon-chai": "^3.3.0",
|
|
"snap-shot-it": "^6.2.9",
|
|
"styled-components": "^4.1.3",
|
|
"tmp": "0.0.33",
|
|
"url": "^0.11.0",
|
|
"walkdir": "0.0.12"
|
|
},
|
|
"engines": {
|
|
"node": ">= 8",
|
|
"npm": ">= 5"
|
|
},
|
|
"babel": {
|
|
"plugins": [
|
|
[
|
|
"inline-react-svg",
|
|
{
|
|
"svgo": false
|
|
}
|
|
]
|
|
],
|
|
"presets": [
|
|
"babel-preset-gatsby"
|
|
],
|
|
"env": {
|
|
"test": {
|
|
"plugins": [
|
|
"istanbul"
|
|
]
|
|
}
|
|
}
|
|
},
|
|
"collective": {
|
|
"type": "opencollective",
|
|
"url": "https://opencollective.com/shields",
|
|
"logo": "https://opencollective.com/opencollective/logo.txt"
|
|
},
|
|
"husky": {
|
|
"hooks": {
|
|
"pre-commit": "lint-staged"
|
|
}
|
|
}
|
|
}
|