/** * Site-wide app configuration. * * This file pulls from the root "site.config.js" as well as environment variables * for optional depenencies. */ import { parsePageId } from 'notion-utils' import posthog from 'posthog-js' import { getEnv, getSiteConfig } from './get-config-value' import { PageUrlOverridesInverseMap, PageUrlOverridesMap } from './types' import Config = posthog.Config export const rootNotionPageId: string = parsePageId( getSiteConfig('rootNotionPageId'), { uuid: false } ) if (!rootNotionPageId) { throw new Error('Config error invalid "rootNotionPageId"') } // if you want to restrict pages to a single notion workspace (optional) export const rootNotionSpaceId: string | null = parsePageId( getSiteConfig('rootNotionSpaceId', null), { uuid: true } ) export const pageUrlOverrides = cleanPageUrlMap( getSiteConfig('pageUrlOverrides', {}) || {}, { label: 'pageUrlOverrides' } ) export const pageUrlAdditions = cleanPageUrlMap( getSiteConfig('pageUrlAdditions', {}) || {}, { label: 'pageUrlAdditions' } ) export const inversePageUrlOverrides = invertPageUrlOverrides(pageUrlOverrides) export const environment = process.env.NODE_ENV || 'development' export const isDev = environment === 'development' // general site config export const name: string = getSiteConfig('name') export const author: string = getSiteConfig('author') export const domain: string = getSiteConfig('domain') export const description: string = getSiteConfig('description', 'Notion Blog') // social accounts export const twitter: string | null = getSiteConfig('twitter', null) export const zhihu: string | null = getSiteConfig('zhihu', null) export const github: string | null = getSiteConfig('github', null) export const linkedin: string | null = getSiteConfig('linkedin', null) // default notion values for site-wide consistency (optional; may be overridden on a per-page basis) export const defaultPageIcon: string | null = getSiteConfig( 'defaultPageIcon', null ) export const defaultPageCover: string | null = getSiteConfig( 'defaultPageCover', null ) export const defaultPageCoverPosition: number = getSiteConfig( 'defaultPageCoverPosition', 0.5 ) // Optional whether or not to enable support for LQIP preview images export const isPreviewImageSupportEnabled: boolean = getSiteConfig( 'isPreviewImageSupportEnabled', false ) // Optional whether or not to enable support for LQIP preview images export const isTweetEmbedSupportEnabled: boolean = getSiteConfig( 'isTweetEmbedSupportEnabled', true ) // where it all starts -- the site's root Notion page export const includeNotionIdInUrls: boolean = getSiteConfig( 'includeNotionIdInUrls', !!isDev ) // ---------------------------------------------------------------------------- // Optional redis instance for persisting preview images export const isRedisEnabled: boolean = getSiteConfig('isRedisEnabled', false) || !!getEnv('REDIS_ENABLED', null) // (if you want to enable redis, only REDIS_HOST and REDIS_PASSWORD are required) // we recommend that you store these in a local `.env` file export const redisHost: string | null = getEnv('REDIS_HOST', null) export const redisPassword: string | null = getEnv('REDIS_PASSWORD', null) export const redisUser: string = getEnv('REDIS_USER', 'default') export const redisUrl = getEnv( 'REDIS_URL', `redis://${redisUser}:${redisPassword}@${redisHost}` ) export const redisNamespace: string | null = getEnv( 'REDIS_NAMESPACE', 'preview-images' ) // ---------------------------------------------------------------------------- export const isServer = typeof window === 'undefined' export const port = getEnv('PORT', '3000') export const host = isDev ? `http://localhost:${port}` : `https://${domain}` export const apiBaseUrl = `/api` export const api = { searchNotion: `${apiBaseUrl}/search-notion` } // ---------------------------------------------------------------------------- export const fathomId = isDev ? null : process.env.NEXT_PUBLIC_FATHOM_ID export const fathomConfig = fathomId ? { excludedDomains: ['localhost', 'localhost:3000'] } : undefined // PostHog automatically filters events coming from localhost export const postHogId = process.env.NEXT_PUBLIC_POSTHOG_ID export const postHogConfig: Config = { // See https://posthog.com/docs/integrate/client/js#config api_host: 'https://app.posthog.com', loaded: (posthog_instance) => { console.debug(`PostHog loaded`, posthog_instance) // posthog_instance.identify(unique user id) } } function cleanPageUrlMap( pageUrlMap: PageUrlOverridesMap, { label }: { label: string } ): PageUrlOverridesMap { return Object.keys(pageUrlMap).reduce((acc, uri) => { const pageId = pageUrlMap[uri] const uuid = parsePageId(pageId, { uuid: false }) if (!uuid) { throw new Error(`Invalid ${label} page id "${pageId}"`) } if (!uri) { throw new Error(`Missing ${label} value for page "${pageId}"`) } if (!uri.startsWith('/')) { throw new Error( `Invalid ${label} value for page "${pageId}": value "${uri}" should be a relative URI that starts with "/"` ) } const path = uri.slice(1) return { ...acc, [path]: uuid } }, {}) } function invertPageUrlOverrides( pageUrlOverrides: PageUrlOverridesMap ): PageUrlOverridesInverseMap { return Object.keys(pageUrlOverrides).reduce((acc, uri) => { const pageId = pageUrlOverrides[uri] return { ...acc, [pageId]: uri } }, {}) }