full running
This commit is contained in:
1 parent
3daa9f82e7
commit
4fb41de0f1
8 files changed
+139
-8
No files matched your search
@@ -2,15 +2,24 @@ import type { ITheme } from '~/server/theme'
|
||||
|
||||
export const THEME: ITheme = JSON.parse(process.env.THEME!)
|
||||
|
||||
export const api = async (
|
||||
export async function api<T = any>(
|
||||
url: string,
|
||||
opts: RequestInit & {
|
||||
params?: Record<string, any>
|
||||
} = {}
|
||||
) => {
|
||||
): Promise<
|
||||
| T
|
||||
| {
|
||||
error: {
|
||||
statusCode: number
|
||||
message: unknown
|
||||
}
|
||||
}
|
||||
> {
|
||||
if (!url.startsWith('/api')) {
|
||||
return {
|
||||
error: {
|
||||
statusCode: 500,
|
||||
message: 'malformed API route',
|
||||
},
|
||||
}
|
||||
@@ -24,6 +33,9 @@ export const api = async (
|
||||
baseURL.pathname = url
|
||||
Object.entries(opts.params || {}).map(([k, v]) => {
|
||||
if (v) {
|
||||
/**
|
||||
* Arrays will be comma separated, and empty strings will be discarded.
|
||||
*/
|
||||
baseURL.searchParams.set(k, v)
|
||||
}
|
||||
})
|
||||
@@ -34,8 +46,25 @@ export const api = async (
|
||||
/**
|
||||
* Does not rely on `r.ok`, but rather, errorhandler
|
||||
*/
|
||||
return r.json()
|
||||
} catch (_) {}
|
||||
const data = await r.json()
|
||||
|
||||
/**
|
||||
* Transform to Nuxt-compatible style
|
||||
*/
|
||||
if (data.error) {
|
||||
return {
|
||||
error: {
|
||||
statusCode: r.status,
|
||||
message: data,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
return data
|
||||
} catch (e) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.error(e)
|
||||
}
|
||||
|
||||
return {
|
||||
error: {
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
/* eslint-disable camelcase */
|
||||
|
||||
import { THEME } from './global'
|
||||
|
||||
export type Theme = 'light' | 'dark'
|
||||
|
||||
export interface CommentsConfig {
|
||||
host: string
|
||||
site_id: string
|
||||
url?: string
|
||||
max_shown_comments?: number
|
||||
theme?: Theme
|
||||
page_title?: string
|
||||
node?: string | HTMLElement
|
||||
locale?: string
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
__colors__?: any
|
||||
}
|
||||
|
||||
declare global {
|
||||
interface Window {
|
||||
remark_config: CommentsConfig
|
||||
REMARK42: {
|
||||
changeTheme(theme: Theme): void
|
||||
destroy?: () => void
|
||||
createInstance: (
|
||||
remark_config: CommentsConfig
|
||||
) =>
|
||||
| {
|
||||
changeTheme(theme: Theme): void
|
||||
destroy(): void
|
||||
}
|
||||
| undefined
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (process.browser && THEME?.comment?.remark42) {
|
||||
;(function (c) {
|
||||
for (let i = 0; i < c.length; i++) {
|
||||
const d = document
|
||||
const s = d.createElement('script')
|
||||
s.src = THEME.comment.remark42.host + '/web/' + c[i] + '.js'
|
||||
s.defer = true
|
||||
;(d.head || d.body).appendChild(s)
|
||||
}
|
||||
})(['embed'])
|
||||
}
|
||||
Reference in new issue
Block a user