Skip to content

Commit cbaade5

Browse files
committed
chore: sync with master v0.4.0
2 parents 04ad761 + e4d6487 commit cbaade5

File tree

12 files changed

+2094
-1259
lines changed

12 files changed

+2094
-1259
lines changed

.eslintrc.js

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,5 @@
11
module.exports = {
22
root: true,
3-
parserOptions: {
4-
ecmaVersion: 2020,
5-
sourceType: 'module',
6-
ecmaFeatures: {
7-
jsx: true,
8-
},
9-
},
10-
settings: {
11-
react: {
12-
version: 'detect',
13-
},
14-
},
153
env: {
164
browser: true,
175
amd: true,
@@ -20,10 +8,10 @@ module.exports = {
208
},
219
extends: [
2210
'eslint:recommended',
23-
'plugin:react/recommended',
24-
'plugin:react-hooks/recommended',
2511
'plugin:jsx-a11y/recommended',
2612
'plugin:prettier/recommended',
13+
'next',
14+
'next/core-web-vitals',
2715
],
2816
rules: {
2917
'prettier/prettier': 'error',

components/Image.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import NextImage from 'next/image'
2+
3+
// eslint-disable-next-line jsx-a11y/alt-text
4+
const Image = ({ ...rest }) => <NextImage {...rest} />
5+
6+
export default Image

components/MDXComponents.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { MDXRemote } from 'next-mdx-remote'
2-
import Image from 'next/image'
2+
import Image from './Image'
33
import CustomLink from './Link'
44
import Pre from './Pre'
55

layouts/AuthorLayout.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import siteMetadata from '@/data/siteMetadata'
21
import SocialIcon from '@/components/social-icons'
2+
import Image from '@/components/Image'
33
import { PageSeo } from '@/components/SEO'
44

55
export default function AuthorLayout({ children, frontMatter }) {
@@ -16,7 +16,13 @@ export default function AuthorLayout({ children, frontMatter }) {
1616
</div>
1717
<div className="items-start space-y-2 xl:grid xl:grid-cols-3 xl:gap-x-8 xl:space-y-0">
1818
<div className="flex flex-col items-center pt-8 space-x-2">
19-
<img src={avatar} alt="avatar" className="w-48 h-48 rounded-full" />
19+
<Image
20+
src={avatar}
21+
alt="avatar"
22+
width="192px"
23+
height="192px"
24+
className="w-48 h-48 rounded-full"
25+
/>
2026
<h3 className="pt-4 pb-2 text-2xl font-bold leading-8 tracking-tight">{name}</h3>
2127
<div className="text-gray-500 dark:text-gray-400">{occupation}</div>
2228
<div className="text-gray-500 dark:text-gray-400">{company}</div>

layouts/PostLayout.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import Link from '@/components/Link'
22
import PageTitle from '@/components/PageTitle'
33
import SectionContainer from '@/components/SectionContainer'
44
import { BlogSeo } from '@/components/SEO'
5+
import Image from '@/components/Image'
56
import Tag from '@/components/Tag'
67
import siteMetadata from '@/data/siteMetadata'
78

@@ -18,7 +19,7 @@ export default function PostLayout({ frontMatter, authorDetails, next, prev, chi
1819

1920
return (
2021
<SectionContainer>
21-
<BlogSeo url={`${siteMetadata.siteUrl}/blog/${frontMatter.slug}`} {...frontMatter} />
22+
<BlogSeo url={`${siteMetadata.siteUrl}/blog/${slug}`} {...frontMatter} />
2223
<article>
2324
<div className="xl:divide-y xl:divide-gray-200 xl:dark:divide-gray-700">
2425
<header className="pt-6 xl:pb-6">
@@ -49,7 +50,13 @@ export default function PostLayout({ frontMatter, authorDetails, next, prev, chi
4950
{authorDetails.map((author) => (
5051
<li className="flex items-center space-x-2" key={author.name}>
5152
{author.avatar && (
52-
<img src={author.avatar} alt="avatar" className="w-10 h-10 rounded-full" />
53+
<Image
54+
src={siteMetadata.image}
55+
width="38px"
56+
height="38px"
57+
alt="avatar"
58+
className="w-10 h-10 rounded-full"
59+
/>
5360
)}
5461
<dl className="text-sm font-medium leading-5 whitespace-nowrap">
5562
<dt className="sr-only">Name</dt>

lib/generate-rss.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1+
import { escape } from '@/lib/utils/htmlEscaper'
2+
13
import siteMetadata from '@/data/siteMetadata'
24

35
const generateRssItem = (post) => `
46
<item>
57
<guid>${siteMetadata.siteUrl}/blog/${post.slug}</guid>
6-
<title>${post.title}</title>
8+
<title>${escape(post.title)}</title>
79
<link>${siteMetadata.siteUrl}/blog/${post.slug}</link>
8-
<description>${post.summary}</description>
10+
<description>${escape(post.summary)}</description>
911
<pubDate>${new Date(post.date).toUTCString()}</pubDate>
1012
<author>${siteMetadata.email} (${siteMetadata.author})</author>
1113
${post.tags.map((t) => `<category>${t}</category>`).join('')}
@@ -15,9 +17,9 @@ const generateRssItem = (post) => `
1517
const generateRss = (posts, page = 'index.xml') => `
1618
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
1719
<channel>
18-
<title>${siteMetadata.title}</title>
20+
<title>${escape(siteMetadata.title)}</title>
1921
<link>${siteMetadata.siteUrl}/blog</link>
20-
<description>${siteMetadata.description}</description>
22+
<description>${escape(siteMetadata.description)}</description>
2123
<language>${siteMetadata.language}</language>
2224
<managingEditor>${siteMetadata.email} (${siteMetadata.author})</managingEditor>
2325
<webMaster>${siteMetadata.email} (${siteMetadata.author})</webMaster>

lib/mdx.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,10 @@ export async function getAllFilesFrontMatter(folder) {
9898
files.forEach((file) => {
9999
// Replace is needed to work on Windows
100100
const fileName = file.slice(prefixPaths.length + 1).replace(/\\/g, '/')
101+
// Remove Unexpected File
102+
if (path.extname(fileName) !== '.md' && path.extname(fileName) !== '.mdx') {
103+
return
104+
}
101105
const source = fs.readFileSync(file, 'utf8')
102106
const { data } = matter(source)
103107
if (data.draft !== true) {

lib/utils/htmlEscaper.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
const { replace } = ''
2+
3+
// escape
4+
const es = /&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34);/g
5+
const ca = /[&<>'"]/g
6+
7+
const esca = {
8+
'&': '&amp;',
9+
'<': '&lt;',
10+
'>': '&gt;',
11+
"'": '&#39;',
12+
'"': '&quot;',
13+
}
14+
const pe = (m) => esca[m]
15+
16+
/**
17+
* Safely escape HTML entities such as `&`, `<`, `>`, `"`, and `'`.
18+
* @param {string} es the input to safely escape
19+
* @returns {string} the escaped input, and it **throws** an error if
20+
* the input type is unexpected, except for boolean and numbers,
21+
* converted as string.
22+
*/
23+
export const escape = (es) => replace.call(es, ca, pe)

next.config.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ const withBundleAnalyzer = require('@next/bundle-analyzer')({
55
module.exports = withBundleAnalyzer({
66
reactStrictMode: true,
77
pageExtensions: ['js', 'jsx', 'md', 'mdx'],
8-
future: {
9-
webpack5: true,
8+
eslint: {
9+
dirs: ['pages', 'components', 'lib', 'layouts', 'scripts'],
1010
},
1111
webpack: (config, { dev, isServer }) => {
1212
config.module.rules.push({

0 commit comments

Comments
 (0)