diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4a04d59..40ae03f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -17,32 +17,40 @@ yarn start ## Add new provider -Create `web/src/components/cards/.js` and paste following template into it: +Create `web/src/components/cards/.js`. Here is the example card that checks if spcified repository on GitHub is available. ```jsx import React from 'react' +import { useTranslation } from 'react-i18next' import { FaGithub } from 'react-icons/fa' -import { Card } from '../Card' -import { ExistentialAvailability } from '../Cards' -import { capitalize } from '../../util/text' +import { Card, Repeater, DedicatedAvailability } from '../Cards' + +export default function GithubCard({ name }) { + const { t } = useTranslation() + const lowerCase = name.toLowerCase() + + const names = [name] + const moreNames = [ + `${lowerCase}hq`, + `${lowerCase}-team`, + `${lowerCase}-org`, + `${lowerCase}-js`, + ] -export default function NewCard({ name }) { return ( - - {(name) => ( - } - /> - )} + + + {(name) => ( + } + /> + )} + ) } @@ -55,9 +63,8 @@ import NewCard from './components/cards/NewCard' ``` ```patch - - Result for {query} - + + @@ -69,8 +76,8 @@ import NewCard from './components/cards/NewCard' + - - + + ``` ### ExistentialAvailability diff --git a/api/services/cratesio.js b/api/services/cratesio.js index da5afb5..8aa202e 100644 --- a/api/services/cratesio.js +++ b/api/services/cratesio.js @@ -1,18 +1,18 @@ const { send, sendError, fetch } = require('../util/http') module.exports = async (req, res) => { - const name = req.query.name + const { query } = req.query - if (!name) { + if (!query) { return res.status(400).json({ error: 'no query given' }) } try { const response = await fetch( - `https://crates.io/api/v1/crates/${encodeURIComponent(name)}` + `https://crates.io/api/v1/crates/${encodeURIComponent(query)}` ) const availability = response.status !== 200 - send(res, availability) + send(res, { availability }) } catch (err) { sendError(res, err) } diff --git a/api/services/debian.js b/api/services/debian.js index bfdeb85..fb855ed 100644 --- a/api/services/debian.js +++ b/api/services/debian.js @@ -1,20 +1,20 @@ const { send, sendError, fetch } = require('../util/http') module.exports = async (req, res) => { - const name = req.query.name + const { query } = req.query - if (!name) { + if (!query) { return sendError(res, new Error('no query given')) } try { const response = await fetch( - `https://packages.debian.org/buster/${encodeURIComponent(name)}`, + `https://packages.debian.org/buster/${encodeURIComponent(query)}`, 'GET' ) const body = await response.text() const availability = body.includes('No such package') - send(res, availability) + send(res, { availability }) } catch (err) { sendError(res, err) } diff --git a/api/services/dns.js b/api/services/dns.js index 66fb688..c2c6aa1 100644 --- a/api/services/dns.js +++ b/api/services/dns.js @@ -11,16 +11,16 @@ function resolvePromise(hostname) { } module.exports = async (req, res) => { - const name = req.query.name + const { query } = req.query - if (!name) { + if (!query) { return sendError(res, new Error('no query given')) } try { - const response = await resolvePromise(name) + const response = await resolvePromise(query) const availability = response && response.length > 0 ? false : true - send(res, availability) + send(res, { availability }) } catch (err) { if (err.code === 'ENODATA' || err.code === 'ENOTFOUND') { return res.status(200).json({ availability: true }) diff --git a/api/services/domain.js b/api/services/domain.js index 9f9aeae..bfece3f 100644 --- a/api/services/domain.js +++ b/api/services/domain.js @@ -2,16 +2,16 @@ import whois from 'whois-json' const { send, sendError } = require('../util/http') module.exports = async (req, res) => { - const name = req.query.name + const { query } = req.query - if (!name) { + if (!query) { return sendError(res, new Error('no query given')) } try { - const response = await whois(name, { follow: 3, verbose: true }) + const response = await whois(query, { follow: 3, verbose: true }) const availability = response[0].data.domainName ? false : true - send(res, availability) + send(res, { availability }) } catch (err) { sendError(res, err) } diff --git a/api/services/github.js b/api/services/github.js index 87b168b..75075b9 100644 --- a/api/services/github.js +++ b/api/services/github.js @@ -1,18 +1,18 @@ const { send, sendError, fetch } = require('../util/http') module.exports = async (req, res) => { - const name = req.query.name + const { query } = req.query - if (!name) { + if (!query) { return sendError(res, new Error('no query given')) } try { const response = await fetch( - `https://github.com/${encodeURIComponent(name)}` + `https://github.com/${encodeURIComponent(query)}` ) const availability = response.status !== 200 - send(res, availability) + send(res, { availability }) } catch (err) { sendError(res, err) } diff --git a/api/services/launchpad.js b/api/services/launchpad.js index 64004ec..575f20f 100644 --- a/api/services/launchpad.js +++ b/api/services/launchpad.js @@ -1,21 +1,21 @@ const { send, sendError, fetch } = require('../util/http') module.exports = async (req, res) => { - const name = req.query.name + const { query } = req.query - if (!name) { + if (!query) { return sendError(res, new Error('no query given')) } try { const response = await fetch( `https://api.launchpad.net/devel/ubuntu/+source/${encodeURIComponent( - name + query )}`, 'GET' ) const availability = response.status !== 200 - send(res, availability) + send(res, { availability }) } catch (err) { sendError(res, err) } diff --git a/api/services/npm-org.js b/api/services/npm-org.js index 2ed217d..9e585b7 100644 --- a/api/services/npm-org.js +++ b/api/services/npm-org.js @@ -2,15 +2,15 @@ const npmName = require('npm-name') const { send, sendError } = require('../util/http') module.exports = async (req, res) => { - const name = req.query.name + const { query } = req.query - if (!name) { + if (!query) { return sendError(res, new Error('no query given')) } try { - const availability = await npmName(`@${name}`) - send(res, availability) + const availability = await npmName(`@${query}`) + send(res, { availability }) } catch (err) { sendError(res, err) } diff --git a/api/services/npm.js b/api/services/npm.js index 6422c80..0e92408 100644 --- a/api/services/npm.js +++ b/api/services/npm.js @@ -2,15 +2,15 @@ const npmName = require('npm-name') const { send, sendError } = require('../util/http') module.exports = async (req, res) => { - const name = req.query.name + const { query } = req.query - if (!name) { + if (!query) { return sendError(res, new Error('no query given')) } try { - const availability = await npmName(name) - send(res, availability) + const availability = await npmName(query) + send(res, { availability }) } catch (err) { sendError(res, err) } diff --git a/api/services/pypi.js b/api/services/pypi.js index 18ace52..0ff5c1b 100644 --- a/api/services/pypi.js +++ b/api/services/pypi.js @@ -1,18 +1,18 @@ const { send, sendError, fetch } = require('../util/http') module.exports = async (req, res) => { - const name = req.query.name + const { query } = req.query - if (!name) { + if (!query) { return sendError(res, new Error('no query given')) } try { const response = await fetch( - `https://pypi.org/pypi/${encodeURIComponent(name)}/json` + `https://pypi.org/pypi/${encodeURIComponent(query)}/json` ) const availability = response.status !== 200 - send(res, availability) + send(res, { availability }) } catch (err) { sendError(res, err) } diff --git a/api/services/rubygems.js b/api/services/rubygems.js index d02f805..51cf198 100644 --- a/api/services/rubygems.js +++ b/api/services/rubygems.js @@ -1,18 +1,18 @@ const { send, sendError, fetch } = require('../util/http') module.exports = async (req, res) => { - const name = req.query.name + const { query } = req.query - if (!name) { + if (!query) { return sendError(res, new Error('no query given')) } try { const response = await fetch( - `https://rubygems.org/gems/${encodeURIComponent(name)}` + `https://rubygems.org/gems/${encodeURIComponent(query)}` ) const availability = response.status !== 200 - send(res, availability) + send(res, { availability }) } catch (err) { sendError(res, err) } diff --git a/api/services/s3.js b/api/services/s3.js index 19d7e4e..9510ed2 100644 --- a/api/services/s3.js +++ b/api/services/s3.js @@ -1,18 +1,18 @@ const { send, sendError, fetch } = require('../util/http') module.exports = async (req, res) => { - const name = req.query.name + const { query } = req.query - if (!name) { + if (!query) { return sendError(res, new Error('no query given')) } try { const response = await fetch( - `https://${encodeURIComponent(name)}.s3.amazonaws.com` + `https://${encodeURIComponent(query)}.s3.amazonaws.com` ) const availability = response.status !== 200 - send(res, availability) + send(res, { availability }) } catch (err) { sendError(res, err) } diff --git a/api/services/slack.js b/api/services/slack.js index 8cd1ec2..5f19309 100644 --- a/api/services/slack.js +++ b/api/services/slack.js @@ -1,18 +1,18 @@ const { send, sendError, fetch } = require('../util/http') module.exports = async (req, res) => { - const name = req.query.name + const { query } = req.query - if (!name) { + if (!query) { return sendError(res, new Error('no query given')) } try { const response = await fetch( - `https://${encodeURIComponent(name)}.slack.com` + `https://${encodeURIComponent(query)}.slack.com` ) const availability = response.status !== 200 - send(res, availability) + send(res, { availability }) } catch (err) { if (err.code === 'ENOTFOUND') { send(res, true) diff --git a/api/services/twitter.js b/api/services/twitter.js index eb64052..9704893 100644 --- a/api/services/twitter.js +++ b/api/services/twitter.js @@ -3,18 +3,18 @@ const { send, sendError, fetch } = require('../util/http') async function getAvailability(name) {} module.exports = async (req, res) => { - const name = req.query.name + const { query } = req.query - if (!name) { + if (!query) { return res.status(400).json({ error: 'no query given' }) } try { const response = await fetch( - `https://twitter.com/${encodeURIComponent(name)}` + `https://twitter.com/${encodeURIComponent(query)}` ) const availability = response.status !== 200 - send(res, availability) + send(res, { availability }) } catch (err) { sendError(res, err) } diff --git a/api/util/http.js b/api/util/http.js index c3580a4..24b6da5 100644 --- a/api/util/http.js +++ b/api/util/http.js @@ -4,9 +4,9 @@ exports.fetch = (url, method = 'HEAD') => { return fetch(url, { method }) } -exports.send = (res, availability) => { +exports.send = (res, obj) => { res.setHeader('Cache-Control', 'maxage=0, s-maxage=3600') - res.json({ availability }) + res.json(obj) } exports.sendError = (res, error) => { diff --git a/now.json b/now.json index ab8a719..fb2dc2f 100644 --- a/now.json +++ b/now.json @@ -15,8 +15,8 @@ ], "routes": [ { - "src": "/availability/(?[^/]+)/(?[^/]+)", - "dest": "/api/services/$provider.js?name=$id" + "src": "/availability/(?[^/]+)/(?[^/]+)", + "dest": "/api/services/$provider.js?query=$query" }, { "src": "/(.*)",