chore(website): enable eslint in website (#5889)

* chore: enable eslint in website

* Fixes

* prettier users
This commit is contained in:
Joshua Chen 2021-11-06 19:04:45 +08:00 committed by GitHub
parent 0aba31de7b
commit e0127c66be
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
29 changed files with 272 additions and 163 deletions

View file

@ -6,7 +6,6 @@ build
coverage coverage
jest.config.js jest.config.js
jest.transform.js jest.transform.js
website/
scripts scripts
examples/ examples/

View file

@ -49,7 +49,16 @@ module.exports = {
// Ignore certain webpack alias because it can't be resolved // Ignore certain webpack alias because it can't be resolved
'import/no-unresolved': [ 'import/no-unresolved': [
ERROR, ERROR,
{ignore: ['^@theme', '^@docusaurus', '^@generated', 'unist', 'mdast']}, {
ignore: [
'^@theme',
'^@docusaurus',
'^@generated',
'^@site',
'unist',
'mdast',
],
},
], ],
'import/extensions': OFF, 'import/extensions': OFF,
'header/header': [ 'header/header': [

View file

@ -1,9 +1,16 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
import React from 'react'; import React from 'react';
import Layout from '@theme/Layout'; import Layout from '@theme/Layout';
import ErrorBoundaryTestButton from '@site/src/components/ErrorBoundaryTestButton'; import ErrorBoundaryTestButton from '@site/src/components/ErrorBoundaryTestButton';
export default function ErrorBoundaryTests() { export default function ErrorBoundaryTests(): JSX.Element {
return ( return (
<> <>
<ErrorBoundaryTestButton>Crash outside layout</ErrorBoundaryTestButton> <ErrorBoundaryTestButton>Crash outside layout</ErrorBoundaryTestButton>

View file

@ -1,3 +1,10 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
import React from 'react'; import React from 'react';
import Layout from '@theme/Layout'; import Layout from '@theme/Layout';
@ -6,15 +13,18 @@ function BuggyText() {
return ( return (
<span> <span>
Built using the{' '} Built using the{' '}
<a href="https://www.electronjs.org/" target="_blank"> <a href="https://www.electronjs.org/" target="_blank" rel="noreferrer">
Electron Electron
</a>{' '} </a>{' '}
, based on{' '} , based on{' '}
<a href="https://www.chromium.org/" target="_blank"> <a href="https://www.chromium.org/" target="_blank" rel="noreferrer">
Chromium Chromium
</a> </a>
, and written using{' '} , and written using{' '}
<a href="https://www.typescriptlang.org/" target="_blank"> <a
href="https://www.typescriptlang.org/"
target="_blank"
rel="noreferrer">
TypeScript TypeScript
</a>{' '} </a>{' '}
, Xplorer promises you an unprecedented experience. , Xplorer promises you an unprecedented experience.
@ -22,7 +32,7 @@ function BuggyText() {
); );
} }
export default function Home() { export default function Home(): JSX.Element {
return ( return (
<Layout> <Layout>
<BuggyText /> <BuggyText />

View file

@ -7,7 +7,8 @@
import ExecutionEnvironment from '@docusaurus/ExecutionEnvironment'; import ExecutionEnvironment from '@docusaurus/ExecutionEnvironment';
export function onRouteUpdate({location}: {location: Location}) { // eslint-disable-next-line @typescript-eslint/no-unused-vars
export function onRouteUpdate({location}: {location: Location}): void {
// console.log('onRouteUpdate', {location}); // console.log('onRouteUpdate', {location});
} }

View file

@ -1,4 +1,4 @@
/* /**
* Copyright (c) Facebook, Inc. and its affiliates. * Copyright (c) Facebook, Inc. and its affiliates.
* *
* This source code is licensed under the MIT license found in the * This source code is licensed under the MIT license found in the
@ -64,7 +64,6 @@ module.exports = {
}; };
function generateHugeSidebarItems() { function generateHugeSidebarItems() {
const maxLevel = 4;
const linksCount = 8; const linksCount = 8;
const categoriesCount = 8; const categoriesCount = 8;
@ -88,5 +87,5 @@ function generateHugeSidebarItems() {
return [...linkItems, ...categoryItems]; return [...linkItems, ...categoryItems];
} }
return generateRecursive(maxLevel); return generateRecursive(4);
} }

View file

@ -1,3 +1,10 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
const fs = require('fs'); const fs = require('fs');
/** @type {import('@docusaurus/types').PluginConfig[]} */ /** @type {import('@docusaurus/types').PluginConfig[]} */

View file

@ -3,8 +3,6 @@
* *
* This source code is licensed under the MIT license found in the * This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*
* @format
*/ */
module.exports = { module.exports = {

View file

@ -11,11 +11,16 @@ const versions = require('./versions.json');
const math = require('remark-math'); const math = require('remark-math');
const katex = require('rehype-katex'); const katex = require('rehype-katex');
const VersionsArchived = require('./versionsArchived.json'); const VersionsArchived = require('./versionsArchived.json');
const ArchivedVersionsDropdownItems = Object.entries(VersionsArchived).splice(
0,
5,
);
const {dogfoodingPluginInstances} = require('./_dogfooding/dogfooding.config'); const {dogfoodingPluginInstances} = require('./_dogfooding/dogfooding.config');
const FeatureRequestsPlugin = require('./src/featureRequests/FeatureRequestsPlugin');
const npm2yarn = require('@docusaurus/remark-plugin-npm2yarn');
// eslint-disable-next-line import/no-extraneous-dependencies
const lightTheme = require('prism-react-renderer/themes/github');
// eslint-disable-next-line import/no-extraneous-dependencies
const darkTheme = require('prism-react-renderer/themes/dracula');
const ArchivedVersionsDropdownItems =
Object.entries(VersionsArchived).splice(0, 5);
// This probably only makes sense for the beta phase, temporary // This probably only makes sense for the beta phase, temporary
function getNextBetaVersionName() { function getNextBetaVersionName() {
@ -80,6 +85,7 @@ const config = {
], ],
i18n: { i18n: {
defaultLocale: 'en', defaultLocale: 'en',
// eslint-disable-next-line no-nested-ternary
locales: isDeployPreview locales: isDeployPreview
? // Deploy preview: keep it fast! ? // Deploy preview: keep it fast!
['en'] ['en']
@ -109,7 +115,7 @@ const config = {
clientModules: [require.resolve('./_dogfooding/clientModuleExample.ts')], clientModules: [require.resolve('./_dogfooding/clientModuleExample.ts')],
themes: ['@docusaurus/theme-live-codeblock'], themes: ['@docusaurus/theme-live-codeblock'],
plugins: [ plugins: [
require('./src/featureRequests/FeatureRequestsPlugin'), FeatureRequestsPlugin,
[ [
'@docusaurus/plugin-content-docs', '@docusaurus/plugin-content-docs',
/** @type {import('@docusaurus/plugin-content-docs').Options} */ /** @type {import('@docusaurus/plugin-content-docs').Options} */
@ -134,12 +140,13 @@ const config = {
/** @type {import('@docusaurus/plugin-client-redirects').Options} */ /** @type {import('@docusaurus/plugin-client-redirects').Options} */
({ ({
fromExtensions: ['html'], fromExtensions: ['html'],
createRedirects: function (path) { createRedirects(routePath) {
// redirect to /docs from /docs/introduction, // redirect to /docs from /docs/introduction,
// as introduction has been made the home doc // as introduction has been made the home doc
if (allDocHomesPaths.includes(path)) { if (allDocHomesPaths.includes(routePath)) {
return [`${path}/introduction`]; return [`${routePath}/introduction`];
} }
return [];
}, },
redirects: [ redirects: [
{ {
@ -254,11 +261,12 @@ const config = {
showLastUpdateTime: true, showLastUpdateTime: true,
remarkPlugins: [ remarkPlugins: [
math, math,
[require('@docusaurus/remark-plugin-npm2yarn'), {sync: true}], [npm2yarn, {sync: true}],
], ],
rehypePlugins: [katex], rehypePlugins: [katex],
disableVersioning: isVersioningDisabled, disableVersioning: isVersioningDisabled,
lastVersion: isDev ? 'current' : undefined, lastVersion: isDev ? 'current' : undefined,
// eslint-disable-next-line no-nested-ternary
onlyIncludeVersions: isBuildFast onlyIncludeVersions: isBuildFast
? ['current'] ? ['current']
: !isVersioningDisabled && (isDev || isDeployPreview) : !isVersioningDisabled && (isDev || isDeployPreview)
@ -288,7 +296,7 @@ const config = {
blogSidebarTitle: 'All our posts', blogSidebarTitle: 'All our posts',
}, },
pages: { pages: {
remarkPlugins: [require('@docusaurus/remark-plugin-npm2yarn')], remarkPlugins: [npm2yarn],
}, },
theme: { theme: {
customCss: [require.resolve('./src/css/custom.css')], customCss: [require.resolve('./src/css/custom.css')],
@ -314,8 +322,8 @@ const config = {
content: `⭐️ If you like Docusaurus, give it a star on <a target="_blank" rel="noopener noreferrer" href="https://github.com/facebook/docusaurus">GitHub</a> and follow us on <a target="_blank" rel="noopener noreferrer" href="https://twitter.com/docusaurus" >Twitter</a> ${TwitterSvg}`, content: `⭐️ If you like Docusaurus, give it a star on <a target="_blank" rel="noopener noreferrer" href="https://github.com/facebook/docusaurus">GitHub</a> and follow us on <a target="_blank" rel="noopener noreferrer" href="https://twitter.com/docusaurus" >Twitter</a> ${TwitterSvg}`,
}, },
prism: { prism: {
theme: require('prism-react-renderer/themes/github'), theme: lightTheme,
darkTheme: require('prism-react-renderer/themes/dracula'), darkTheme,
additionalLanguages: ['java'], additionalLanguages: ['java'],
}, },
image: 'img/docusaurus-soc.png', image: 'img/docusaurus-soc.png',

View file

@ -38,6 +38,7 @@
"@docusaurus/preset-classic": "2.0.0-beta.9", "@docusaurus/preset-classic": "2.0.0-beta.9",
"@docusaurus/remark-plugin-npm2yarn": "2.0.0-beta.9", "@docusaurus/remark-plugin-npm2yarn": "2.0.0-beta.9",
"@docusaurus/theme-live-codeblock": "2.0.0-beta.9", "@docusaurus/theme-live-codeblock": "2.0.0-beta.9",
"@docusaurus/utils": "2.0.0-beta.9",
"clsx": "^1.1.1", "clsx": "^1.1.1",
"color": "^4.0.1", "color": "^4.0.1",
"esbuild-loader": "2.13.1", "esbuild-loader": "2.13.1",

View file

@ -1,4 +1,4 @@
/* /**
* Copyright (c) Facebook, Inc. and its affiliates. * Copyright (c) Facebook, Inc. and its affiliates.
* *
* This source code is licensed under the MIT license found in the * This source code is licensed under the MIT license found in the

View file

@ -1,4 +1,4 @@
/* /**
* Copyright (c) Facebook, Inc. and its affiliates. * Copyright (c) Facebook, Inc. and its affiliates.
* *
* This source code is licensed under the MIT license found in the * This source code is licensed under the MIT license found in the

View file

@ -15,7 +15,7 @@ interface Props {
url: string; url: string;
} }
function BrowserWindow({children, minHeight, url}: Props) { function BrowserWindow({children, minHeight, url}: Props): JSX.Element {
return ( return (
<div className={styles.browserWindow} style={{minHeight}}> <div className={styles.browserWindow} style={{minHeight}}>
<div className={styles.browserWindowHeader}> <div className={styles.browserWindowHeader}>

View file

@ -66,10 +66,10 @@ const COLOR_SHADES: Record<
const DEFAULT_PRIMARY_COLOR = '3578e5'; const DEFAULT_PRIMARY_COLOR = '3578e5';
function ColorGenerator() { function ColorGenerator(): JSX.Element {
const [baseColor, setBaseColor] = useState(DEFAULT_PRIMARY_COLOR); const [baseColor, setBaseColor] = useState(DEFAULT_PRIMARY_COLOR);
const [shades, setShades] = useState(COLOR_SHADES); const [shades, setShades] = useState(COLOR_SHADES);
const color = Color('#' + baseColor); const color = Color(`#${baseColor}`);
const adjustedColors = Object.keys(shades) const adjustedColors = Object.keys(shades)
.map((shade) => ({ .map((shade) => ({
...shades[shade], ...shades[shade],
@ -83,6 +83,7 @@ function ColorGenerator() {
return ( return (
<div> <div>
<p> <p>
{/* eslint-disable-next-line jsx-a11y/label-has-associated-control */}
<label htmlFor="primary_color"> <label htmlFor="primary_color">
<strong className="margin-right--sm">Primary Color:</strong> <strong className="margin-right--sm">Primary Color:</strong>
</label>{' '} </label>{' '}
@ -96,7 +97,7 @@ function ColorGenerator() {
const colorValue = event.target.value.replace(/^#+/, ''); const colorValue = event.target.value.replace(/^#+/, '');
try { try {
Color('#' + colorValue); Color(`#${baseColor}`);
setBaseColor(colorValue); setBaseColor(colorValue);
} catch { } catch {
// Don't update for invalid colors. // Don't update for invalid colors.
@ -150,7 +151,7 @@ function ColorGenerator() {
[variableName]: { [variableName]: {
...shades[variableName], ...shades[variableName],
adjustmentInput: event.target.value, adjustmentInput: event.target.value,
adjustment: isNaN(newValue) adjustment: Number.isNaN(newValue)
? adjustment ? adjustment
: newValue / 100.0, : newValue / 100.0,
}, },

View file

@ -5,12 +5,20 @@
* LICENSE file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*/ */
import React, {useState} from 'react'; import React, {ReactNode, useState} from 'react';
export default function ErrorBoundaryTestButton({children = 'Boom!'}) { export default function ErrorBoundaryTestButton({
children = 'Boom!',
}: {
children?: ReactNode;
}): JSX.Element {
const [state, setState] = useState(false); const [state, setState] = useState(false);
if (state) { if (state) {
throw new Error('Boom!'); throw new Error('Boom!');
} }
return <button onClick={() => setState(true)}>{children}</button>; return (
<button type="button" onClick={() => setState(true)}>
{children}
</button>
);
} }

View file

@ -5,6 +5,8 @@
* LICENSE file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*/ */
/* eslint-disable global-require */
import React from 'react'; import React from 'react';
import Translate from '@docusaurus/Translate'; import Translate from '@docusaurus/Translate';
import Link from '@docusaurus/Link'; import Link from '@docusaurus/Link';
@ -32,7 +34,7 @@ const Playgrounds = [
id="playground.stackblitz.description" id="playground.stackblitz.description"
values={{ values={{
webContainersLink: ( webContainersLink: (
<Link target="https://blog.stackblitz.com/posts/introducing-webcontainers/"> <Link href="https://blog.stackblitz.com/posts/introducing-webcontainers/">
WebContainers WebContainers
</Link> </Link>
), ),
@ -77,7 +79,7 @@ function PlaygroundCard({name, image, url, description}: Props) {
); );
} }
export function PlaygroundCardsRow() { export function PlaygroundCardsRow(): JSX.Element {
return ( return (
<div className="row"> <div className="row">
{Playgrounds.map((playground) => ( {Playgrounds.map((playground) => (

View file

@ -41,7 +41,7 @@ function TeamProfileCard({
<div className="avatar avatar--vertical"> <div className="avatar avatar--vertical">
<img <img
className="avatar__photo avatar__photo--xl" className="avatar__photo avatar__photo--xl"
src={githubUrl + '.png'} src={`${githubUrl}.png`}
alt={`${name}'s avatar`} alt={`${name}'s avatar`}
/> />
<div className="avatar__intro"> <div className="avatar__intro">
@ -71,11 +71,11 @@ function TeamProfileCard({
function TeamProfileCardCol(props: ProfileProps) { function TeamProfileCardCol(props: ProfileProps) {
return ( return (
<TeamProfileCard {...props} className={'col col--6 margin-bottom--lg'} /> <TeamProfileCard {...props} className="col col--6 margin-bottom--lg" />
); );
} }
export function ActiveTeamRow() { export function ActiveTeamRow(): JSX.Element {
return ( return (
<div className="row"> <div className="row">
<TeamProfileCardCol <TeamProfileCardCol
@ -125,15 +125,15 @@ export function ActiveTeamRow() {
twitterUrl="https://twitter.com/yangshunz"> twitterUrl="https://twitter.com/yangshunz">
<Translate id="team.profile.Yangshun Tay.body"> <Translate id="team.profile.Yangshun Tay.body">
Full Front End Stack developer who likes working on the Jamstack. Full Front End Stack developer who likes working on the Jamstack.
Working on Docusaurus made him Facebook's unofficial part-time Open Working on Docusaurus made him Facebook&apos;s unofficial part-time
Source webmaster, which is an awesome role to be in. Open Source webmaster, which is an awesome role to be in.
</Translate> </Translate>
</TeamProfileCardCol> </TeamProfileCardCol>
</div> </div>
); );
} }
export function HonoraryAlumniTeamRow() { export function HonoraryAlumniTeamRow(): JSX.Element {
return ( return (
<div className="row"> <div className="row">
<TeamProfileCardCol <TeamProfileCardCol
@ -157,7 +157,7 @@ export function HonoraryAlumniTeamRow() {
); );
} }
export function StudentFellowsTeamRow() { export function StudentFellowsTeamRow(): JSX.Element {
return ( return (
<div className="row"> <div className="row">
<TeamProfileCardCol <TeamProfileCardCol
@ -166,7 +166,7 @@ export function StudentFellowsTeamRow() {
twitterUrl="https://twitter.com/ar_goyal"> twitterUrl="https://twitter.com/ar_goyal">
Fullstack developer who loves to code and try new technologies. In his Fullstack developer who loves to code and try new technologies. In his
free time, he contributes to open source, writes blog posts on his{' '} free time, he contributes to open source, writes blog posts on his{' '}
<a href="https://anshulgoyal.dev/" target="_blank"> <a href="https://anshulgoyal.dev/" target="_blank" rel="noreferrer">
website website
</a>{' '} </a>{' '}
and watches Anime. and watches Anime.
@ -184,11 +184,14 @@ export function StudentFellowsTeamRow() {
Fanny got started with web development in high school, building a Fanny got started with web development in high school, building a
project for the school kitchen. In her free time she loves contributing project for the school kitchen. In her free time she loves contributing
to Open Source, occasionally writing on{' '} to Open Source, occasionally writing on{' '}
<a href="https://dev.to/fannyvieira" target="_blank"> <a href="https://dev.to/fannyvieira" target="_blank" rel="noreferrer">
her blog her blog
</a>{' '} </a>{' '}
about her experiences, cooking, and creating{' '} about her experiences, cooking, and creating{' '}
<a href="https://open.spotify.com/user/anotherfanny" target="_blank"> <a
href="https://open.spotify.com/user/anotherfanny"
target="_blank"
rel="noreferrer">
Spotify playlists Spotify playlists
</a> </a>
. .

View file

@ -14,7 +14,12 @@ interface Props extends ComponentProps<'input'> {
label: ReactNode; label: ReactNode;
} }
function ShowcaseCheckbox({title, className, label, ...props}: Props) { function ShowcaseCheckbox({
title,
className,
label,
...props
}: Props): JSX.Element {
const id = `showcase_checkbox_id_${props.name};`; const id = `showcase_checkbox_id_${props.name};`;
return ( return (
<div className={clsx(className, styles.checkboxContainer)} title={title}> <div className={clsx(className, styles.checkboxContainer)} title={title}>

View file

@ -13,7 +13,7 @@ interface Props extends ComponentProps<'select'> {
label: string; label: string;
} }
function ShowcaseSelect({label, ...props}: Props) { function ShowcaseSelect({label, ...props}: Props): JSX.Element {
const id = `showcase_select_id_${props.name};`; const id = `showcase_select_id_${props.name};`;
return ( return (
<div className={styles.selectContainer}> <div className={styles.selectContainer}>

View file

@ -5,6 +5,8 @@
* LICENSE file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*/ */
/* eslint-disable global-require */
import React from 'react'; import React from 'react';
import {difference, sortBy} from '../utils/jsUtils'; import {difference, sortBy} from '../utils/jsUtils';
@ -154,7 +156,8 @@ export const Tags: Record<TagType, Tag> = {
const Users: User[] = [ const Users: User[] = [
{ {
title: 'Aide Jeune', title: 'Aide Jeune',
description: 'French Discord server that helps young people who have been bullied or feel bad about themselves', description:
'French Discord server that helps young people who have been bullied or feel bad about themselves',
preview: require('./showcase/aide_jeune.png'), preview: require('./showcase/aide_jeune.png'),
website: 'https://aidejeune.fr', website: 'https://aidejeune.fr',
source: 'https://github.com/AideJeune', source: 'https://github.com/AideJeune',
@ -200,7 +203,7 @@ const Users: User[] = [
preview: require('./showcase/apache-apisix.png'), preview: require('./showcase/apache-apisix.png'),
website: 'https://apisix.apache.org/', website: 'https://apisix.apache.org/',
source: 'https://github.com/apache/apisix-website', source: 'https://github.com/apache/apisix-website',
tags: ['opensource','i18n','large'], tags: ['opensource', 'i18n', 'large'],
}, },
{ {
title: 'Apex FP', title: 'Apex FP',
@ -246,7 +249,8 @@ const Users: User[] = [
}, },
{ {
title: 'Blink Shell Docs', title: 'Blink Shell Docs',
description: 'Documentation for Blink Shell a professional, desktop grade terminal for iOS', description:
'Documentation for Blink Shell a professional, desktop grade terminal for iOS',
preview: require('./showcase/blinkshell.png'), preview: require('./showcase/blinkshell.png'),
website: 'https://docs.blink.sh/', website: 'https://docs.blink.sh/',
source: 'https://github.com/blinksh/docs', source: 'https://github.com/blinksh/docs',
@ -258,7 +262,7 @@ const Users: User[] = [
preview: require('./showcase/johnnyreilly.png'), preview: require('./showcase/johnnyreilly.png'),
website: 'https://blog.johnnyreilly.com/', website: 'https://blog.johnnyreilly.com/',
source: 'https://github.com/johnnyreilly/blog.johnnyreilly.com', source: 'https://github.com/johnnyreilly/blog.johnnyreilly.com',
tags: ['opensource','personal','large'], tags: ['opensource', 'personal', 'large'],
}, },
{ {
title: 'Blogasaurus', title: 'Blogasaurus',
@ -266,7 +270,7 @@ const Users: User[] = [
preview: require('./showcase/Blogasaurus.png'), preview: require('./showcase/Blogasaurus.png'),
website: 'https://blog.palashsh.me/', website: 'https://blog.palashsh.me/',
source: 'https://github.com/BattleOfPlassey/blogasaurus', source: 'https://github.com/BattleOfPlassey/blogasaurus',
tags: ['personal', 'opensource'] tags: ['personal', 'opensource'],
}, },
{ {
title: 'Botonic', title: 'Botonic',
@ -295,7 +299,8 @@ const Users: User[] = [
}, },
{ {
title: 'ClarityChallenge', title: 'ClarityChallenge',
description: 'Documentation for the Clarity machine learning challenges for improving hearing aid signal processing', description:
'Documentation for the Clarity machine learning challenges for improving hearing aid signal processing',
preview: require('./showcase/claritychallenge.png'), preview: require('./showcase/claritychallenge.png'),
website: 'https://claritychallenge.github.io/clarity_CEC1_doc', website: 'https://claritychallenge.github.io/clarity_CEC1_doc',
source: 'https://github.com/claritychallenge/clarity_CEC1_doc', source: 'https://github.com/claritychallenge/clarity_CEC1_doc',
@ -303,10 +308,12 @@ const Users: User[] = [
}, },
{ {
title: 'Cloudy with a chance of Big Data', title: 'Cloudy with a chance of Big Data',
description: 'A blog only Docusaurus site showcasing cloud, data and full stack design patterns and tutorials', description:
'A blog only Docusaurus site showcasing cloud, data and full stack design patterns and tutorials',
preview: require('./showcase/cloudywithachanceofbigdata.png'), preview: require('./showcase/cloudywithachanceofbigdata.png'),
website: 'https://cloudywithachanceofbigdata.com/', website: 'https://cloudywithachanceofbigdata.com/',
source: 'https://github.com/cloudywithachanceofbigdata/cloudywithachanceofbigdata.github.io', source:
'https://github.com/cloudywithachanceofbigdata/cloudywithachanceofbigdata.github.io',
tags: ['opensource', 'personal'], tags: ['opensource', 'personal'],
}, },
{ {
@ -319,7 +326,8 @@ const Users: User[] = [
}, },
{ {
title: 'CodeYourFuture', title: 'CodeYourFuture',
description: 'The syllabus for CodeYourFuture - a free code school for refugees, asylum seekers and disadvantaged people', description:
'The syllabus for CodeYourFuture - a free code school for refugees, asylum seekers and disadvantaged people',
preview: require('./showcase/codeyourfuture.png'), preview: require('./showcase/codeyourfuture.png'),
website: 'https://syllabus.codeyourfuture.io/', website: 'https://syllabus.codeyourfuture.io/',
source: 'https://github.com/CodeYourFuture/syllabus', source: 'https://github.com/CodeYourFuture/syllabus',
@ -351,7 +359,8 @@ const Users: User[] = [
}, },
{ {
title: 'Country State City API', title: 'Country State City API',
description: 'Get simplified countries, states & cities data without bloating up your database.', description:
'Get simplified countries, states & cities data without bloating up your database.',
preview: require('./showcase/countrystatecity.png'), preview: require('./showcase/countrystatecity.png'),
website: 'https://countrystatecity.in/', website: 'https://countrystatecity.in/',
source: 'https://github.com/dr5hn/csc-website', source: 'https://github.com/dr5hn/csc-website',
@ -367,7 +376,8 @@ const Users: User[] = [
}, },
{ {
title: 'CryptoDevHub', title: 'CryptoDevHub',
description: 'The place where Blockchain- and Crypto developers learn, meet and grow.', description:
'The place where Blockchain- and Crypto developers learn, meet and grow.',
preview: require('./showcase/cryptodevhub.png'), preview: require('./showcase/cryptodevhub.png'),
website: 'https://cryptodevhub.io', website: 'https://cryptodevhub.io',
source: 'https://github.com/cryptodevhub/site', source: 'https://github.com/cryptodevhub/site',
@ -384,7 +394,8 @@ const Users: User[] = [
}, },
{ {
title: 'Dart Code Metrics', title: 'Dart Code Metrics',
description: 'Static analysis tool that helps analyse and improve Dart code quality.', description:
'Static analysis tool that helps analyse and improve Dart code quality.',
preview: require('./showcase/dart-code-metrics.png'), preview: require('./showcase/dart-code-metrics.png'),
website: 'https://dartcodemetrics.dev/', website: 'https://dartcodemetrics.dev/',
source: 'https://github.com/dart-code-checker/dart-code-metrics', source: 'https://github.com/dart-code-checker/dart-code-metrics',
@ -413,7 +424,7 @@ const Users: User[] = [
preview: require('./showcase/djamaile.png'), preview: require('./showcase/djamaile.png'),
website: 'https://djamaile.dev/', website: 'https://djamaile.dev/',
source: 'https://github.com/djamaile/portfolio', source: 'https://github.com/djamaile/portfolio',
tags: ['opensource','personal'], tags: ['opensource', 'personal'],
}, },
{ {
title: 'Draft.js', title: 'Draft.js',
@ -421,7 +432,7 @@ const Users: User[] = [
preview: require('./showcase/draftjs.png'), preview: require('./showcase/draftjs.png'),
website: 'https://draftjs.org/', website: 'https://draftjs.org/',
source: 'https://github.com/facebook/draft-js', source: 'https://github.com/facebook/draft-js',
tags: ['opensource','facebook'], tags: ['opensource', 'facebook'],
}, },
{ {
title: 'Easyjwt', title: 'Easyjwt',
@ -429,7 +440,7 @@ const Users: User[] = [
preview: require('./showcase/easyjwt.png'), preview: require('./showcase/easyjwt.png'),
website: 'https://www.easyjwt.org', website: 'https://www.easyjwt.org',
source: 'https://github.com/authdog/easyjwt', source: 'https://github.com/authdog/easyjwt',
tags: ['opensource','i18n'], tags: ['opensource', 'i18n'],
}, },
{ {
title: 'Eightshift Docs', title: 'Eightshift Docs',
@ -459,7 +470,8 @@ const Users: User[] = [
}, },
{ {
title: "Evan Tay's Personal Website", title: "Evan Tay's Personal Website",
description: "A Software Engineer's blog, documentation and project portfolio.", description:
"A Software Engineer's blog, documentation and project portfolio.",
preview: require('./showcase/evantay.png'), preview: require('./showcase/evantay.png'),
website: 'https://evantay.com/', website: 'https://evantay.com/',
source: 'https://github.com/DigiPie/kaya-folio', source: 'https://github.com/DigiPie/kaya-folio',
@ -511,7 +523,7 @@ const Users: User[] = [
preview: require('./showcase/flexit.png'), preview: require('./showcase/flexit.png'),
website: 'https://learn.flexitanalytics.com/', website: 'https://learn.flexitanalytics.com/',
source: 'https://github.com/ataft/flexit-docs', source: 'https://github.com/ataft/flexit-docs',
tags: ['opensource','product'], tags: ['opensource', 'product'],
}, },
{ {
title: 'Flux', title: 'Flux',
@ -560,7 +572,7 @@ const Users: User[] = [
preview: require('./showcase/graphql-codegen.png'), preview: require('./showcase/graphql-codegen.png'),
website: 'https://graphql-code-generator.com/', website: 'https://graphql-code-generator.com/',
source: 'https://github.com/dotansimha/graphql-code-generator', source: 'https://github.com/dotansimha/graphql-code-generator',
tags: ['favorite', 'opensource','design'], tags: ['favorite', 'opensource', 'design'],
}, },
{ {
title: 'GraphQL Inspector', title: 'GraphQL Inspector',
@ -568,7 +580,7 @@ const Users: User[] = [
preview: require('./showcase/graphql-inspector.png'), preview: require('./showcase/graphql-inspector.png'),
website: 'https://graphql-inspector.com', website: 'https://graphql-inspector.com',
source: 'https://github.com/kamilkisiela/graphql-inspector', source: 'https://github.com/kamilkisiela/graphql-inspector',
tags: ['opensource', 'design','product'], tags: ['opensource', 'design', 'product'],
}, },
{ {
title: 'GraphQL Mesh', title: 'GraphQL Mesh',
@ -633,19 +645,21 @@ const Users: User[] = [
preview: require('./showcase/intelagent.png'), preview: require('./showcase/intelagent.png'),
website: 'https://www.intelagent.ca/', website: 'https://www.intelagent.ca/',
source: 'https://github.com/intelagentbilling/docs', source: 'https://github.com/intelagentbilling/docs',
tags: ['opensource','product'], tags: ['opensource', 'product'],
}, },
{ {
title: 'Indent', title: 'Indent',
description: 'Indent provides on-demand access control for cloud apps and infrastructure.', description:
'Indent provides on-demand access control for cloud apps and infrastructure.',
preview: require('./showcase/indent.png'), preview: require('./showcase/indent.png'),
website: 'https://indent.com/developers', website: 'https://indent.com/developers',
source: null, source: null,
tags: ['product','design'], tags: ['product', 'design'],
}, },
{ {
title: 'InfraQL Technologies', title: 'InfraQL Technologies',
description: 'InfraQL is a SQL based approach to cloud infrastructure coding, API querying and automation.', description:
'InfraQL is a SQL based approach to cloud infrastructure coding, API querying and automation.',
preview: require('./showcase/infraql-docs.png'), preview: require('./showcase/infraql-docs.png'),
website: 'https://docs.infraql.io/', website: 'https://docs.infraql.io/',
source: null, source: null,
@ -661,11 +675,12 @@ const Users: User[] = [
}, },
{ {
title: 'Jest', title: 'Jest',
description: 'Jest is a delightful JavaScript Testing Framework with a focus on simplicity.', description:
'Jest is a delightful JavaScript Testing Framework with a focus on simplicity.',
preview: require('./showcase/jest.png'), preview: require('./showcase/jest.png'),
website: 'https://jestjs.io/', website: 'https://jestjs.io/',
source: 'https://github.com/facebook/jest/tree/master/website', source: 'https://github.com/facebook/jest/tree/master/website',
tags: ['favorite','opensource','design','i18n','versioning'], tags: ['favorite', 'opensource', 'design', 'i18n', 'versioning'],
}, },
{ {
title: 'Kosko', title: 'Kosko',
@ -673,7 +688,7 @@ const Users: User[] = [
preview: require('./showcase/kosko.png'), preview: require('./showcase/kosko.png'),
website: 'https://kosko.dev', website: 'https://kosko.dev',
source: 'https://github.com/tommy351/kosko', source: 'https://github.com/tommy351/kosko',
tags: ['opensource'] tags: ['opensource'],
}, },
{ {
title: 'Kotest', title: 'Kotest',
@ -725,7 +740,8 @@ const Users: User[] = [
}, },
{ {
title: 'Meli', title: 'Meli',
description: 'Platform to deploy static sites, frontend applications and hosted forms', description:
'Platform to deploy static sites, frontend applications and hosted forms',
preview: require('./showcase/meli.png'), preview: require('./showcase/meli.png'),
website: 'https://docs.meli.sh/', website: 'https://docs.meli.sh/',
source: 'https://github.com/getmeli/meli', source: 'https://github.com/getmeli/meli',
@ -741,7 +757,8 @@ const Users: User[] = [
}, },
{ {
title: 'Mia-Platform', title: 'Mia-Platform',
description: 'Mia-Platform is the simplest way to develop and operate modern applications on Kubernetes. Don\'t waste time to set up your platform, just push the code!', description:
"Mia-Platform is the simplest way to develop and operate modern applications on Kubernetes. Don't waste time to set up your platform, just push the code!",
preview: require('./showcase/mia-platform.png'), preview: require('./showcase/mia-platform.png'),
website: 'https://docs.mia-platform.eu/', website: 'https://docs.mia-platform.eu/',
source: null, source: null,
@ -776,7 +793,8 @@ const Users: User[] = [
}, },
{ {
title: 'nanos world documentation', title: 'nanos world documentation',
description: "nanos world is the next-generation multiplayer open world sandbox game.", description:
'nanos world is the next-generation multiplayer open world sandbox game.',
preview: require('./showcase/nanos-world.png'), preview: require('./showcase/nanos-world.png'),
website: 'https://docs.nanos.world/', website: 'https://docs.nanos.world/',
source: 'https://github.com/nanos-world/docs', source: 'https://github.com/nanos-world/docs',
@ -792,7 +810,8 @@ const Users: User[] = [
}, },
{ {
title: 'Netdata Learn', title: 'Netdata Learn',
description: 'An educational site for monitoring and troubleshooting systems', description:
'An educational site for monitoring and troubleshooting systems',
preview: require('./showcase/netdata.png'), preview: require('./showcase/netdata.png'),
website: 'https://learn.netdata.cloud', website: 'https://learn.netdata.cloud',
source: 'https://github.com/netdata/netdata-learn-docusaurus', source: 'https://github.com/netdata/netdata-learn-docusaurus',
@ -812,7 +831,7 @@ const Users: User[] = [
preview: require('./showcase/nextauthjs.png'), preview: require('./showcase/nextauthjs.png'),
website: 'https://next-auth.js.org/', website: 'https://next-auth.js.org/',
source: 'https://github.com/nextauthjs/next-auth', source: 'https://github.com/nextauthjs/next-auth',
tags: ['opensource','design'], tags: ['opensource', 'design'],
}, },
{ {
title: 'Node SerialPort', title: 'Node SerialPort',
@ -820,7 +839,7 @@ const Users: User[] = [
preview: require('./showcase/node-serialport.png'), preview: require('./showcase/node-serialport.png'),
website: 'https://serialport.io', website: 'https://serialport.io',
source: 'https://github.com/serialport/node-serialport', source: 'https://github.com/serialport/node-serialport',
tags: ['opensource','versioning'], tags: ['opensource', 'versioning'],
}, },
{ {
title: 'Nodify', title: 'Nodify',
@ -863,7 +882,7 @@ const Users: User[] = [
preview: require('./showcase/orbitjs.png'), preview: require('./showcase/orbitjs.png'),
website: 'https://orbitjs.com', website: 'https://orbitjs.com',
source: 'https://github.com/orbitjs/orbit/tree/main/website', source: 'https://github.com/orbitjs/orbit/tree/main/website',
tags: ['opensource','versioning'], tags: ['opensource', 'versioning'],
}, },
{ {
title: 'Oxidizer', title: 'Oxidizer',
@ -879,9 +898,9 @@ const Users: User[] = [
preview: require('./showcase/paubox.png'), preview: require('./showcase/paubox.png'),
website: 'https://docs.paubox.com/', website: 'https://docs.paubox.com/',
source: null, source: null,
tags: ["product"], tags: ['product'],
}, },
{ {
title: 'Pipeline UI', title: 'Pipeline UI',
description: 'Pipeline UI Documentation', description: 'Pipeline UI Documentation',
preview: require('./showcase/pipeline-ui.png'), preview: require('./showcase/pipeline-ui.png'),
@ -891,11 +910,12 @@ const Users: User[] = [
}, },
{ {
title: 'Plausible Analytics Docs', title: 'Plausible Analytics Docs',
description: 'Plausible Analytics is a simple, open source, lightweight (< 1 KB) and privacy-friendly alternative to Google Analytics. ', description:
'Plausible Analytics is a simple, open source, lightweight (< 1 KB) and privacy-friendly alternative to Google Analytics. ',
preview: require('./showcase/plausible.png'), preview: require('./showcase/plausible.png'),
website: 'https://plausible.io/docs', website: 'https://plausible.io/docs',
source: 'https://github.com/plausible/docs', source: 'https://github.com/plausible/docs',
tags: ['opensource','product'], tags: ['opensource', 'product'],
}, },
{ {
title: 'pnpm', title: 'pnpm',
@ -903,7 +923,7 @@ const Users: User[] = [
preview: require('./showcase/pnpm.png'), preview: require('./showcase/pnpm.png'),
website: 'https://pnpm.js.org/', website: 'https://pnpm.js.org/',
source: 'https://github.com/pnpm/pnpm.github.io/', source: 'https://github.com/pnpm/pnpm.github.io/',
tags: ['opensource','i18n'], tags: ['opensource', 'i18n'],
}, },
{ {
title: 'Postgres.ai Database Lab', title: 'Postgres.ai Database Lab',
@ -928,7 +948,7 @@ const Users: User[] = [
preview: require('./showcase/pptxgenjs.png'), preview: require('./showcase/pptxgenjs.png'),
website: 'https://gitbrent.github.io/PptxGenJS/', website: 'https://gitbrent.github.io/PptxGenJS/',
source: 'https://github.com/gitbrent/PptxGenJS', source: 'https://github.com/gitbrent/PptxGenJS',
tags: ['opensource','design'], tags: ['opensource', 'design'],
}, },
{ {
title: 'Prismatic', title: 'Prismatic',
@ -970,7 +990,7 @@ const Users: User[] = [
preview: require('./showcase/quantcdn.png'), preview: require('./showcase/quantcdn.png'),
website: 'https://docs.quantcdn.io', website: 'https://docs.quantcdn.io',
source: 'https://github.com/quantcdn/docs', source: 'https://github.com/quantcdn/docs',
tags: ['opensource','product'], tags: ['opensource', 'product'],
}, },
{ {
title: 'QuestDB', title: 'QuestDB',
@ -991,7 +1011,8 @@ const Users: User[] = [
}, },
{ {
title: 'React Complex Tree', title: 'React Complex Tree',
description: 'Unopinionated Accessible React Tree Component with Multi-Select and Drag-And-Drop', description:
'Unopinionated Accessible React Tree Component with Multi-Select and Drag-And-Drop',
preview: require('./showcase/react-complex-tree.png'), preview: require('./showcase/react-complex-tree.png'),
website: 'https://rct.lukasbach.com/', website: 'https://rct.lukasbach.com/',
source: 'https://github.com/lukasbach/react-complex-tree', source: 'https://github.com/lukasbach/react-complex-tree',
@ -1056,18 +1077,21 @@ const Users: User[] = [
}, },
{ {
title: 'React Native Reanimated', title: 'React Native Reanimated',
description: 'React Native\'s Animated library reimplemented', description: "React Native's Animated library reimplemented",
preview: require('./showcase/react-native-reanimated.png'), preview: require('./showcase/react-native-reanimated.png'),
website: 'https://docs.swmansion.com/react-native-reanimated/', website: 'https://docs.swmansion.com/react-native-reanimated/',
source: 'https://github.com/software-mansion/react-native-reanimated/tree/master/docs', source:
tags: ['opensource','design','versioning'], 'https://github.com/software-mansion/react-native-reanimated/tree/master/docs',
tags: ['opensource', 'design', 'versioning'],
}, },
{ {
title: "React Native Render HTML", title: 'React Native Render HTML',
description: "The hackable, full-featured Open Source HTML rendering solution for React Native.", description:
'The hackable, full-featured Open Source HTML rendering solution for React Native.',
preview: require('./showcase/rnrh.png'), preview: require('./showcase/rnrh.png'),
website: "https://meliorence.github.io/react-native-render-html", website: 'https://meliorence.github.io/react-native-render-html',
source: "https://github.com/meliorence/react-native-render-html/tree/master/apps/website", source:
'https://github.com/meliorence/react-native-render-html/tree/master/apps/website',
tags: ['opensource', 'design'], tags: ['opensource', 'design'],
}, },
{ {
@ -1084,7 +1108,7 @@ const Users: User[] = [
preview: require('./showcase/react-navigation.png'), preview: require('./showcase/react-navigation.png'),
website: 'https://reactnavigation.org/', website: 'https://reactnavigation.org/',
source: 'https://github.com/react-navigation/react-navigation.github.io', source: 'https://github.com/react-navigation/react-navigation.github.io',
tags: ['opensource','design','versioning'], tags: ['opensource', 'design', 'versioning'],
}, },
{ {
title: 'React Redux', title: 'React Redux',
@ -1117,7 +1141,7 @@ const Users: User[] = [
preview: require('./showcase/redis-developer.png'), preview: require('./showcase/redis-developer.png'),
website: 'https://developer.redislabs.com', website: 'https://developer.redislabs.com',
source: 'https://github.com/redis-developer/redis-developer.github.io', source: 'https://github.com/redis-developer/redis-developer.github.io',
tags: ['opensource','product','design','favorite'], tags: ['opensource', 'product', 'design', 'favorite'],
}, },
{ {
title: 'Rematch', title: 'Rematch',
@ -1134,7 +1158,7 @@ const Users: User[] = [
preview: require('./showcase/relay.png'), preview: require('./showcase/relay.png'),
website: 'https://relay.dev/', website: 'https://relay.dev/',
source: 'https://github.com/facebook/relay/tree/main/website', source: 'https://github.com/facebook/relay/tree/main/website',
tags: ['opensource','favorite','design','versioning'], tags: ['opensource', 'favorite', 'design', 'versioning'],
}, },
{ {
title: 'Remotion', title: 'Remotion',
@ -1142,7 +1166,7 @@ const Users: User[] = [
preview: require('./showcase/remotion.png'), preview: require('./showcase/remotion.png'),
website: 'https://www.remotion.dev/', website: 'https://www.remotion.dev/',
source: 'https://github.com/JonnyBurger/remotion/tree/main/packages/docs', source: 'https://github.com/JonnyBurger/remotion/tree/main/packages/docs',
tags: ['opensource','product'], tags: ['opensource', 'product'],
}, },
{ {
title: 'Repeater.js', title: 'Repeater.js',
@ -1177,7 +1201,7 @@ const Users: User[] = [
source: 'https://github.com/runletapp/website', source: 'https://github.com/runletapp/website',
tags: ['opensource'], tags: ['opensource'],
}, },
{ {
title: 'Runiac', title: 'Runiac',
description: 'Run IaC Anywhere with Ease', description: 'Run IaC Anywhere with Ease',
preview: require('./showcase/runiac.png'), preview: require('./showcase/runiac.png'),
@ -1215,7 +1239,7 @@ const Users: User[] = [
preview: require('./showcase/smashgg.png'), preview: require('./showcase/smashgg.png'),
website: 'https://developer.smash.gg', website: 'https://developer.smash.gg',
source: 'https://github.com/smashgg/developer-portal', source: 'https://github.com/smashgg/developer-portal',
tags: ['opensource','product'], tags: ['opensource', 'product'],
}, },
{ {
title: 'Shabad OS Docs', title: 'Shabad OS Docs',
@ -1273,7 +1297,7 @@ const Users: User[] = [
preview: require('./showcase/supabase.png'), preview: require('./showcase/supabase.png'),
website: 'https://www.supabase.io/', website: 'https://www.supabase.io/',
source: 'https://github.com/supabase/monorepo', source: 'https://github.com/supabase/monorepo',
tags: ['opensource', 'favorite', 'design', 'large','product'], tags: ['opensource', 'favorite', 'design', 'large', 'product'],
}, },
{ {
title: 'T-Regx', title: 'T-Regx',
@ -1315,15 +1339,16 @@ const Users: User[] = [
preview: require('./showcase/the-diff.png'), preview: require('./showcase/the-diff.png'),
website: 'https://thediffpodcast.com', website: 'https://thediffpodcast.com',
source: null, source: null,
tags: [ 'facebook'], tags: ['facebook'],
}, },
{ {
title: 'Tinaël Devresse', title: 'Tinaël Devresse',
description: 'Personal website of Tinaël Devresse, a blog about anything that crosses my mind which I think could interest y\'all.', description:
"Personal website of Tinaël Devresse, a blog about anything that crosses my mind which I think could interest y'all.",
preview: require('./showcase/tinaeldevresse.png'), preview: require('./showcase/tinaeldevresse.png'),
website: 'https://tinaeldevresse.eu/', website: 'https://tinaeldevresse.eu/',
source: 'https://github.com/hunteroi/tinaeldevresse.eu', source: 'https://github.com/hunteroi/tinaeldevresse.eu',
tags: ['personal', 'opensource', 'i18n'] tags: ['personal', 'opensource', 'i18n'],
}, },
{ {
title: 'TRPG Engine', title: 'TRPG Engine',
@ -1390,7 +1415,7 @@ const Users: User[] = [
preview: require('./showcase/webdriverio.png'), preview: require('./showcase/webdriverio.png'),
website: 'https://webdriver.io/', website: 'https://webdriver.io/',
source: 'https://github.com/webdriverio/webdriverio', source: 'https://github.com/webdriverio/webdriverio',
tags: ['opensource', 'design', 'large','favorite'], tags: ['opensource', 'design', 'large', 'favorite'],
}, },
{ {
title: 'Wisdom', title: 'Wisdom',
@ -1400,14 +1425,13 @@ const Users: User[] = [
source: 'https://github.com/Wisdom/dev-docs', source: 'https://github.com/Wisdom/dev-docs',
tags: ['opensource', 'design', 'product'], tags: ['opensource', 'design', 'product'],
}, },
{ {
title: 'Whirl', title: 'Whirl',
description: description: "Whirl's Personal Website and Blog",
'Whirl\'s Personal Website and Blog',
preview: require('./showcase/whirlcodes.png'), preview: require('./showcase/whirlcodes.png'),
website: 'https://whirl.codes', website: 'https://whirl.codes',
source: 'https://github.com/whirl21/website', source: 'https://github.com/whirl21/website',
tags: ['opensource', 'personal'] tags: ['opensource', 'personal'],
}, },
{ {
title: 'KubeVela', title: 'KubeVela',
@ -1432,31 +1456,34 @@ const Users: User[] = [
preview: require('./showcase/joelpo.png'), preview: require('./showcase/joelpo.png'),
website: 'https://joelpo.github.io', website: 'https://joelpo.github.io',
source: 'https://github.com/Joelpo/joelpo.github.io', source: 'https://github.com/Joelpo/joelpo.github.io',
tags: ['personal', 'opensource'] tags: ['personal', 'opensource'],
}, },
{ {
title: 'LiveKit', title: 'LiveKit',
description: 'Open source, scalable, real-time audio and video rooms over WebRTC', description:
'Open source, scalable, real-time audio and video rooms over WebRTC',
preview: require('./showcase/livekit.png'), preview: require('./showcase/livekit.png'),
website: 'https://docs.livekit.io', website: 'https://docs.livekit.io',
source: 'https://github.com/livekit/livekit-docs', source: 'https://github.com/livekit/livekit-docs',
tags: ['opensource', 'product', 'design'] tags: ['opensource', 'product', 'design'],
}, },
{ {
title: 'Zowe', title: 'Zowe',
description: 'Open source framework for leveraging data and applications in z/OS', description:
'Open source framework for leveraging data and applications in z/OS',
preview: require('./showcase/zowe.png'), preview: require('./showcase/zowe.png'),
website: 'https://docs.zowe.org', website: 'https://docs.zowe.org',
source: 'https://github.com/zowe/docs-site', source: 'https://github.com/zowe/docs-site',
tags: ['opensource', 'product', 'large', 'design', 'versioning'] tags: ['opensource', 'product', 'large', 'design', 'versioning'],
}, },
{ {
title: 'Quickwit', title: 'Quickwit',
description: 'The open source search engine on object storage with subsecond latency', description:
'The open source search engine on object storage with subsecond latency',
preview: require('./showcase/quickwit.png'), preview: require('./showcase/quickwit.png'),
website: 'https://quickwit.io', website: 'https://quickwit.io',
source: 'https://github.com/quickwit-inc/quickwit', source: 'https://github.com/quickwit-inc/quickwit',
tags: ['favorite', 'opensource', 'design'] tags: ['favorite', 'opensource', 'design'],
}, },
{ {
title: 'Verdaccio', title: 'Verdaccio',
@ -1464,23 +1491,25 @@ const Users: User[] = [
preview: require('./showcase/verdaccio.png'), preview: require('./showcase/verdaccio.png'),
website: 'https://verdaccio.org', website: 'https://verdaccio.org',
source: 'https://github.com/verdaccio/verdaccio', source: 'https://github.com/verdaccio/verdaccio',
tags: ['favorite', 'opensource', 'large', 'i18n', 'design' ] tags: ['favorite', 'opensource', 'large', 'i18n', 'design'],
}, },
{ {
title: 'Unmand', title: 'Unmand',
description: 'A business automation platform that liberates users from repetitive tasks.', description:
'A business automation platform that liberates users from repetitive tasks.',
preview: require('./showcase/unmand.png'), preview: require('./showcase/unmand.png'),
website: 'https://unmand.com', website: 'https://unmand.com',
source: null, source: null,
tags: ['product', 'design'] tags: ['product', 'design'],
}, },
{ {
title: 'Haochen', title: 'Haochen',
description: 'My personal website with a blog section to record all tech-related issues I encountered.', description:
'My personal website with a blog section to record all tech-related issues I encountered.',
preview: require('./showcase/haochen.png'), preview: require('./showcase/haochen.png'),
website: 'https://haochenqi.com/', website: 'https://haochenqi.com/',
source: 'https://github.com/HaochenQ/Haochen-Blog', source: 'https://github.com/HaochenQ/Haochen-Blog',
tags: ['personal', 'opensource'] tags: ['personal', 'opensource'],
}, },
{ {
title: 'Drayman', title: 'Drayman',
@ -1488,15 +1517,16 @@ const Users: User[] = [
preview: require('./showcase/drayman.png'), preview: require('./showcase/drayman.png'),
website: 'https://drayman.io/', website: 'https://drayman.io/',
source: 'https://github.com/Claviz/drayman', source: 'https://github.com/Claviz/drayman',
tags: ['opensource'] tags: ['opensource'],
}, },
{ {
title: 'Nocalhost', title: 'Nocalhost',
description: 'An open-source toolsets help to build cloud-native applications easier and faster.', description:
'An open-source toolsets help to build cloud-native applications easier and faster.',
preview: require('./showcase/nocalhost.png'), preview: require('./showcase/nocalhost.png'),
website: 'https://nocalhost.dev/', website: 'https://nocalhost.dev/',
source: 'https://github.com/nocalhost/nocalhost', source: 'https://github.com/nocalhost/nocalhost',
tags: ['opensource', 'i18n'] tags: ['opensource', 'i18n'],
}, },
{ {
title: 'Patrik Mäsiar', title: 'Patrik Mäsiar',
@ -1507,7 +1537,6 @@ const Users: User[] = [
tags: ['personal', 'opensource'], tags: ['personal', 'opensource'],
}, },
/* /*
Pro Tip: add your site in alphabetical order. Pro Tip: add your site in alphabetical order.
Appending your site here (at the end) is more likely to produce Git conflicts. Appending your site here (at the end) is more likely to produce Git conflicts.

View file

@ -14,10 +14,11 @@ import styles from './styles.module.css';
const BOARD_TOKEN = '054e0e53-d951-b14c-7e74-9eb8f9ed2f91'; const BOARD_TOKEN = '054e0e53-d951-b14c-7e74-9eb8f9ed2f91';
function FeatureRequests() { function FeatureRequests(): JSX.Element {
useEffect(() => { useEffect(() => {
cannyScript(); cannyScript();
const Canny = (window as any).Canny; // eslint-disable-next-line @typescript-eslint/no-explicit-any
const {Canny} = window as any;
Canny('render', { Canny('render', {
boardToken: BOARD_TOKEN, boardToken: BOARD_TOKEN,
basePath: '/feature-requests', basePath: '/feature-requests',

View file

@ -1,11 +1,5 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
// Provided by Canny. // Provided by Canny.
/* eslint-disable */
function cannyScript() { function cannyScript() {
!(function (w, d, i, s) { !(function (w, d, i, s) {

View file

@ -5,6 +5,8 @@
* LICENSE file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*/ */
/* eslint-disable global-require */
import React from 'react'; import React from 'react';
import Link from '@docusaurus/Link'; import Link from '@docusaurus/Link';
import Translate, {translate} from '@docusaurus/Translate'; import Translate, {translate} from '@docusaurus/Translate';
@ -78,7 +80,7 @@ const QUOTES = [
}, },
]; ];
function Home() { function Home(): JSX.Element {
const { const {
siteConfig: { siteConfig: {
customFields: {description}, customFields: {description},
@ -98,6 +100,7 @@ function Home() {
/> />
<span <span
className={styles.heroTitleTextHtml} className={styles.heroTitleTextHtml}
// eslint-disable-next-line react/no-danger
dangerouslySetInnerHTML={{ dangerouslySetInnerHTML={{
__html: translate({ __html: translate({
id: 'homepage.hero.title', id: 'homepage.hero.title',
@ -162,11 +165,11 @@ function Home() {
</h2> </h2>
<p className="padding-horiz--md"> <p className="padding-horiz--md">
<Translate> <Translate>
Save time and focus on your project's documentation. Simply Save time and focus on your project&apos;s documentation.
write docs and blog posts with Markdown/MDX and Docusaurus Simply write docs and blog posts with Markdown/MDX and
will publish a set of static HTML files ready to serve. You Docusaurus will publish a set of static HTML files ready to
can even embed JSX components into your Markdown thanks to serve. You can even embed JSX components into your Markdown
MDX. thanks to MDX.
</Translate> </Translate>
</p> </p>
</div> </div>
@ -181,9 +184,9 @@ function Home() {
</h2> </h2>
<p className="padding-horiz--md"> <p className="padding-horiz--md">
<Translate> <Translate>
Extend or customize your project's layout by reusing React. Extend or customize your project&apos;s layout by reusing
Docusaurus can be extended while reusing the same header and React. Docusaurus can be extended while reusing the same
footer. header and footer.
</Translate> </Translate>
</p> </p>
</div> </div>

View file

@ -105,9 +105,10 @@ function ShowcaseHeader() {
<p>{DESCRIPTION}</p> <p>{DESCRIPTION}</p>
<p> <p>
<a <a
className={'button button--primary'} className="button button--primary"
href={EDIT_URL} href={EDIT_URL}
target={'_blank'}> target="_blank"
rel="noreferrer">
🙏 Add your site now! 🙏 Add your site now!
</a> </a>
</p> </p>
@ -195,7 +196,7 @@ function ShowcaseCards({filteredUsers}: {filteredUsers: User[]}) {
); );
} }
function Showcase() { function Showcase(): JSX.Element {
const {selectedTags, toggleTag} = useSelectedTags(); const {selectedTags, toggleTag} = useSelectedTags();
const [operator, setOperator] = useState<Operator>('OR'); const [operator, setOperator] = useState<Operator>('OR');
const filteredUsers = useFilteredUsers(SortedUsers, selectedTags, operator); const filteredUsers = useFilteredUsers(SortedUsers, selectedTags, operator);

View file

@ -16,7 +16,7 @@ import VersionsArchived from '@site/versionsArchived.json';
const VersionsArchivedList = Object.entries(VersionsArchived); const VersionsArchivedList = Object.entries(VersionsArchived);
function Version() { function Version(): JSX.Element {
const { const {
siteConfig: {organizationName, projectName}, siteConfig: {organizationName, projectName},
} = useDocusaurusContext(); } = useDocusaurusContext();
@ -128,7 +128,9 @@ function Version() {
<tr> <tr>
<th>1.x</th> <th>1.x</th>
<td> <td>
<a href={`https://v1.docusaurus.io/docs/en/installation`}> <a
href="https://v1.docusaurus.io/docs/en/installation"
rel="noreferrer">
Documentation Documentation
</a> </a>
</td> </td>

View file

@ -1,7 +1,15 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
import React, {ComponentProps} from 'react'; import React, {ComponentProps} from 'react';
export const ButtonExample = (props: ComponentProps<'button'>) => ( export const ButtonExample = (props: ComponentProps<'button'>): JSX.Element => (
<button <button
type="button"
{...props} {...props}
style={{ style={{
backgroundColor: 'white', backgroundColor: 'white',

View file

@ -1 +1,8 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/// <reference types="@docusaurus/plugin-ideal-image" /> /// <reference types="@docusaurus/plugin-ideal-image" />

View file

@ -1,21 +1,26 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
// Inspired by https://github.com/you-dont-need/You-Dont-Need-Lodash-Underscore#_difference // Inspired by https://github.com/you-dont-need/You-Dont-Need-Lodash-Underscore#_difference
export function difference<T>(...arrays: T[][]) { export function difference<T>(...arrays: T[][]): T[] {
return arrays.reduce((a, b) => a.filter((c) => !b.includes(c))); return arrays.reduce((a, b) => a.filter((c) => !b.includes(c)));
} }
// Inspired by https://github.com/you-dont-need/You-Dont-Need-Lodash-Underscore#_sortby-and-_orderby // Inspired by https://github.com/you-dont-need/You-Dont-Need-Lodash-Underscore#_sortby-and-_orderby
export function sortBy<T>(array: T[], getter: (item: T) => unknown) { export function sortBy<T>(array: T[], getter: (item: T) => unknown): T[] {
function compareBy(getter: (item: T) => unknown) {
return (a: T, b: T) =>
getter(a) > getter(b) ? 1 : getter(b) > getter(a) ? -1 : 0;
}
const sortedArray = [...array]; const sortedArray = [...array];
sortedArray.sort(compareBy(getter)); sortedArray.sort((a, b) =>
// eslint-disable-next-line no-nested-ternary
getter(a) > getter(b) ? 1 : getter(b) > getter(a) ? -1 : 0,
);
return sortedArray; return sortedArray;
} }
export function toggleListItem<T>(list: T[], item: T) { export function toggleListItem<T>(list: T[], item: T): T[] {
const itemIndex = list.indexOf(item); const itemIndex = list.indexOf(item);
if (itemIndex === -1) { if (itemIndex === -1) {
return list.concat(item); return list.concat(item);

View file

@ -39,6 +39,7 @@ async function hasBuildInProgress() {
async function run() { async function run() {
const timeBefore = Date.now(); const timeBefore = Date.now();
// eslint-disable-next-line no-constant-condition
while (true) { while (true) {
if (Date.now() - timeBefore > timeout) { if (Date.now() - timeBefore > timeout) {
console.warn( console.warn(