diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..162b805
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,12 @@
+# http://EditorConfig.org
+root = true
+
+[*]
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true
+charset = utf-8
+
+[*.{js,ts,.ts.d}]
+indent_style = space
+indent_size = 2
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index ae992e3..1230149 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -1,6 +1,5 @@
version: 2
updates:
-
- package-ecosystem: "github-actions"
directory: "/"
schedule:
diff --git a/.github/workflows/format-check.yml b/.github/workflows/format-check.yml
new file mode 100644
index 0000000..0a28532
--- /dev/null
+++ b/.github/workflows/format-check.yml
@@ -0,0 +1,20 @@
+name: Format Check
+
+on:
+ pull_request:
+ push:
+ branches:
+ - main
+
+jobs:
+ format-check:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+ - name: Use Node.js 20.x
+ uses: actions/setup-node@v1
+ with:
+ node-version: 20.x
+ - run: npm ci
+ - run: npm run lint
+ - run: npm run format:check
diff --git a/.github/workflows/linkchecker.yml b/.github/workflows/linkchecker.yml
index a6ad7c4..4d2f7e9 100644
--- a/.github/workflows/linkchecker.yml
+++ b/.github/workflows/linkchecker.yml
@@ -8,21 +8,21 @@ on:
workflow_dispatch:
permissions:
- contents: read
- pull-requests: write
+ contents: read
+ pull-requests: write
jobs:
- link-checker:
- runs-on: ubuntu-latest
- steps:
- - name: 'Checkout source code'
- uses: actions/checkout@v3
-
- - name: Link Checker
- id: lychee
- uses: lycheeverse/lychee-action@v1.4.1
- with:
- fail: true
- args: --verbose --no-progress --exclude-mail --exclude-loopback **/*.md
- env:
- GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
+ link-checker:
+ runs-on: ubuntu-latest
+ steps:
+ - name: "Checkout source code"
+ uses: actions/checkout@v3
+
+ - name: Link Checker
+ id: lychee
+ uses: lycheeverse/lychee-action@v1.4.1
+ with:
+ fail: true
+ args: --verbose --no-progress --exclude-mail --exclude-loopback **/*.md
+ env:
+ GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
diff --git a/.prettierrc.json b/.prettierrc.json
new file mode 100644
index 0000000..489d21d
--- /dev/null
+++ b/.prettierrc.json
@@ -0,0 +1,7 @@
+{
+ "trailingComma": "all",
+ "tabWidth": 2,
+ "semi": true,
+ "singleQuote": true,
+ "printWidth": 120
+}
diff --git a/components/ArticlePreview.js b/components/ArticlePreview.js
index bac0a89..37c5535 100644
--- a/components/ArticlePreview.js
+++ b/components/ArticlePreview.js
@@ -1,6 +1,6 @@
-import React from "react";
-import styles from "../styles/Home.module.css";
-import Image from "next/image";
+import React from 'react';
+import styles from '../styles/Home.module.css';
+import Image from 'next/image';
export default function ArticlePreview({ index, headline }) {
return (
@@ -22,8 +22,7 @@ export default function ArticlePreview({ index, headline }) {
- {headline.data.site} - shared {headline.data.timestamp} by{" "}
- {headline.data.author}
+ {headline.data.site} - shared {headline.data.timestamp} by {headline.data.author}
{headline.data.desc}
diff --git a/components/Articles.js b/components/Articles.js
index 0ad4650..5bcb6e6 100644
--- a/components/Articles.js
+++ b/components/Articles.js
@@ -1,7 +1,7 @@
-import React, { useState } from "react";
-import { useChannel } from "@ably-labs/react-hooks";
-import ArticlePreview from "./ArticlePreview";
-import styles from "../styles/Home.module.css";
+import React, { useState } from 'react';
+import { useChannel } from '@ably-labs/react-hooks';
+import ArticlePreview from './ArticlePreview';
+import styles from '../styles/Home.module.css';
/*
clearHistoryState:
@@ -14,9 +14,9 @@ let clearHistoryState = true;
export default function Articles(props) {
let inputBox = null;
- const [headlineText, setHeadlineText] = useState("");
+ const [headlineText, setHeadlineText] = useState('');
const [headlines, updateHeadlines] = useState(props.history);
- const [_, ably] = useChannel("[?rewind=5]headlines", (headline) => {
+ const [_, ably] = useChannel('[?rewind=5]headlines', (headline) => {
if (clearHistoryState) {
resetHeadlines();
clearHistoryState = false;
@@ -30,12 +30,8 @@ export default function Articles(props) {
};
const headlineTextIsEmpty = headlineText.trim().length === 0;
- const processedHeadlines = headlines.map((headline) =>
- processMessage(headline, ably.auth.clientId)
- );
- const articles = processedHeadlines.map((headline, index) => (
-
- ));
+ const processedHeadlines = headlines.map((headline) => processMessage(headline, ably.auth.clientId));
+ const articles = processedHeadlines.map((headline, index) => );
const handleFormSubmission = async (event) => {
const nonEnterKeyPress = event.charCode && event.charCode !== 13;
@@ -45,13 +41,13 @@ export default function Articles(props) {
event.preventDefault();
- await fetch("/api/publish", {
- method: "POST",
- headers: { "Content-Type": "application/json" },
+ await fetch('/api/publish', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ text: headlineText, author: ably.auth.clientId }),
});
- setHeadlineText("");
+ setHeadlineText('');
inputBox?.focus();
};
@@ -69,11 +65,7 @@ export default function Articles(props) {
onKeyPress={handleFormSubmission}
className={styles.input}
/>
-