Skip to content

Commit 784c0fc

Browse files
feat: update deps; fix eslint issues; fix bug with collections
1 parent b858110 commit 784c0fc

35 files changed

+2158
-2003
lines changed

.prettierignore

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,3 @@ dist/
44
node_modules/
55
.next/
66
.vercel/
7-
8-
.demo/
9-
.renderer/

.prettierrc

Lines changed: 0 additions & 11 deletions
This file was deleted.

components/Footer.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export function FooterImpl() {
2222
const currentYear = new Date().getFullYear()
2323

2424
const onToggleDarkMode = React.useCallback(
25-
(e) => {
25+
(e: any) => {
2626
e.preventDefault()
2727
toggleDarkMode()
2828
},

components/NotionPage.tsx

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,36 +39,67 @@ const Code = dynamic(() =>
3939
import('react-notion-x/build/third-party/code').then(async (m) => {
4040
// add / remove any prism syntaxes here
4141
await Promise.allSettled([
42+
// @ts-expect-error Ignore prisma types
4243
import('prismjs/components/prism-markup-templating.js'),
44+
// @ts-expect-error Ignore prisma types
4345
import('prismjs/components/prism-markup.js'),
46+
// @ts-expect-error Ignore prisma types
4447
import('prismjs/components/prism-bash.js'),
48+
// @ts-expect-error Ignore prisma types
4549
import('prismjs/components/prism-c.js'),
50+
// @ts-expect-error Ignore prisma types
4651
import('prismjs/components/prism-cpp.js'),
52+
// @ts-expect-error Ignore prisma types
4753
import('prismjs/components/prism-csharp.js'),
54+
// @ts-expect-error Ignore prisma types
4855
import('prismjs/components/prism-docker.js'),
56+
// @ts-expect-error Ignore prisma types
4957
import('prismjs/components/prism-java.js'),
58+
// @ts-expect-error Ignore prisma types
5059
import('prismjs/components/prism-js-templates.js'),
60+
// @ts-expect-error Ignore prisma types
5161
import('prismjs/components/prism-coffeescript.js'),
62+
// @ts-expect-error Ignore prisma types
5263
import('prismjs/components/prism-diff.js'),
64+
// @ts-expect-error Ignore prisma types
5365
import('prismjs/components/prism-git.js'),
66+
// @ts-expect-error Ignore prisma types
5467
import('prismjs/components/prism-go.js'),
68+
// @ts-expect-error Ignore prisma types
5569
import('prismjs/components/prism-graphql.js'),
70+
// @ts-expect-error Ignore prisma types
5671
import('prismjs/components/prism-handlebars.js'),
72+
// @ts-expect-error Ignore prisma types
5773
import('prismjs/components/prism-less.js'),
74+
// @ts-expect-error Ignore prisma types
5875
import('prismjs/components/prism-makefile.js'),
76+
// @ts-expect-error Ignore prisma types
5977
import('prismjs/components/prism-markdown.js'),
78+
// @ts-expect-error Ignore prisma types
6079
import('prismjs/components/prism-objectivec.js'),
80+
// @ts-expect-error Ignore prisma types
6181
import('prismjs/components/prism-ocaml.js'),
82+
// @ts-expect-error Ignore prisma types
6283
import('prismjs/components/prism-python.js'),
84+
// @ts-expect-error Ignore prisma types
6385
import('prismjs/components/prism-reason.js'),
86+
// @ts-expect-error Ignore prisma types
6487
import('prismjs/components/prism-rust.js'),
88+
// @ts-expect-error Ignore prisma types
6589
import('prismjs/components/prism-sass.js'),
90+
// @ts-expect-error Ignore prisma types
6691
import('prismjs/components/prism-scss.js'),
92+
// @ts-expect-error Ignore prisma types
6793
import('prismjs/components/prism-solidity.js'),
94+
// @ts-expect-error Ignore prisma types
6895
import('prismjs/components/prism-sql.js'),
96+
// @ts-expect-error Ignore prisma types
6997
import('prismjs/components/prism-stylus.js'),
98+
// @ts-expect-error Ignore prisma types
7099
import('prismjs/components/prism-swift.js'),
100+
// @ts-expect-error Ignore prisma types
71101
import('prismjs/components/prism-wasm.js'),
102+
// @ts-expect-error Ignore prisma types
72103
import('prismjs/components/prism-yaml.js')
73104
])
74105
return m.Code
@@ -112,7 +143,7 @@ function Tweet({ id }: { id: string }) {
112143
}
113144

114145
const propertyLastEditedTimeValue = (
115-
{ block, pageHeader },
146+
{ block, pageHeader }: any,
116147
defaultFn: () => React.ReactNode
117148
) => {
118149
if (pageHeader && block?.last_edited_time) {
@@ -125,7 +156,7 @@ const propertyLastEditedTimeValue = (
125156
}
126157

127158
const propertyDateValue = (
128-
{ data, schema, pageHeader },
159+
{ data, schema, pageHeader }: any,
129160
defaultFn: () => React.ReactNode
130161
) => {
131162
if (pageHeader && schema?.name?.toLowerCase() === 'published') {
@@ -142,7 +173,7 @@ const propertyDateValue = (
142173
}
143174

144175
const propertyTextValue = (
145-
{ schema, pageHeader },
176+
{ schema, pageHeader }: any,
146177
defaultFn: () => React.ReactNode
147178
) => {
148179
if (pageHeader && schema?.name?.toLowerCase() === 'author') {
@@ -189,11 +220,11 @@ export function NotionPage({
189220
if (lite) params.lite = lite
190221

191222
const searchParams = new URLSearchParams(params)
192-
return mapPageUrl(site, recordMap, searchParams)
223+
return site ? mapPageUrl(site, recordMap!, searchParams) : undefined
193224
}, [site, recordMap, lite])
194225

195226
const keys = Object.keys(recordMap?.block || {})
196-
const block = recordMap?.block?.[keys[0]]?.value
227+
const block = recordMap?.block?.[keys[0]!]?.value
197228

198229
// const isRootPage =
199230
// parsePageId(block?.id) === parsePageId(site?.rootNotionPageId)
@@ -205,7 +236,11 @@ export function NotionPage({
205236

206237
const pageAside = React.useMemo(
207238
() => (
208-
<PageAside block={block} recordMap={recordMap} isBlogPost={isBlogPost} />
239+
<PageAside
240+
block={block!}
241+
recordMap={recordMap!}
242+
isBlogPost={isBlogPost}
243+
/>
209244
),
210245
[block, recordMap, isBlogPost]
211246
)
@@ -238,8 +273,9 @@ export function NotionPage({
238273
g.block = block
239274
}
240275

241-
const canonicalPageUrl =
242-
!config.isDev && getCanonicalPageUrl(site, recordMap)(pageId)
276+
const canonicalPageUrl = config.isDev
277+
? undefined
278+
: getCanonicalPageUrl(site, recordMap)(pageId)
243279

244280
const socialImage = mapImageUrl(
245281
getPageProperty<string>('Social Image', block, recordMap) ||
@@ -286,7 +322,7 @@ export function NotionPage({
286322
defaultPageCoverPosition={config.defaultPageCoverPosition}
287323
mapPageUrl={siteMapPageUrl}
288324
mapImageUrl={mapImageUrl}
289-
searchNotion={config.isSearchEnabled ? searchNotion : null}
325+
searchNotion={config.isSearchEnabled ? searchNotion : undefined}
290326
pageAside={pageAside}
291327
footer={footer}
292328
/>

components/NotionPageHeader.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ export function NotionPageHeader({
5151
<div className='notion-nav-header-rhs breadcrumbs'>
5252
{navigationLinks
5353
?.map((link, index) => {
54-
if (!link.pageId && !link.url) {
54+
if (!link?.pageId && !link?.url) {
5555
return null
5656
}
5757

components/styles.module.css

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919
line-height: 1.5;
2020
color: rgb(55, 53, 47);
2121
caret-color: rgb(55, 53, 47);
22-
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica,
22+
font-family:
23+
-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica,
2324
'Apple Color Emoji', Arial, sans-serif, 'Segoe UI Emoji', 'Segoe UI Symbol';
2425
background-color: var(--bg-color);
2526
}

eslint.config.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { config } from '@fisch0920/config/eslint'
2+
3+
export default [
4+
...config,
5+
{
6+
files: ['**/*.ts', '**/*.tsx'],
7+
rules: {
8+
'react/prop-types': 'off',
9+
'unicorn/no-array-reduce': 'off',
10+
'unicorn/filename-case': 'off',
11+
'unicorn/prefer-global-this': 'off',
12+
'no-process-env': 'off',
13+
'array-callback-return': 'off',
14+
'jsx-a11y/click-events-have-key-events': 'off',
15+
'jsx-a11y/no-static-element-interactions': 'off',
16+
'jsx-a11y/media-has-caption': 'off',
17+
'jsx-a11y/interactive-supports-focus': 'off',
18+
'jsx-a11y/anchor-is-valid': 'off',
19+
'@typescript-eslint/naming-convention': 'off'
20+
}
21+
}
22+
]

lib/acl.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ export async function pageAcl({
44
site,
55
recordMap,
66
pageId
7-
}: PageProps): Promise<PageProps> {
7+
}: PageProps): Promise<PageProps | undefined> {
88
if (!site) {
99
return {
1010
error: {

lib/config.ts

Lines changed: 33 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,11 @@
77
import { parsePageId } from 'notion-utils'
88
import { type PostHogConfig } from 'posthog-js'
99

10-
import { getEnv, getSiteConfig } from './get-config-value'
10+
import {
11+
getEnv,
12+
getRequiredSiteConfig,
13+
getSiteConfig
14+
} from './get-config-value'
1115
import { type NavigationLink } from './site-config'
1216
import {
1317
type NavigationStyle,
@@ -19,17 +23,15 @@ import {
1923
export const rootNotionPageId: string = parsePageId(
2024
getSiteConfig('rootNotionPageId'),
2125
{ uuid: false }
22-
)
26+
)!
2327

2428
if (!rootNotionPageId) {
2529
throw new Error('Config error invalid "rootNotionPageId"')
2630
}
2731

2832
// if you want to restrict pages to a single notion workspace (optional)
29-
export const rootNotionSpaceId: string | null = parsePageId(
30-
getSiteConfig('rootNotionSpaceId', null),
31-
{ uuid: true }
32-
)
33+
export const rootNotionSpaceId: string | null =
34+
parsePageId(getSiteConfig('rootNotionSpaceId'), { uuid: true }) ?? null
3335

3436
export const pageUrlOverrides = cleanPageUrlMap(
3537
getSiteConfig('pageUrlOverrides', {}) || {},
@@ -47,24 +49,24 @@ export const environment = process.env.NODE_ENV || 'development'
4749
export const isDev = environment === 'development'
4850

4951
// general site config
50-
export const name: string = getSiteConfig('name')
51-
export const author: string = getSiteConfig('author')
52-
export const domain: string = getSiteConfig('domain')
52+
export const name: string = getRequiredSiteConfig('name')
53+
export const author: string = getRequiredSiteConfig('author')
54+
export const domain: string = getRequiredSiteConfig('domain')
5355
export const description: string = getSiteConfig('description', 'Notion Blog')
5456
export const language: string = getSiteConfig('language', 'en')
5557

5658
// social accounts
57-
export const twitter: string | null = getSiteConfig('twitter', null)
58-
export const mastodon: string | null = getSiteConfig('mastodon', null)
59-
export const github: string | null = getSiteConfig('github', null)
60-
export const youtube: string | null = getSiteConfig('youtube', null)
61-
export const linkedin: string | null = getSiteConfig('linkedin', null)
62-
export const newsletter: string | null = getSiteConfig('newsletter', null)
63-
export const zhihu: string | null = getSiteConfig('zhihu', null)
64-
65-
export const getMastodonHandle = (): string | null => {
59+
export const twitter: string | undefined = getSiteConfig('twitter')
60+
export const mastodon: string | undefined = getSiteConfig('mastodon')
61+
export const github: string | undefined = getSiteConfig('github')
62+
export const youtube: string | undefined = getSiteConfig('youtube')
63+
export const linkedin: string | undefined = getSiteConfig('linkedin')
64+
export const newsletter: string | undefined = getSiteConfig('newsletter')
65+
export const zhihu: string | undefined = getSiteConfig('zhihu')
66+
67+
export const getMastodonHandle = (): string | undefined => {
6668
if (!mastodon) {
67-
return null
69+
return
6870
}
6971

7072
// Since Mastodon is decentralized, handles include the instance domain name.
@@ -74,14 +76,10 @@ export const getMastodonHandle = (): string | null => {
7476
}
7577

7678
// default notion values for site-wide consistency (optional; may be overridden on a per-page basis)
77-
export const defaultPageIcon: string | null = getSiteConfig(
78-
'defaultPageIcon',
79-
null
80-
)
81-
export const defaultPageCover: string | null = getSiteConfig(
82-
'defaultPageCover',
83-
null
84-
)
79+
export const defaultPageIcon: string | undefined =
80+
getSiteConfig('defaultPageIcon')
81+
export const defaultPageCover: string | undefined =
82+
getSiteConfig('defaultPageCover')
8583
export const defaultPageCoverPosition: number = getSiteConfig(
8684
'defaultPageCoverPosition',
8785
0.5
@@ -104,7 +102,7 @@ export const navigationStyle: NavigationStyle = getSiteConfig(
104102
'default'
105103
)
106104

107-
export const navigationLinks: Array<NavigationLink | null> = getSiteConfig(
105+
export const navigationLinks: Array<NavigationLink | undefined> = getSiteConfig(
108106
'navigationLinks',
109107
null
110108
)
@@ -115,19 +113,18 @@ export const isSearchEnabled: boolean = getSiteConfig('isSearchEnabled', true)
115113
// ----------------------------------------------------------------------------
116114

117115
// Optional redis instance for persisting preview images
118-
export const isRedisEnabled: boolean =
119-
getSiteConfig('isRedisEnabled', false) || !!getEnv('REDIS_ENABLED', null)
116+
export const isRedisEnabled: boolean = getSiteConfig('isRedisEnabled', false)
120117

121118
// (if you want to enable redis, only REDIS_HOST and REDIS_PASSWORD are required)
122119
// we recommend that you store these in a local `.env` file
123-
export const redisHost: string | null = getEnv('REDIS_HOST', null)
124-
export const redisPassword: string | null = getEnv('REDIS_PASSWORD', null)
125-
export const redisUser: string = getEnv('REDIS_USER', 'default')
120+
export const redisHost: string | undefined = getEnv('REDIS_HOST')
121+
export const redisPassword: string | undefined = getEnv('REDIS_PASSWORD')
122+
export const redisUser: string | undefined = getEnv('REDIS_USER', 'default')
126123
export const redisUrl = getEnv(
127124
'REDIS_URL',
128125
`redis://${redisUser}:${redisPassword}@${redisHost}`
129126
)
130-
export const redisNamespace: string | null = getEnv(
127+
export const redisNamespace: string | undefined = getEnv(
131128
'REDIS_NAMESPACE',
132129
'preview-images'
133130
)
@@ -160,7 +157,7 @@ export const site: Site = {
160157
description
161158
}
162159

163-
export const fathomId = isDev ? null : process.env.NEXT_PUBLIC_FATHOM_ID
160+
export const fathomId = isDev ? undefined : process.env.NEXT_PUBLIC_FATHOM_ID
164161
export const fathomConfig = fathomId
165162
? {
166163
excludedDomains: ['localhost', 'localhost:3000']
@@ -211,7 +208,7 @@ function invertPageUrlOverrides(
211208
pageUrlOverrides: PageUrlOverridesMap
212209
): PageUrlOverridesInverseMap {
213210
return Object.keys(pageUrlOverrides).reduce((acc, uri) => {
214-
const pageId = pageUrlOverrides[uri]
211+
const pageId = pageUrlOverrides[uri]!
215212

216213
return {
217214
...acc,

lib/db.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { isRedisEnabled, redisNamespace, redisUrl } from './config'
55

66
let db: Keyv
77
if (isRedisEnabled) {
8-
const keyvRedis = new KeyvRedis(redisUrl)
8+
const keyvRedis = new KeyvRedis(redisUrl!)
99
db = new Keyv({ store: keyvRedis, namespace: redisNamespace || undefined })
1010
} else {
1111
db = new Keyv()

0 commit comments

Comments
 (0)