diff --git a/api/services/gitlab.ts b/api/services/gitlab.ts
new file mode 100644
index 0000000..34749a3
--- /dev/null
+++ b/api/services/gitlab.ts
@@ -0,0 +1,26 @@
+import {send, sendError, fetch, NowRequest, NowResponse} from '../util/http';
+import nodeFetch from 'node-fetch'
+
+export default async function handler(req: NowRequest, res: NowResponse) {
+ const {query} = req.query;
+
+ if (!query) {
+ return sendError(res, new Error('no query given'));
+ }
+
+ if (
+ /[^\w-]/.test(
+ query,
+ )
+ ) {
+ return sendError(res, new Error('invalid characters'));
+ }
+
+ try {
+ const response = await nodeFetch(`https://gitlab.com/${query}`, {redirect: 'manual'});
+ const availability = response.status === 302;
+ send(res, {availability});
+ } catch (err) {
+ sendError(res, err);
+ }
+}
diff --git a/web/public/locales/en/translation.json b/web/public/locales/en/translation.json
index 9a9c416..3f73e05 100644
--- a/web/public/locales/en/translation.json
+++ b/web/public/locales/en/translation.json
@@ -5,6 +5,7 @@
"providers": {
"domains": "Domains",
"github": "Github Organization",
+ "gitlab": "GitLab",
"npm": "npm",
"pypi": "PyPI",
"rubygems": "RubyGems",
@@ -21,6 +22,7 @@
"spectrum": "Spectrum",
"heroku": "Heroku",
"now": "ZEIT Now",
+ "netlify": "Netlify",
"nta": "Company (JP)"
},
"countryCode": "us",
diff --git a/web/public/locales/ja/translation.json b/web/public/locales/ja/translation.json
index 96c5c03..a38c96c 100644
--- a/web/public/locales/ja/translation.json
+++ b/web/public/locales/ja/translation.json
@@ -5,6 +5,7 @@
"providers": {
"domains": "ドメイン",
"github": "Github Organization",
+ "gitlab": "GitLab",
"npm": "npm",
"pypi": "PyPI",
"rubygems": "RubyGems",
@@ -21,6 +22,7 @@
"spectrum": "Spectrum",
"heroku": "Heroku",
"now": "ZEIT Now",
+ "netlify": "Netlify",
"nta": "法人"
},
"countryCode": "jp",
diff --git a/web/src/components/Icons.tsx b/web/src/components/Icons.tsx
index 4410318..9c1d36b 100644
--- a/web/src/components/Icons.tsx
+++ b/web/src/components/Icons.tsx
@@ -27,3 +27,19 @@ export const NowIcon = () => (
);
+
+export const NetlifyIcon = () => (
+
+);
diff --git a/web/src/components/Welcome.tsx b/web/src/components/Welcome.tsx
index ee46942..6f7a31e 100644
--- a/web/src/components/Welcome.tsx
+++ b/web/src/components/Welcome.tsx
@@ -5,6 +5,7 @@ import {useTranslation} from 'react-i18next';
import {
FaMapSigns,
FaGithub,
+ FaGitlab,
FaNpm,
FaPython,
FaGem,
@@ -19,7 +20,7 @@ import {
import {IoIosBeer} from 'react-icons/io';
import {DiRust, DiHeroku} from 'react-icons/di';
-import {SpectrumIcon, NowIcon} from './Icons';
+import {SpectrumIcon, NowIcon, NetlifyIcon} from './Icons';
import {mobile} from '../util/css';
export default function Welcome() {
@@ -38,6 +39,9 @@ export default function Welcome() {
{t('providers.github')}
+
+ {t('providers.gitlab')}
+
{t('providers.npm')}
@@ -71,6 +75,9 @@ export default function Welcome() {
{t('providers.now')}
+
+ {t('providers.netlify')}
+
{t('providers.s3')}
diff --git a/web/src/components/cards/GitLab.tsx b/web/src/components/cards/GitLab.tsx
new file mode 100644
index 0000000..e685a9c
--- /dev/null
+++ b/web/src/components/cards/GitLab.tsx
@@ -0,0 +1,31 @@
+import React from 'react';
+import {useTranslation} from 'react-i18next';
+import {FaGitlab} from 'react-icons/fa';
+
+import {Card, Repeater, DedicatedAvailability} from './core';
+
+const GitLabCard: React.FC<{query: string}> = ({query}) => {
+ const {t} = useTranslation();
+ const lowerCase = query.toLowerCase();
+
+ const names = [lowerCase];
+
+ return (
+
+
+ {(name) => (
+ }
+ />
+ )}
+
+
+ );
+};
+
+export default GitLabCard;
diff --git a/web/src/components/cards/Netlify.tsx b/web/src/components/cards/Netlify.tsx
new file mode 100644
index 0000000..870538c
--- /dev/null
+++ b/web/src/components/cards/Netlify.tsx
@@ -0,0 +1,30 @@
+import React from 'react';
+import {useTranslation} from 'react-i18next';
+import {NetlifyIcon} from '../Icons';
+
+import {Card, Repeater, DedicatedAvailability} from './core';
+
+const NetlifyCard: React.FC<{query: string}> = ({query}) => {
+ const {t} = useTranslation();
+ const lowerCase = query.toLowerCase();
+
+ const names = [lowerCase];
+
+ return (
+
+
+ {(name) => (
+ }
+ />
+ )}
+
+
+ );
+};
+
+export default NetlifyCard;
diff --git a/web/src/components/cards/Now.tsx b/web/src/components/cards/Now.tsx
index b046474..08e06cc 100644
--- a/web/src/components/cards/Now.tsx
+++ b/web/src/components/cards/Now.tsx
@@ -17,7 +17,7 @@ const NowCard: React.FC<{query: string}> = ({query}) => {
}
/>
diff --git a/web/src/components/cards/index.tsx b/web/src/components/cards/index.tsx
index c497944..37b7068 100644
--- a/web/src/components/cards/index.tsx
+++ b/web/src/components/cards/index.tsx
@@ -5,6 +5,7 @@ import {useTranslation} from 'react-i18next';
import {mobile} from '../../util/css';
import DomainCard from './Domains';
import GithubCard from './GitHubRepository';
+import GitLabCard from './GitLab';
import NpmCard from './Npm';
import PypiCard from './PyPI';
import RubyGemsCard from './RubyGems';
@@ -21,6 +22,7 @@ import AppStoreCard from './AppStore';
import HerokuCard from './Heroku';
import NowCard from './Now';
import NtaCard from './Nta';
+import NetlifyCard from './Netlify';
const Index: React.FC<{query: string}> = ({query}) => {
const {
@@ -32,6 +34,7 @@ const Index: React.FC<{query: string}> = ({query}) => {
+
@@ -43,6 +46,7 @@ const Index: React.FC<{query: string}> = ({query}) => {
+
diff --git a/web/src/util/i18n.ts b/web/src/util/i18n.ts
index 2d49806..d1fe077 100644
--- a/web/src/util/i18n.ts
+++ b/web/src/util/i18n.ts
@@ -14,7 +14,7 @@ i18n
backends: [LocalStorageBackend, XHR],
backendOptions: [
{
- versions: {en: '1.5', ja: '1.5'},
+ versions: {en: '1.6', ja: '1.6'},
},
],
},