diff --git a/api/jest.config.js b/api/jest.config.js index 888a6ed..4719165 100644 --- a/api/jest.config.js +++ b/api/jest.config.js @@ -4,4 +4,4 @@ module.exports = { testEnvironment: 'node', preset: 'ts-jest', testPathIgnorePatterns: ['/dist/'], -} +}; diff --git a/api/services/appstore.ts b/api/services/appstore.ts index d41dc6e..b2f68b1 100644 --- a/api/services/appstore.ts +++ b/api/services/appstore.ts @@ -1,38 +1,38 @@ -import { send, sendError, fetch, NowRequest, NowResponse } from '../util/http' +import {send, sendError, fetch, NowRequest, NowResponse} from '../util/http'; interface App { - trackId: string - trackName: string - kind: string - version: string - price: string - trackViewUrl: string + trackId: string; + trackName: string; + kind: string; + version: string; + price: string; + trackViewUrl: string; } interface AppStoreResponse { - results: App[] + results: App[]; } export default async function handler( - req: NowRequest<{ query: string; country: string }>, - res: NowResponse + req: NowRequest<{query: string; country: string}>, + res: NowResponse, ) { - const { query, country } = req.query + const {query, country} = req.query; if (!query) { - return sendError(res, new Error('no query given')) + return sendError(res, new Error('no query given')); } - const term = encodeURIComponent(query) - const countryCode = country || 'us' - const limit = 10 + const term = encodeURIComponent(query); + const countryCode = country || 'us'; + const limit = 10; try { const response = await fetch( `https://itunes.apple.com/search?media=software&entity=software,iPadSoftware,macSoftware&country=${countryCode}&limit=${limit}&term=${term}`, - 'GET' - ) - const body: AppStoreResponse = await response.json() + 'GET', + ); + const body: AppStoreResponse = await response.json(); const apps = body.results.map((app) => ({ id: app.trackId, name: app.trackName, @@ -40,9 +40,9 @@ export default async function handler( version: app.version, price: app.price, viewURL: app.trackViewUrl, - })) - send(res, { result: apps || [] }) + })); + send(res, {result: apps || []}); } catch (err) { - sendError(res, err) + sendError(res, err); } } diff --git a/api/services/debian.ts b/api/services/debian.ts index b311eb3..fad493e 100644 --- a/api/services/debian.ts +++ b/api/services/debian.ts @@ -1,21 +1,21 @@ -import { send, sendError, fetch, NowRequest, NowResponse } from '../util/http' +import {send, sendError, fetch, NowRequest, NowResponse} from '../util/http'; export default async function handler(req: NowRequest, res: NowResponse) { - const { query } = req.query + const {query} = req.query; if (!query) { - return sendError(res, new Error('no query given')) + return sendError(res, new Error('no query given')); } try { const response = await fetch( `https://packages.debian.org/buster/${encodeURIComponent(query)}`, - 'GET' - ) - const body = await response.text() - const availability = body.includes('No such package') - send(res, { availability }) + 'GET', + ); + const body = await response.text(); + const availability = body.includes('No such package'); + send(res, {availability}); } catch (err) { - sendError(res, err) + sendError(res, err); } } diff --git a/api/services/dns.ts b/api/services/dns.ts index 0f9b2a4..f26e730 100644 --- a/api/services/dns.ts +++ b/api/services/dns.ts @@ -1,30 +1,30 @@ -import dns from 'dns' -import { send, sendError, NowRequest, NowResponse } from '../util/http' +import dns from 'dns'; +import {send, sendError, NowRequest, NowResponse} from '../util/http'; function resolvePromise(hostname: string): Promise { return new Promise((resolve, reject) => { dns.resolve4(hostname, function(err, addresses) { - if (err) return reject(err) - resolve(addresses) - }) - }) + if (err) return reject(err); + resolve(addresses); + }); + }); } export default async function handler(req: NowRequest, res: NowResponse) { - const { query } = req.query + const {query} = req.query; if (!query) { - return sendError(res, new Error('no query given')) + return sendError(res, new Error('no query given')); } try { - const response = await resolvePromise(query) - const availability = response && response.length > 0 ? false : true - send(res, { availability }) + const response = await resolvePromise(query); + const availability = response && response.length > 0 ? false : true; + send(res, {availability}); } catch (err) { if (err.code === 'ENODATA' || err.code === 'ENOTFOUND') { - return res.status(200).json({ availability: true }) + return res.status(200).json({availability: true}); } - sendError(res, err) + sendError(res, err); } } diff --git a/api/services/domain.ts b/api/services/domain.ts index 9e9d6ed..694131a 100644 --- a/api/services/domain.ts +++ b/api/services/domain.ts @@ -1,18 +1,18 @@ -import whois from 'whois-json' -import { send, sendError, NowRequest, NowResponse } from '../util/http' +import whois from 'whois-json'; +import {send, sendError, NowRequest, NowResponse} from '../util/http'; export default async function handler(req: NowRequest, res: NowResponse) { - const { query } = req.query + const {query} = req.query; if (!query) { - return sendError(res, new Error('no query given')) + return sendError(res, new Error('no query given')); } try { - const response = await whois(query, { follow: 3, verbose: true }) - const availability = response[0].data.domainName ? false : true - send(res, { availability }) + const response = await whois(query, {follow: 3, verbose: true}); + const availability = response[0].data.domainName ? false : true; + send(res, {availability}); } catch (err) { - sendError(res, err) + sendError(res, err); } } diff --git a/api/services/existence.ts b/api/services/existence.ts index e88b855..35bc8df 100644 --- a/api/services/existence.ts +++ b/api/services/existence.ts @@ -1,25 +1,25 @@ -import { send, sendError, fetch, NowRequest, NowResponse } from '../util/http' +import {send, sendError, fetch, NowRequest, NowResponse} from '../util/http'; export default async function handler(req: NowRequest, res: NowResponse) { - const { query } = req.query + const {query} = req.query; if (!query) { - return sendError(res, new Error('no query given')) + return sendError(res, new Error('no query given')); } if ( !/^[(http(s)?):\/\/(www\.)?a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)$/.test( - query + query, ) ) { - return sendError(res, new Error('invalid characters')) + return sendError(res, new Error('invalid characters')); } try { - const response = await fetch(`https://${query}`) - const availability = response.status === 404 - send(res, { availability }) + const response = await fetch(`https://${query}`); + const availability = response.status === 404; + send(res, {availability}); } catch (err) { - sendError(res, err) + sendError(res, err); } } diff --git a/api/services/existense.test.ts b/api/services/existense.test.ts index 2a852dc..fc2a396 100644 --- a/api/services/existense.test.ts +++ b/api/services/existense.test.ts @@ -1,22 +1,22 @@ -import nock from 'nock' -import { mockProvider } from '../util/testHelpers' +import nock from 'nock'; +import {mockProvider} from '../util/testHelpers'; -import provider from './existence' +import provider from './existence'; test('return false if name is taken', async () => { - const result = await mockProvider(provider, { query: 'github.com/uetchy' }) - expect(result).toStrictEqual({ availability: false }) -}) + const result = await mockProvider(provider, {query: 'github.com/uetchy'}); + expect(result).toStrictEqual({availability: false}); +}); test('return true if name is not taken', async () => { const result = await mockProvider(provider, { query: 'github.com/uetchyasdf', - }) - expect(result).toStrictEqual({ availability: true }) -}) + }); + expect(result).toStrictEqual({availability: true}); +}); beforeEach(() => { - nock('https://github.com:443', { encodedQueryParams: true }) + nock('https://github.com:443', {encodedQueryParams: true}) .head('/uetchyasdf') .reply(404, [], { Date: 'Wed, 14 Aug 2019 10:52:54 GMT', @@ -45,8 +45,8 @@ beforeEach(() => { "default-src 'none'; base-uri 'self'; connect-src 'self'; form-action 'self'; img-src 'self' data:; script-src,'self'; style-src 'unsafe-inline'", 'Content-Encoding': 'gzip', 'X-GitHub-Request-Id': 'BA06:51D6:125A0F:1A9B4A:5D53E806', - }) - nock('https://github.com:443', { encodedQueryParams: true }) + }); + nock('https://github.com:443', {encodedQueryParams: true}) .head('/uetchy') .reply(200, [], { Date: 'Wed, 14 Aug 2019 10:43:09 GMT', @@ -77,5 +77,5 @@ beforeEach(() => { "default-src 'none'; base-uri 'self'; block-all-mixed-content; connect-src 'self' uploads.github.com www.githubstatus.com collector.githubapp.com api.github.com www.google-analytics.com github-cloud.s3.amazonaws.com github-production-repository-file-5c1aeb.s3.amazonaws.com github-production-upload-manifest-file-7fdce7.s3.amazonaws.com github-production-user-asset-6210df.s3.amazonaws.com wss://live.github.com; font-src github.githubassets.com; form-action 'self' github.com gist.github.com; frame-ancestors 'none'; frame-src render.githubusercontent.com; img-src 'self' data: github.githubassets.com identicons.github.com collector.githubapp.com github-cloud.s3.amazonaws.com *.githubusercontent.com; manifest-src 'self'; media-src 'none'; script-src github.githubassets.com; style-src 'unsafe-inline' github.githubassets.com", 'Content-Encoding': 'gzip', 'X-GitHub-Request-Id': 'A922:19B1:AD411:FB69F:5D53E5BC', - }) -}) + }); +}); diff --git a/api/services/launchpad.ts b/api/services/launchpad.ts index 998b361..f7c7a8f 100644 --- a/api/services/launchpad.ts +++ b/api/services/launchpad.ts @@ -1,22 +1,22 @@ -import { send, sendError, fetch, NowRequest, NowResponse } from '../util/http' +import {send, sendError, fetch, NowRequest, NowResponse} from '../util/http'; export default async function handler(req: NowRequest, res: NowResponse) { - const { query } = req.query + const {query} = req.query; if (!query) { - return sendError(res, new Error('no query given')) + return sendError(res, new Error('no query given')); } try { const response = await fetch( `https://api.launchpad.net/devel/ubuntu/+source/${encodeURIComponent( - query + query, )}`, - 'GET' - ) - const availability = response.status !== 200 - send(res, { availability }) + 'GET', + ); + const availability = response.status !== 200; + send(res, {availability}); } catch (err) { - sendError(res, err) + sendError(res, err); } } diff --git a/api/services/npm-org.ts b/api/services/npm-org.ts index fc0755f..8d32ce7 100644 --- a/api/services/npm-org.ts +++ b/api/services/npm-org.ts @@ -1,17 +1,17 @@ -import npmName from 'npm-name' -import { send, sendError, fetch, NowRequest, NowResponse } from '../util/http' +import npmName from 'npm-name'; +import {send, sendError, fetch, NowRequest, NowResponse} from '../util/http'; export default async function handler(req: NowRequest, res: NowResponse) { - const { query } = req.query + const {query} = req.query; if (!query) { - return sendError(res, new Error('no query given')) + return sendError(res, new Error('no query given')); } try { - const availability = await npmName(`@${query}`) - send(res, { availability }) + const availability = await npmName(`@${query}`); + send(res, {availability}); } catch (err) { - sendError(res, err) + sendError(res, err); } } diff --git a/api/services/npm.ts b/api/services/npm.ts index 4620ad4..f88ce5d 100644 --- a/api/services/npm.ts +++ b/api/services/npm.ts @@ -1,17 +1,17 @@ -import npmName from 'npm-name' -import { send, sendError, NowRequest, NowResponse } from '../util/http' +import npmName from 'npm-name'; +import {send, sendError, NowRequest, NowResponse} from '../util/http'; export default async function handler(req: NowRequest, res: NowResponse) { - const { query } = req.query + const {query} = req.query; if (!query) { - return sendError(res, new Error('no query given')) + return sendError(res, new Error('no query given')); } try { - const availability = await npmName(query) - send(res, { availability }) + const availability = await npmName(query); + send(res, {availability}); } catch (err) { - sendError(res, err) + sendError(res, err); } } diff --git a/api/services/nta.ts b/api/services/nta.ts index 36c7884..46cd5e5 100644 --- a/api/services/nta.ts +++ b/api/services/nta.ts @@ -1,39 +1,39 @@ -import { send, sendError, fetch, NowRequest, NowResponse } from '../util/http' +import {send, sendError, fetch, NowRequest, NowResponse} from '../util/http'; -const APPLICATION_ID = process.env.NTA_APPLICATION_ID +const APPLICATION_ID = process.env.NTA_APPLICATION_ID; export default async function handler( - req: NowRequest<{ query: string; country: string }>, - res: NowResponse + req: NowRequest<{query: string; country: string}>, + res: NowResponse, ) { - const { query } = req.query + const {query} = req.query; if (!query) { - return sendError(res, new Error('no query given')) + return sendError(res, new Error('no query given')); } const encodedQuery = encodeURIComponent( query.replace(/[A-Za-z0-9]/g, (str) => - String.fromCharCode(str.charCodeAt(0) + 0xfee0) - ) - ) + String.fromCharCode(str.charCodeAt(0) + 0xfee0), + ), + ); try { const response = await fetch( `https://api.houjin-bangou.nta.go.jp/4/name?id=${APPLICATION_ID}&name=${encodedQuery}&mode=1&target=1&type=02`, - 'GET' - ) - const body: string[] = (await response.text()).split('\n').slice(0, -1) - const header = body.shift()!.split(',') + 'GET', + ); + const body: string[] = (await response.text()).split('\n').slice(0, -1); + const header = body.shift()!.split(','); const result = body.map((csv) => { const entry = csv.split(',').map((item) => item .replace(/(^"|"$)/g, '') .replace(/[A-Za-z0-9]/g, (str) => - String.fromCharCode(str.charCodeAt(0) - 0xfee0) + String.fromCharCode(str.charCodeAt(0) - 0xfee0), ) - .replace(/ /g, ' ') - ) + .replace(/ /g, ' '), + ); return { index: entry[0], @@ -70,8 +70,8 @@ export default async function handler( excluded: entry[29], processSection: entry[2], modifiedSection: entry[3], - } - }) + }; + }); send(res, { meta: { @@ -88,8 +88,8 @@ export default async function handler( englishName: entry.englishName, })) .slice(10) || [], - }) + }); } catch (err) { - sendError(res, err) + sendError(res, err); } } diff --git a/api/services/slack.ts b/api/services/slack.ts index ec62e0a..a6de408 100644 --- a/api/services/slack.ts +++ b/api/services/slack.ts @@ -1,23 +1,23 @@ -import { send, sendError, fetch, NowRequest, NowResponse } from '../util/http' +import {send, sendError, fetch, NowRequest, NowResponse} from '../util/http'; export default async function handler(req: NowRequest, res: NowResponse) { - const { query } = req.query + const {query} = req.query; if (!query) { - return sendError(res, new Error('no query given')) + return sendError(res, new Error('no query given')); } try { const response = await fetch( - `https://${encodeURIComponent(query)}.slack.com` - ) - const availability = response.status !== 200 - send(res, { availability }) + `https://${encodeURIComponent(query)}.slack.com`, + ); + const availability = response.status !== 200; + send(res, {availability}); } catch (err) { if (err.code === 'ENOTFOUND') { - send(res, { availability: true }) + send(res, {availability: true}); } else { - sendError(res, err) + sendError(res, err); } } } diff --git a/api/services/spectrum.ts b/api/services/spectrum.ts index e09155e..c275e05 100644 --- a/api/services/spectrum.ts +++ b/api/services/spectrum.ts @@ -1,23 +1,23 @@ -import { send, sendError, fetch, NowResponse, NowRequest } from '../util/http' +import {send, sendError, fetch, NowResponse, NowRequest} from '../util/http'; export default async function handler(req: NowRequest, res: NowResponse) { - const { query } = req.query + const {query} = req.query; if (!query) { - return sendError(res, new Error('no query given')) + return sendError(res, new Error('no query given')); } try { const response = await fetch( `https://spectrum.chat/${encodeURIComponent(query)}`, - 'GET' - ) - const body = await response.text() + 'GET', + ); + const body = await response.text(); const availability = body.includes( - 'You may be trying to view something that is deleted' - ) - send(res, { availability }) + 'You may be trying to view something that is deleted', + ); + send(res, {availability}); } catch (err) { - sendError(res, err) + sendError(res, err); } } diff --git a/api/setupJest.ts b/api/setupJest.ts index beeb46f..7165078 100644 --- a/api/setupJest.ts +++ b/api/setupJest.ts @@ -1,5 +1,5 @@ -import nock from 'nock' +import nock from 'nock'; -nock.disableNetConnect() +nock.disableNetConnect(); // nock.recorder.rec() diff --git a/api/types/whois-json.d.ts b/api/types/whois-json.d.ts index 82165e1..9b8aa6f 100644 --- a/api/types/whois-json.d.ts +++ b/api/types/whois-json.d.ts @@ -1 +1 @@ -declare module 'whois-json' +declare module 'whois-json'; diff --git a/api/util/testHelpers.ts b/api/util/testHelpers.ts index 8fe9b0c..1219a66 100644 --- a/api/util/testHelpers.ts +++ b/api/util/testHelpers.ts @@ -1,13 +1,13 @@ export async function mockProvider(provider: any, query: any) { const req = { query, - } + }; const res = { status: jest.fn().mockReturnThis(), send: jest.fn().mockReturnThis(), json: jest.fn().mockReturnThis(), setHeader: jest.fn(), - } - await provider(req, res) - return res.json.mock.calls[0][0] + }; + await provider(req, res); + return res.json.mock.calls[0][0]; } diff --git a/package.json b/package.json index c822a37..6395d43 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "test": "CI=true yarn --cwd web test && yarn --cwd api test" }, "dependencies": { - "now": "^16.1.2" + "now": "^16.2.0" }, "devDependencies": { "prettier": "^1.18.2" diff --git a/web/src/App.test.tsx b/web/src/App.test.tsx index 5aa01be..ecf2761 100644 --- a/web/src/App.test.tsx +++ b/web/src/App.test.tsx @@ -1,14 +1,14 @@ -import React, { Suspense } from 'react' -import { render, waitForElement } from '@testing-library/react' +import React, {Suspense} from 'react'; +import {render, waitForElement} from '@testing-library/react'; -import App from './App' +import App from './App'; it('renders welcome message', async () => { - const { getByText } = render( + const {getByText} = render( loading}> - - ) - const text = await waitForElement(() => getByText('name new project')) - expect(text).toBeTruthy() -}) + , + ); + const text = await waitForElement(() => getByText('name new project')); + expect(text).toBeTruthy(); +}); diff --git a/web/src/App.tsx b/web/src/App.tsx index cafcc05..b1b5d98 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -1,22 +1,22 @@ -import React, { useState } from 'react' -import styled, { createGlobalStyle } from 'styled-components' -import { Helmet } from 'react-helmet' -import { useTranslation } from 'react-i18next' +import React, {useState} from 'react'; +import styled, {createGlobalStyle} from 'styled-components'; +import {Helmet} from 'react-helmet'; +import {useTranslation} from 'react-i18next'; -import Welcome from './components/Welcome' -import Form from './components/Form' -import Cards from './components/cards' -import Footer from './components/Footer' +import Welcome from './components/Welcome'; +import Form from './components/Form'; +import Cards from './components/cards'; +import Footer from './components/Footer'; -import { mobile } from './util/css' -import { isStandalone } from './util/pwa' +import {mobile} from './util/css'; +import {isStandalone} from './util/pwa'; export default function App() { - const [query, setQuery] = useState('') - const { t } = useTranslation() + const [query, setQuery] = useState(''); + const {t} = useTranslation(); function onQuery(query: string) { - setQuery(query) + setQuery(query); } return ( @@ -37,7 +37,7 @@ export default function App() {