import { Marked } from 'marked'; import { MarkedOptions } from 'marked'; /** * 通用操作按钮 */ declare class ActionBtn { private opts; $el: HTMLElement; isLoading: boolean; msgRecTimer?: number; msgRecTimerFunc?: () => void; get isMessaging(): boolean; isConfirming: boolean; confirmRecTimer?: number; /** 构造函数 */ constructor(opts: ActionBtnOptions | string | (() => string)); /** 将按钮装载到指定元素 */ appendTo(dom: HTMLElement): this; /** 获取按钮文字(动态/静态) */ private getText; /** 设置点击事件 */ setClick(func: () => void): void; /** 文字刷新(动态/静态) */ updateText(text?: (() => string) | string): void; /** 设置加载状态 */ setLoading(value: boolean, loadingText?: string): void; /** 错误消息 */ setError(text: string): void; /** 警告消息 */ setWarn(text: string): void; /** 成功消息 */ setSuccess(text: string): void; /** 设置消息 */ setMsg(text: string, className?: string, duringTime?: number, after?: () => void): void; /** 设置消息复原操作定时器 */ private setMsgRecTimer; /** 立刻触发器复原定时器 */ private fireMsgRecTimer; /** 仅清除 timer */ private clearMsgRecTimer; } declare interface ActionBtnOptions { /** 按钮文字 (动态/静态) */ text: (() => string) | string; /** 仅管理员可用 */ adminOnly?: boolean; /** 确认操作 */ confirm?: boolean; /** 确认时提示文字 */ confirmText?: string; } export declare class Api extends Api_2 { private _opts; constructor(opts: ApiOptions); /** * Get user info as params for request * * @returns Request params with user info */ getUserFields(): { name: string; email: string; } | undefined; } /** * @title Artalk API * @version 2.0 * @license MIT (https://github.com/ArtalkJS/Artalk/blob/master/LICENSE) * @baseUrl /api/v2 * @contact API Support (https://artalk.js.org) * * Artalk is a modern comment system based on Golang. */ declare class Api_2 extends HttpClient { auth: { /** * @description Login by email with verify code (Need send email verify code first) or password * * @tags Auth * @name LoginByEmail * @summary Login by email * @request POST:/auth/email/login * @response `200` `HandlerResponseUserLogin` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ loginByEmail: (data: HandlerRequestAuthEmailLogin, params?: RequestParams) => Promise>; /** * @description Register by email and verify code (if user exists, will update user, like forget or change password. Need send email verify code first) * * @tags Auth * @name RegisterByEmail * @summary Register by email * @request POST:/auth/email/register * @response `200` `HandlerResponseUserLogin` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ registerByEmail: (data: HandlerRequestAuthEmailRegister, params?: RequestParams) => Promise>; /** * @description Send email including verify code to user * * @tags Auth * @name SendVerifyEmail * @summary Send verify email * @request POST:/auth/email/send * @response `200` `(HandlerMap & { msg?: string, })` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ sendVerifyEmail: (data: HandlerRequestAuthEmailSend, params?: RequestParams) => Promise>; /** * @description Get all users with same email, if there are more than one user with same email, need merge * * @tags Auth * @name CheckDataMerge * @summary Check data merge * @request GET:/auth/merge * @secure * @response `200` `HandlerResponseAuthDataMergeCheck` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ checkDataMerge: (params?: RequestParams) => Promise>; /** * @description This function is to solve the problem of multiple users with the same email address, should be called after user login and then check, and perform data merge. * * @tags Auth * @name ApplyDataMerge * @summary Apply data merge * @request POST:/auth/merge * @secure * @response `200` `HandlerResponseAuthDataMergeApply` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ applyDataMerge: (data: HandlerRequestAuthDataMergeApply, params?: RequestParams) => Promise>; }; cache: { /** * @description Flush all cache on the server * * @tags Cache * @name FlushCache * @summary Flush Cache * @request POST:/cache/flush * @secure * @response `200` `(HandlerMap & { msg?: string, })` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request * @response `403` `(HandlerMap & { msg?: string, })` Forbidden */ flushCache: (params?: RequestParams) => Promise>; /** * @description Cache warming helps you to pre-load the cache to improve the performance of the first request * * @tags Cache * @name WarmUpCache * @summary Warm-Up Cache * @request POST:/cache/warm_up * @secure * @response `200` `(HandlerMap & { msg?: string, })` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request * @response `403` `(HandlerMap & { msg?: string, })` Forbidden */ warmUpCache: (params?: RequestParams) => Promise>; }; captcha: { /** * @description Get a base64 encoded captcha image or a HTML page to verify for user * * @tags Captcha * @name GetCaptcha * @summary Get Captcha * @request GET:/captcha * @response `200` `HandlerResponseCaptchaGet` OK * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ getCaptcha: (params?: RequestParams) => Promise>; /** * @description Get the status of the user's captcha verification * * @tags Captcha * @name GetCaptchaStatus * @summary Get Captcha Status * @request GET:/captcha/status * @response `200` `HandlerResponseCaptchaStatus` OK */ getCaptchaStatus: (params?: RequestParams) => Promise>; /** * @description Verify user enters correct captcha code * * @tags Captcha * @name VerifyCaptcha * @summary Verify Captcha * @request POST:/captcha/verify * @response `200` `HandlerMap` OK * @response `403` `(HandlerMap & { img_data?: string, })` Forbidden */ verifyCaptcha: (data: HandlerParamsCaptchaVerify, params?: RequestParams) => Promise>; }; comments: { /** * @description Get a list of comments by some conditions * * @tags Comment * @name GetComments * @summary Get Comment List * @request GET:/comments * @secure * @response `200` `HandlerResponseCommentList` OK * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ getComments: (query: { /** The user email */ email?: string; /** Enable flat_mode */ flat_mode?: boolean; /** The limit for pagination */ limit?: number; /** The username */ name?: string; /** The offset for pagination */ offset?: number; /** The comment page_key */ page_key: string; /** The scope of comments */ scope?: "page" | "user" | "site"; /** Search keywords */ search?: string; /** The site name of your content scope */ site_name?: string; /** Sort by condition */ sort_by?: "date_asc" | "date_desc" | "vote"; /** Message center show type */ type?: "all" | "mentions" | "mine" | "pending"; /** Only show comments by admin */ view_only_admin?: boolean; }, params?: RequestParams) => Promise>; /** * @description Create a new comment * * @tags Comment * @name CreateComment * @summary Create Comment * @request POST:/comments * @secure * @response `200` `HandlerResponseCommentCreate` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ createComment: (comment: HandlerParamsCommentCreate, params?: RequestParams) => Promise>; /** * @description Get the detail of a comment by comment id * * @tags Comment * @name GetComment * @summary Get a comment * @request GET:/comments/{id} * @response `200` `HandlerResponseCommentGet` OK * @response `404` `(HandlerMap & { msg?: string, })` Not Found * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ getComment: (id: number, params?: RequestParams) => Promise>; /** * @description Update a specific comment * * @tags Comment * @name UpdateComment * @summary Update Comment * @request PUT:/comments/{id} * @secure * @response `200` `HandlerResponseCommentUpdate` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request * @response `403` `(HandlerMap & { msg?: string, })` Forbidden * @response `404` `(HandlerMap & { msg?: string, })` Not Found * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ updateComment: (id: number, comment: HandlerParamsCommentUpdate, params?: RequestParams) => Promise>; /** * @description Delete a specific comment * * @tags Comment * @name DeleteComment * @summary Delete Comment * @request DELETE:/comments/{id} * @secure * @response `200` `HandlerMap` OK * @response `403` `(HandlerMap & { msg?: string, })` Forbidden * @response `404` `(HandlerMap & { msg?: string, })` Not Found * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ deleteComment: (id: number, params?: RequestParams) => Promise>; }; conf: { /** * @description Get System Configs for UI * * @tags System * @name Conf * @summary Get System Configs * @request GET:/conf * @response `200` `CommonConfData` OK */ conf: (params?: RequestParams) => Promise>; /** * @description Get social login providers * * @tags System * @name GetSocialLoginProviders * @summary Get Social Login Providers * @request GET:/conf/auth/providers * @response `200` `HandlerResponseConfAuthProviders` OK * @response `404` `(HandlerMap & { msg?: string, })` Not Found */ getSocialLoginProviders: (params?: RequestParams) => Promise>; /** * @description Get Domain Info * * @tags System * @name GetDomain * @summary Get Domain Info * @request GET:/conf/domain * @response `200` `HandlerResponseConfDomain` OK */ getDomain: (query?: { /** Domain URL */ url?: string; }, params?: RequestParams) => Promise>; }; notifies: { /** * @description Get a list of notifies for user * * @tags Notify * @name GetNotifies * @summary Get Notifies * @request GET:/notifies * @response `200` `HandlerResponseNotifyList` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ getNotifies: (query: { /** The user email */ email: string; /** The user name */ name: string; }, params?: RequestParams) => Promise>; /** * @description Mark all notifies as read for user * * @tags Notify * @name MarkAllNotifyRead * @summary Mark All Notifies as Read * @request POST:/notifies/read * @response `200` `HandlerMap` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ markAllNotifyRead: (options: HandlerParamsNotifyReadAll, params?: RequestParams) => Promise>; /** * @description Mark specific notification as read for user * * @tags Notify * @name MarkNotifyRead * @summary Mark Notify as Read * @request POST:/notifies/{comment_id}/{notify_key} * @response `200` `HandlerMap` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request * @response `404` `(HandlerMap & { msg?: string, })` Not Found * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ markNotifyRead: (commentId: number, notifyKey: string, params?: RequestParams) => Promise>; }; pages: { /** * @description Get a list of pages by some conditions * * @tags Page * @name GetPages * @summary Get Page List * @request GET:/pages * @secure * @response `200` `HandlerResponsePageList` OK * @response `403` `(HandlerMap & { msg?: string, })` Forbidden */ getPages: (query?: { /** The limit for pagination */ limit?: number; /** The offset for pagination */ offset?: number; /** Search keywords */ search?: string; /** The site name of your content scope */ site_name?: string; }, params?: RequestParams) => Promise>; /** * @description Fetch the data of all pages * * @tags Page * @name FetchAllPages * @summary Fetch All Pages Data * @request POST:/pages/fetch * @secure * @response `200` `HandlerMap` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ fetchAllPages: (options: HandlerParamsPageFetchAll, params?: RequestParams) => Promise>; /** * @description Get the status of the task of fetching all pages * * @tags Page * @name GetPageFetchStatus * @summary Get Pages Fetch Status * @request GET:/pages/fetch/status * @secure * @response `200` `HandlerResponsePageFetchStatus` OK */ getPageFetchStatus: (params?: RequestParams) => Promise>; /** * @description Increase and get the number of page views * * @tags Page * @name LogPv * @summary Increase Page Views (PV) * @request POST:/pages/pv * @response `200` `HandlerResponsePagePV` OK */ logPv: (page: HandlerParamsPagePV, params?: RequestParams) => Promise>; /** * @description Update a specific page * * @tags Page * @name UpdatePage * @summary Update Page * @request PUT:/pages/{id} * @secure * @response `200` `HandlerResponsePageUpdate` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request * @response `403` `(HandlerMap & { msg?: string, })` Forbidden * @response `404` `(HandlerMap & { msg?: string, })` Not Found * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ updatePage: (id: number, page: HandlerParamsPageUpdate, params?: RequestParams) => Promise>; /** * @description Delete a specific page * * @tags Page * @name DeletePage * @summary Delete Page * @request DELETE:/pages/{id} * @secure * @response `200` `HandlerMap` OK * @response `403` `(HandlerMap & { msg?: string, })` Forbidden * @response `404` `(HandlerMap & { msg?: string, })` Not Found * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ deletePage: (id: number, params?: RequestParams) => Promise>; /** * @description Fetch the data of a specific page * * @tags Page * @name FetchPage * @summary Fetch Page Data * @request POST:/pages/{id}/fetch * @secure * @response `200` `HandlerResponsePageFetch` OK * @response `404` `(HandlerMap & { msg?: string, })` Not Found * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ fetchPage: (id: number, params?: RequestParams) => Promise>; }; sendEmail: { /** * @description Send an email to test the email sender * * @tags System * @name SendEmail * @summary Send Email * @request POST:/send_email * @secure * @response `200` `HandlerMap` OK * @response `403` `(HandlerMap & { msg?: string, })` Forbidden * @response `500` `HandlerMap` Internal Server Error */ sendEmail: (email: HandlerParamsEmailSend, params?: RequestParams) => Promise>; }; settings: { /** * @description Get settings from app config file * * @tags System * @name GetSettings * @summary Get Settings * @request GET:/settings * @secure * @response `200` `HandlerResponseSettingGet` OK * @response `403` `(HandlerMap & { msg?: string, })` Forbidden * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ getSettings: (params?: RequestParams) => Promise>; /** * @description Apply settings and restart the server * * @tags System * @name ApplySettings * @summary Save and apply Settings * @request PUT:/settings * @secure * @response `200` `HandlerMap` OK * @response `403` `(HandlerMap & { msg?: string, })` Forbidden * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ applySettings: (settings: HandlerParamsSettingApply, params?: RequestParams) => Promise>; /** * @description Get config templates in different languages for rendering the settings page in the frontend * * @tags System * @name GetSettingsTemplate * @summary Get Settings Template * @request GET:/settings/template/{locale} * @secure * @response `200` `HandlerResponseSettingTemplate` OK */ getSettingsTemplate: (locale: string, params?: RequestParams) => Promise>; }; sites: { /** * @description Get a list of sites by some conditions * * @tags Site * @name GetSites * @summary Get Site List * @request GET:/sites * @secure * @response `200` `HandlerResponseSiteList` OK */ getSites: (params?: RequestParams) => Promise>; /** * @description Create a new site * * @tags Site * @name CreateSite * @summary Create Site * @request POST:/sites * @secure * @response `200` `HandlerResponseSiteCreate` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request * @response `403` `(HandlerMap & { msg?: string, })` Forbidden * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ createSite: (site: HandlerParamsSiteCreate, params?: RequestParams) => Promise>; /** * @description Update a specific site * * @tags Site * @name UpdateSite * @summary Update Site * @request PUT:/sites/{id} * @secure * @response `200` `HandlerResponseSiteUpdate` OK */ updateSite: (id: number, site: HandlerParamsSiteUpdate, params?: RequestParams) => Promise>; /** * @description Delete a specific site * * @tags Site * @name DeleteSite * @summary Site Delete * @request DELETE:/sites/{id} * @secure * @response `200` `HandlerMap` OK * @response `403` `(HandlerMap & { msg?: string, })` Forbidden * @response `404` `(HandlerMap & { msg?: string, })` Not Found * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ deleteSite: (id: number, params?: RequestParams) => Promise>; }; stats: { /** * @description Get the statistics of various data analysis * * @tags Statistic * @name GetStats * @summary Statistic * @request GET:/stats/{type} * @response `200` `CommonJSONResult` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request * @response `403` `(HandlerMap & { msg?: string, })` Forbidden * @response `404` `(HandlerMap & { msg?: string, })` Not Found * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ getStats: (type: "latest_comments" | "latest_pages" | "pv_most_pages" | "comment_most_pages" | "page_pv" | "site_pv" | "page_comment" | "site_comment" | "rand_comments" | "rand_pages", query?: { /** The limit for pagination */ limit?: number; /** multiple page keys separated by commas */ page_keys?: string; /** The site name of your content scope */ site_name?: string; }, params?: RequestParams) => Promise>; }; transfer: { /** * @description Export data from Artalk * * @tags Transfer * @name ExportArtrans * @summary Export Artrans * @request GET:/transfer/export * @secure * @response `200` `HandlerResponseTransferExport` OK * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ exportArtrans: (params?: RequestParams) => Promise>; /** * @description Import data to Artalk * * @tags Transfer * @name ImportArtrans * @summary Import Artrans * @request POST:/transfer/import * @secure * @response `200` `string` OK */ importArtrans: (data: HandlerParamsTransferImport, params?: RequestParams) => Promise>; /** * @description Upload a file to prepare to import * * @tags Transfer * @name UploadArtrans * @summary Upload Artrans * @request POST:/transfer/upload * @secure * @response `200` `(HandlerResponseTransferUpload & { filename?: string, })` OK * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ uploadArtrans: (data: { /** * Upload file in preparation for import task * @format binary */ file: File; }, params?: RequestParams) => Promise>; }; upload: { /** * @description Upload file from this endpoint * * @tags Upload * @name Upload * @summary Upload * @request POST:/upload * @secure * @response `200` `HandlerResponseUpload` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request * @response `403` `(HandlerMap & { msg?: string, })` Forbidden * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ upload: (data: { /** * Upload file * @format binary */ file: File; }, params?: RequestParams) => Promise>; }; user: { /** * @description Get user info to prepare for login or check current user status * * @tags Auth * @name GetUser * @summary Get User Info * @request GET:/user * @secure * @response `200` `HandlerResponseUserInfo` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request */ getUser: (query?: { /** The user email */ email?: string; /** The username */ name?: string; }, params?: RequestParams) => Promise>; /** * @description Update user profile when user is logged in * * @tags Auth * @name UpdateProfile * @summary Update user profile * @request POST:/user * @secure * @response `200` `HandlerResponseUserInfoUpdate` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ updateProfile: (data: HandlerRequestUserInfoUpdate, params?: RequestParams) => Promise>; /** * @description Login user by name or email * * @tags Auth * @name Login * @summary Get Access Token * @request POST:/user/access_token * @response `200` `HandlerResponseUserLogin` OK * @response `400` `(HandlerMap & { data?: { need_name_select?: (string)[], }, msg?: string, })` Multiple users with the same email address are matched * @response `401` `(HandlerMap & { msg?: string, })` Unauthorized * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ login: (user: HandlerParamsUserLogin, params?: RequestParams) => Promise>; /** * @description Get user login status by header Authorization * * @tags Auth * @name GetUserStatus * @summary Get Login Status * @request GET:/user/status * @secure * @response `200` `HandlerResponseUserStatus` OK */ getUserStatus: (query?: { /** The user email */ email?: string; /** The username */ name?: string; }, params?: RequestParams) => Promise>; }; users: { /** * @description Create a new user * * @tags User * @name CreateUser * @summary Create User * @request POST:/users * @secure * @response `200` `HandlerResponseUserCreate` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request * @response `403` `(HandlerMap & { msg?: string, })` Forbidden * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ createUser: (user: HandlerParamsUserCreate, params?: RequestParams) => Promise>; /** * @description Update a specific user * * @tags User * @name UpdateUser * @summary Update User * @request PUT:/users/{id} * @secure * @response `200` `HandlerResponseUserUpdate` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request * @response `403` `(HandlerMap & { msg?: string, })` Forbidden * @response `404` `(HandlerMap & { msg?: string, })` Not Found * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ updateUser: (id: number, user: HandlerParamsUserUpdate, params?: RequestParams) => Promise>; /** * @description Delete a specific user * * @tags User * @name DeleteUser * @summary Delete User * @request DELETE:/users/{id} * @secure * @response `200` `HandlerMap` OK * @response `403` `(HandlerMap & { msg?: string, })` Forbidden * @response `404` `(HandlerMap & { msg?: string, })` Not Found * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ deleteUser: (id: number, params?: RequestParams) => Promise>; /** * @description Get a list of users by some conditions * * @tags User * @name GetUsers * @summary Get User List * @request GET:/users/{type} * @secure * @response `200` `HandlerResponseAdminUserList` OK * @response `403` `(HandlerMap & { msg?: string, })` Forbidden */ getUsers: (type?: "all" | "admin" | "in_conf", query?: { /** The limit for pagination */ limit?: number; /** The offset for pagination */ offset?: number; /** Search keywords */ search?: string; }, params?: RequestParams) => Promise>; }; version: { /** * @description Get the version of Artalk * * @tags System * @name GetVersion * @summary Get Version Info * @request GET:/version * @response `200` `CommonApiVersionData` OK */ getVersion: (params?: RequestParams) => Promise>; }; votes: { /** * @description Sync the number of votes in the `comments` or `pages` data tables to keep them the same as the `votes` table * * @tags Vote * @name SyncVotes * @summary Sync Vote Data * @request POST:/votes/sync * @secure * @response `200` `HandlerMap` OK * @response `403` `(HandlerMap & { msg?: string, })` Forbidden */ syncVotes: (params?: RequestParams) => Promise>; /** * @description Get vote status for a specific comment or page * * @tags Vote * @name GetVote * @summary Get Vote Status * @request GET:/votes/{target_name}/{target_id} * @response `200` `HandlerResponseVote` OK * @response `403` `(HandlerMap & { msg?: string, })` Forbidden * @response `404` `(HandlerMap & { msg?: string, })` Not Found * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ getVote: (targetName: "comment" | "page", targetId: number, params?: RequestParams) => Promise>; /** * @description Create a new vote for a specific comment or page * * @tags Vote * @name CreateVote * @summary Create Vote * @request POST:/votes/{target_name}/{target_id}/{choice} * @response `200` `HandlerResponseVote` OK * @response `403` `(HandlerMap & { msg?: string, })` Forbidden * @response `404` `(HandlerMap & { msg?: string, })` Not Found * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ createVote: (targetName: "comment" | "page", targetId: number, choice: "up" | "down", vote: HandlerParamsVoteCreate, params?: RequestParams) => Promise>; }; } declare interface ApiConfig { baseUrl?: string; baseApiParams?: Omit; securityWorker?: (securityData: SecurityDataType | null) => Promise | RequestParams | void; customFetch?: typeof fetch; } declare interface ApiHandler { action: T; handler: (data: ApiHandlerPayload[T]) => Promise; } declare interface ApiHandlerPayload { need_captcha: { img_data?: string; iframe?: string; }; need_login: object; need_auth_login: object; } export declare interface ApiHandlers { add: (action: T, handler: (data: ApiHandlerPayload[T]) => Promise) => void; remove: (action: PayloadKey) => void; get: () => ApiHandler[]; } declare interface ApiOptions { baseURL: string; siteName: string; pageKey: string; pageTitle: string; timeout?: number; getApiToken?: () => string | undefined; userInfo?: { name: string; email: string; }; handlers?: ApiHandlers; } export declare interface ApiVersionData { /** API 程序名 */ app: string; /** API 程序版本号 */ version: string; /** API 程序 CommitHash */ commit_hash: string; } /** * Artalk * * @see https://artalk.js.org */ declare class Artalk { ctx: Context; constructor(conf: ConfigPartial); /** Get the config of Artalk */ getConf(): Config; /** Get the root element of Artalk */ getEl(): HTMLElement; /** Update config of Artalk */ update(conf: ConfigPartial): void; /** Reload comment list of Artalk */ reload(): void; /** Destroy instance of Artalk */ destroy(): void; /** Add an event listener */ on(name: K, handler: EventHandler): void; /** Remove an event listener */ off(name: K, handler: EventHandler): void; /** Trigger an event */ trigger(name: K, payload?: EventPayloadMap[K]): void; /** Set dark mode */ setDarkMode(darkMode: boolean): void; /** Init Artalk */ static init(conf: ConfigPartial): Artalk; /** Use plugin, the plugin will be used when Artalk.init */ static use(plugin: ArtalkPlugin, options?: T): void; /** Load count widget */ static loadCountWidget(c: ConfigPartial): void; /** @deprecated Please use `getEl()` instead */ get $root(): HTMLElement; /** @description Please use `getConf()` instead */ get conf(): Config; } export default Artalk; export declare type ArtalkConfig = Config; export declare type ArtalkPlugin = (ctx: Context, options?: T) => void; declare namespace ArtalkType { export { I18n, I18nKeys, Api, ApiHandlers, Config, ConfigPartial, ArtalkConfig, ConfigManager, CommentData, ListData, PageData, SiteData, UserData, UserDataForAdmin, NotifyData, EmoticonGrpData, EmoticonListData, ApiVersionData, ListFetchParams, ListLastFetchData, DataManager, NotifyLevel, UserInfoApiResponseData, FetchError, Context, LocalUser, UserManager, List, ListLayout, EditorState, Editor, EditorPluginManager, ListErrorData, ListFetchedArgs, EventPayloadMap, EventHandler, Event_2 as Event, EventOptions, EventManager, ArtalkPlugin, SidebarLayer, SidebarShowPayload, Layer, LayerManager, CheckerManager, Services } } export { ArtalkType } declare interface AuthAuthProviderInfo { icon: string; label: string; name: string; path?: string; } declare type CancelToken = Symbol | string | number; declare interface Checker { el?: HTMLElement; inputType?: 'password' | 'text'; body: (checker: CheckerCtx) => HTMLElement; request: (checker: CheckerCtx, inputVal: string) => Promise; onSuccess?: (checker: CheckerCtx, respData: T, inputVal: string, formEl: HTMLElement) => void; onError?: (checker: CheckerCtx, errData: any, inputVal: string, formEl: HTMLElement) => void; } declare interface CheckerCaptchaPayload extends CheckerPayload { img_data?: string; iframe?: string; } declare interface CheckerCtx { get(key: K): CheckerStore[K]; set(key: K, val: CheckerStore[K]): void; getOpts(): CheckerLauncherOptions; getApi(): Api; getUser(): UserManager; hideInteractInput(): void; triggerSuccess(): void; cancel(): void; } declare interface CheckerLauncherOptions { getApi: () => Api; getLayers: () => LayerManager; getUser: () => UserManager; getCaptchaIframeURL: () => string; onReload: () => void; } export declare interface CheckerManager { checkCaptcha: (payload: CheckerCaptchaPayload) => Promise; checkAdmin: (payload: CheckerPayload) => Promise; check: (checker: Checker, payload: CheckerPayload, beforeCheck?: (c: CheckerCtx) => void) => void; } declare interface CheckerPayload { onSuccess?: () => void; onMount?: (dialogEl: HTMLElement) => void; onCancel?: () => void; } declare interface CheckerStore { val?: string; img_data?: string; iframe?: string; } declare class CommentActions { private comment; private get data(); private get opts(); private getApi; constructor(comment: CommentNode); /** 投票操作 */ vote(choice: 'up' | 'down'): void; /** 管理员 - 评论状态修改 */ adminEdit(type: 'collapsed' | 'pending' | 'pinned', btnElem: ActionBtn): void; /** 管理员 - 评论删除 */ adminDelete(btnElem: ActionBtn): void; /** 快速跳转到该评论 */ goToReplyComment(): void; } export declare interface CommentData { /** 评论 ID */ id: number; /** 评论正文 */ content: string; /** 用户昵称 */ nick: string; /** 用户邮箱 (该字段仅管理员可见) */ email?: string; /** 用户邮箱(已加密) */ email_encrypted: string; /** 用户链接 */ link: string; /** 回复目标评论 ID */ rid: number; /** User Agent */ ua: string; /** 评论日期 */ date: string; /** 是否折叠 */ is_collapsed: boolean; /** 是否待审 */ is_pending: boolean; /** 是否置顶 */ is_pinned: boolean; /** 是否已验证 */ is_verified: boolean; /** 徽章文字 */ badge_name?: string; /** 徽章颜色 */ badge_color?: string; /** IP 属地 */ ip_region?: string; /** 是否允许回复 */ is_allow_reply: boolean; /** 评论页面 key */ page_key: string; /** 评论页面 url */ page_url?: string; /** 是否可见 */ visible: boolean; /** 站点名(用于隔离) */ site_name: string; /** 赞同数 */ vote_up: number; /** 反对数 */ vote_down: number; } declare class CommentNode { $el?: HTMLElement; private renderInstance; private actionInstance; private data; private opts; private parent; private children; private nestCurt; constructor(data: CommentData, opts: CommentOptions); /** 渲染 UI */ render(): void; /** 获取评论操作实例对象 */ getActions(): CommentActions; /** 获取评论渲染器实例对象 */ getRender(): Render; /** 获取评论数据 */ getData(): CommentData; /** 设置数据 */ setData(data: CommentData): void; /** 获取父评论 */ getParent(): CommentNode | null; /** 获取所有子评论 */ getChildren(): CommentNode[]; /** 获取当前嵌套层数 */ getNestCurt(): number; /** 判断是否为根评论 */ getIsRoot(): boolean; /** 获取评论 ID */ getID(): number; /** 置入子评论 */ putChild(childNode: CommentNode, insertMode?: 'append' | 'prepend'): void; /** 获取存放子评论的元素对象 */ getChildrenWrapEl(): HTMLElement; /** 获取所有父评论 */ getParents(): CommentNode[]; /** * Get the element of the comment * * The `getEl()` will always return the latest $el after calling `render()`. * Please be aware of the memory leak if you use the $el reference directly. */ getEl(): HTMLElement; /** * Focus on the comment * * Scroll to the comment and perform flash animation */ focus(): void; scrollIntoView(): void; /** * Remove the comment node */ remove(): void; /** 获取 Gravatar 头像 URL */ getGravatarURL(): string; /** 获取评论 markdown 解析后的内容 */ getContentMarked(): string; /** 获取格式化后的日期 */ getDateFormatted(): any; /** 获取用户 UserAgent 信息 */ getUserUA(): { browser: string; os: string; }; /** 获取配置 */ getOpts(): CommentOptions; } declare interface CommentOptions { onAfterRender?: () => void; onDelete?: (c: CommentNode) => void; /** The comment being replied to (linked comment) */ replyTo?: CommentData; flatMode: boolean; vote: boolean; voteDown: boolean; uaBadge: boolean; nestMax: number; gravatar: Config['gravatar']; heightLimit: Config['heightLimit']; avatarURLBuilder: Config['avatarURLBuilder']; scrollRelativeTo: Config['scrollRelativeTo']; dateFormatter: Config['dateFormatter']; getApi: () => Api; replyComment: Context['replyComment']; editComment: Context['editComment']; } declare interface CommonApiVersionData { app: string; commit_hash: string; version: string; } declare interface CommonConfData { frontend_conf: CommonMap; version: CommonApiVersionData; } declare interface CommonJSONResult { /** Data */ data: any; /** Message */ msg: string; } declare type CommonMap = Record; export declare interface Config { /** Element selector or Element to mount the Artalk */ el: string | HTMLElement; /** Unique page identifier */ pageKey: string; /** Title of the page */ pageTitle: string; /** Server address */ server: string; /** Site name */ site: string; /** Placeholder text for the comment input box */ placeholder: string; /** Text to display when there are no comments */ noComment: string; /** Text for the send button */ sendBtn: string; /** Movable comment box (display below the comment to be replied) */ editorTravel: boolean; /** Emoticons settings */ emoticons: object | any[] | string | false; /** Gravatar avatar settings */ gravatar: { /** API endpoint */ mirror: string; /** API parameters */ params: string; }; /** Avatar URL generator function */ avatarURLBuilder?: (comment: CommentData) => string; /** Pagination settings */ pagination: { /** Number of comments to fetch per request */ pageSize: number; /** "Read more" mode */ readMore: boolean; /** Automatically load more comments when scrolled to the bottom */ autoLoad: boolean; }; /** Height limit configuration */ heightLimit: { /** Maximum height for comment content */ content: number; /** Maximum height for child comments */ children: number; /** Whether the content is scrollable */ scrollable: boolean; }; /** Voting feature for comments */ vote: boolean; /** Downvote button for comments */ voteDown: boolean; /** Page Vote Widget */ pageVote: { /** Up Vote Button Selector */ upBtnEl: string; /** Down Vote Button Selector */ downBtnEl: string; /** Up Vote Count Selector */ upCountEl: string; /** Down Vote Count Selector */ downCountEl: string; /** Active class name if the vote is already cast */ activeClass: string; } | boolean; /** Preview feature for comments */ preview: boolean; /** Selector for the element binding to the comment count */ countEl: string; /** Selector for the element binding to the page views (PV) count */ pvEl: string; /** Attribute name for the PageKey in statistics components */ statPageKeyAttr: string; /** Dark mode settings */ darkMode: boolean | 'auto'; /** Request timeout (in seconds) */ reqTimeout: number; /** Flat mode for comment display */ flatMode: boolean | 'auto'; /** Maximum number of levels for nested comments */ nestMax: number; /** Sorting order for nested comments */ nestSort: 'DATE_ASC' | 'DATE_DESC'; /** Display UA badge (user agent badge) */ uaBadge: boolean; /** Show sorting dropdown for comment list */ listSort: boolean; /** Enable image upload feature */ imgUpload: boolean; /** Image uploader function */ imgUploader?: (file: File) => Promise; /** Image lazy load mode */ imgLazyLoad: false | 'native' | 'data-src'; /** Enable version check */ versionCheck: boolean; /** * Use remote configuration (from the backend server) * * @deprecated * The `useBackendConf` is always `true` and planned to be removed in the future. * * Please use `preferRemoteConf` to control the priority of the remote and local configuration. * * @default true */ useBackendConf: boolean; /** * Prefer to use the local configuration if available * * @note * If `true`, the local config will be used as a fallback (remote config first). * * If `false`, the local config will override the remote config (local config first). * * @default false */ preferRemoteConf: boolean; /** Localization settings */ locale: I18n | string; /** Backend API version (system data, not allowed for user modification) */ apiVersion: string; /** URLs for plugin scripts */ pluginURLs?: string[]; /** Replacers for the marked (Markdown parser) */ markedReplacers?: ((raw: string) => string)[]; /** Options for the marked (Markdown parser) */ markedOptions?: MarkedOptions; /** Modifier for list fetch request parameters */ listFetchParamsModifier?: (params: any) => void; /** * Custom date formatter * @param date - The Date object to format * @returns Formatted date string */ dateFormatter?: (date: Date) => string; /** List unread highlight (enable by default in artalk-sidebar) */ listUnreadHighlight: boolean; /** The relative element for scrolling (useful if artalk is in a scrollable container) */ scrollRelativeTo?: () => HTMLElement; /** Page view increment when comment list is loaded */ pvAdd: boolean; /** Immediately fetch comments when Artalk instance is initialized */ fetchCommentsOnInit: boolean; /** Callback before submitting a comment */ beforeSubmit?: (editor: Editor, next: () => void) => void; } export declare interface ConfigManager { watchConf: Context['watchConf']; get: () => Config; update: (conf: ConfigPartial) => void; } export declare type ConfigPartial = DeepPartial; declare type Constructor = (...args: { [K in keyof D]: D[K] extends keyof S ? S[D[K]] : never; }) => T; declare enum ContentType { Json = "application/json", FormData = "multipart/form-data", UrlEncoded = "application/x-www-form-urlencoded", Text = "text/plain" } /** * Artalk Context */ export declare interface Context extends EventManager, DependencyContainer { /** * The root element of Artalk * * @deprecated Use `getEl()` instead */ $root: HTMLElement; /** Get the root element */ getEl(): HTMLElement; /** * Inject a dependency object * * @deprecated Use `inject()` instead */ get(key: T): Services[T]; /** * Get config object * * @deprecated Use `getConf()` and `updateConf()` instead */ conf: Config; /** Get the config */ getConf(): Config; /** Update the config */ updateConf(conf: ConfigPartial): void; /** Watch the config */ watchConf(keys: T, effect: (val: Pick) => void): void; /** Get the marked instance */ getMarked(): Marked | undefined; /** Set dark mode */ setDarkMode(darkMode: boolean | 'auto'): void; /** Translate i18n message */ $t(key: keyof I18n, args?: { [key: string]: string; }): string; /** Get HTTP API client */ getApi(): Api; /** Get HTTP API handlers */ getApiHandlers(): ApiHandlers; /** Get Data Manager */ getData(): DataManager; /** Get User Manager */ getUser(): UserManager; /** Fetch comments */ fetch(params: Partial): void; /** Reload comments */ reload(): void; /** Destroy */ destroy(): void; /** Goto the first comment of the list */ listGotoFirst(): void; /** Get the comment data list */ getComments(): CommentData[]; /** Get the comment node list */ getCommentNodes(): CommentNode[]; /** * Get the comment data list * @deprecated Use `getComments()` instead */ getCommentDataList(): CommentData[]; /** * Get the comment node list * @deprecated Use `getCommentNodes()` instead */ getCommentList(): CommentNode[]; /** Reply to a comment */ replyComment(commentData: CommentData, $comment: HTMLElement): void; /** Edit a comment */ editComment(commentData: CommentData, $comment: HTMLElement): void; /** Show loading of the editor */ editorShowLoading(): void; /** Hide loading of the editor */ editorHideLoading(): void; /** Show notify of the editor */ editorShowNotify(msg: string, type: NotifyLevel): void; /** Reset the state of the editor */ editorResetState(): void; /** Show the sidebar */ showSidebar(payload?: SidebarShowPayload): void; /** Hide the sidebar */ hideSidebar(): void; /** Check captcha */ checkCaptcha(payload: CheckerCaptchaPayload): Promise; /** Check admin */ checkAdmin(payload: CheckerPayload): Promise; } export declare interface DataManager { getLoading(): boolean; setLoading(val: boolean): void; getListLastFetch(): ListLastFetchData | undefined; setListLastFetch(val: ListLastFetchData): void; getComments(): CommentData[]; findComment(id: number): CommentData | undefined; fetchComments(params: Partial): void; loadComments(comments: CommentData[]): void; clearComments(): void; insertComment(comment: CommentData): void; updateComment(comment: CommentData): void; deleteComment(id: number): void; getNotifies(): NotifyData[]; updateNotifies(notifies: NotifyData[]): void; getPage(): PageData | undefined; updatePage(pageData: PageData): void; } declare type DeepPartial = { [K in keyof T]?: T[K] extends object ? DeepPartial : T[K]; }; export declare const Defaults: Readonly>; declare interface DependencyContainer { provide(key: K, impl: Constructor, deps?: D, opts?: ProvideFuncOptions): void; inject(key: K): T extends undefined ? S[K] : T; } export declare interface Editor { /** * Get editor options */ getOptions(): EditorOptions; /** * Get the editor element */ getEl(): HTMLElement; /** * Get the editor UI instance */ getUI(): EditorUI; /** * Get the header input elements */ getHeaderInputEls(): Record; /** * Set content */ setContent(val: string): void; /** * Insert content */ insertContent(val: string): void; /** * Get the final content * * This function returns the raw content or the content transformed through a plugin hook. */ getContentFinal(): string; /** * Get the raw content which is inputed by user */ getContentRaw(): string; /** * Get the HTML format content which is rendered by marked (a markdown parser) */ getContentMarked(): string; /** * Get editor current state */ getState(): EditorState; /** * Focus editor */ focus(): void; /** * Reset editor */ reset(): void; /** * Reset editor UI * * call it will move editor to the initial position */ resetState(): void; /** * Submit comment */ submit(): void; /** * Show notification message */ showNotify(msg: string, type: NotifyLevel): void; /** * Show loading on editor */ showLoading(): void; /** * Hide loading on editor */ hideLoading(): void; /** * Start replying a comment */ setReplyComment(commentData: CommentData, $comment: HTMLElement, scroll?: boolean): void; /** * Start editing a comment */ setEditComment(commentData: CommentData, $comment: HTMLElement): void; /** * Get plugin manager */ getPlugins(): PluginManager | undefined; /** * Set plugin manager */ setPlugins(plugins: PluginManager): void; } declare interface EditorEventPayloadMap { mounted: undefined; unmounted: undefined; 'header-input': { field: string; $input: HTMLInputElement; }; 'header-change': { field: string; $input: HTMLInputElement; }; 'content-updated': string; 'panel-show': EditorPlugin; 'panel-hide': EditorPlugin; 'panel-close': undefined; 'editor-close': undefined; 'editor-open': undefined; 'editor-submit': undefined; 'editor-submitted': undefined; } declare interface EditorOptions { getEvents: () => EventManager; getConf: () => ConfigManager; } /** * Editor 插件 */ declare class EditorPlugin { protected kit: PlugKit; $btn?: HTMLElement; $panel?: HTMLElement; contentTransformer?(rawContent: string): string; editorStateEffectWhen?: EditorState; editorStateEffect?(comment: CommentData): () => void; constructor(kit: PlugKit); /** Use plug btn will add a btn on the bottom of editor */ useBtn(html?: string): HTMLElement; /** Use plug panel will show the panel when btn is clicked */ usePanel(html?: string): HTMLElement; /** Use the content transformer to handle the content of the last submit by the editor */ useContentTransformer(func: (raw: string) => string): void; /** Listen the event of panel show */ usePanelShow(func: () => void): void; /** Listen the event of panel hide */ usePanelHide(func: () => void): void; /** Use editor state modifier */ useEditorStateEffect(stateName: EditorState, effectFn: (comment: CommentData) => () => void): void; } export declare interface EditorPluginManager { getPlugins: () => EditorPlugin[]; getEvents: () => EventManager; getEditor: () => Editor; getOptions: () => PluginManagerOptions; get(plug: T): InstanceType | undefined; openPluginPanel: (plug: EditorPlugin) => void; closePluginPanel: () => void; getTransformedContent: (rawContent: string) => string; } export declare type EditorState = 'reply' | 'edit' | 'normal'; declare interface EditorUI extends Record { $el: HTMLElement; $name: HTMLInputElement; $email: HTMLInputElement; $link: HTMLInputElement; $textarea: HTMLTextAreaElement; $submitBtn: HTMLButtonElement; $sendReplyBtn?: HTMLElement; $editCancelBtn?: HTMLElement; } export declare type EmoticonGrpData = { name: string; type: 'emoticon' | 'image' | 'emoji'; items: { key: string; val: string; }[]; }; export declare type EmoticonListData = EmoticonGrpData[]; declare const en: { placeholder: string; noComment: string; send: string; signIn: string; signUp: string; save: string; nick: string; email: string; link: string; emoticon: string; preview: string; uploadImage: string; uploadFail: string; commentFail: string; restoredMsg: string; onlyAdminCanReply: string; uploadLoginMsg: string; counter: string; sortLatest: string; sortOldest: string; sortBest: string; sortAuthor: string; openComment: string; closeComment: string; listLoadFailMsg: string; listRetry: string; loadMore: string; admin: string; reply: string; voteUp: string; voteDown: string; voteFail: string; readMore: string; actionConfirm: string; collapse: string; collapsed: string; collapsedMsg: string; expand: string; approved: string; pending: string; pendingMsg: string; edit: string; editCancel: string; delete: string; deleteConfirm: string; pin: string; unpin: string; seconds: string; minutes: string; hours: string; days: string; now: string; adminCheck: string; captchaCheck: string; confirm: string; cancel: string; msgCenter: string; ctrlCenter: string; userProfile: string; noAccountPrompt: string; haveAccountPrompt: string; forgetPassword: string; resetPassword: string; changePassword: string; confirmPassword: string; passwordMismatch: string; verificationCode: string; verifySend: string; verifyResend: string; waitSeconds: string; emailVerified: string; password: string; username: string; nextStep: string; skipVerify: string; logoutConfirm: string; accountMergeNotice: string; accountMergeSelectOne: string; accountMergeConfirm: string; dismiss: string; merge: string; client: string; server: string; loading: string; loadFail: string; editing: string; editFail: string; deleting: string; deleteFail: string; reqGot: string; reqAborted: string; updateMsg: string; currentVersion: string; ignore: string; open: string; openName: string; }; declare interface EntityCookedComment { badge_color: string; badge_name: string; content: string; content_marked: string; date: string; email_encrypted: string; id: number; ip_region: string; is_allow_reply: boolean; is_collapsed: boolean; is_pending: boolean; is_pinned: boolean; is_verified: boolean; link: string; nick: string; page_key: string; page_url: string; rid: number; site_name: string; ua: string; user_id: number; visible: boolean; vote_down: number; vote_up: number; } declare interface EntityCookedNotify { comment_id: number; id: number; is_emailed: boolean; is_read: boolean; read_link: string; user_id: number; } declare interface EntityCookedPage { admin_only: boolean; date: string; id: number; key: string; pv: number; site_name: string; title: string; url: string; vote_down: number; vote_up: number; } declare interface EntityCookedSite { first_url: string; id: number; name: string; urls: string[]; urls_raw: string; } declare interface EntityCookedUser { badge_color: string; badge_name: string; email: string; id: number; is_admin: boolean; link: string; name: string; receive_email: boolean; } declare interface EntityCookedUserForAdmin { badge_color: string; badge_name: string; comment_count: number; email: string; id: number; is_admin: boolean; is_in_conf: boolean; last_ip: string; last_ua: string; link: string; name: string; receive_email: boolean; } declare interface Event_2 extends EventOptions { name: K; handler: EventHandler; } export { Event_2 as Event } export declare type EventHandler = (payload: T) => void; export declare interface EventManager { on(name: K, handler: EventHandler, opts?: EventOptions): void; off(name: K, handler: EventHandler): void; trigger(name: K, payload?: T[K]): void; } declare class EventManager_2 implements EventManager { private events; /** * Add an event listener for a specific event name */ on(name: K, handler: EventHandler, opts?: EventOptions): void; /** * Remove an event listener for a specific event name and handler */ off(name: K, handler: EventHandler): void; /** * Trigger an event with an optional payload */ trigger(name: K, payload?: T[K]): void; } export declare interface EventOptions { once?: boolean; } /** EventName to EventPayload Type */ export declare interface EventPayloadMap { created: undefined; mounted: undefined; updated: Config; unmounted: undefined; 'list-fetch': Partial; 'list-fetched': ListFetchedArgs; 'list-load': CommentData[]; 'list-loaded': CommentData[]; 'list-failed': ListErrorData; 'list-goto-first': undefined; 'list-reach-bottom': undefined; 'comment-inserted': CommentData; 'comment-updated': CommentData; 'comment-deleted': CommentData; 'comment-rendered': CommentNode; 'notifies-updated': NotifyData[]; 'list-goto': number; 'page-loaded': PageData; 'editor-submit': undefined; 'editor-submitted': undefined; 'user-changed': LocalUser; 'sidebar-show': undefined; 'sidebar-hide': undefined; } declare type ExcludedKeys = FunctionKeys; export declare interface FetchError extends Error { code: number; message: string; data?: any; } declare interface FullRequestParams extends Omit { /** set parameter to `true` for call `securityWorker` for this request */ secure?: boolean; /** request path */ path: string; /** content type of request body */ type?: ContentType; /** query params */ query?: QueryParamsType; /** format of response (i.e. response.json() -> format: "json") */ format?: ResponseFormat; /** request body */ body?: unknown; /** base url */ baseUrl?: string; /** request cancellation token */ cancelToken?: CancelToken; } declare type FunctionKeys = Exclude<{ [K in keyof T]: NonNullable extends (...args: any[]) => any ? K : never; }[keyof T], undefined>; declare type HandlerMap = Record; declare interface HandlerParamsCaptchaVerify { /** The captcha value to check */ value: string; } declare interface HandlerParamsCommentCreate { /** The comment content */ content: string; /** The comment email */ email: string; /** The comment link */ link?: string; /** The comment name */ name: string; /** The comment page_key */ page_key: string; /** The comment page_title */ page_title?: string; /** The comment rid */ rid?: number; /** The site name of your content scope */ site_name: string; /** The comment ua */ ua?: string; } declare interface HandlerParamsCommentUpdate { /** The comment content */ content: string; /** The comment email */ email?: string; /** The comment ip */ ip?: string; /** The comment is_collapsed */ is_collapsed: boolean; /** The comment is_pending */ is_pending: boolean; /** The comment is_pinned */ is_pinned: boolean; /** The comment link */ link?: string; /** The comment nick */ nick?: string; /** The comment page_key */ page_key: string; /** The comment rid */ rid: number; /** The site name of your content scope */ site_name: string; /** The comment ua */ ua?: string; } declare interface HandlerParamsEmailSend { /** The body of email */ body: string; /** The subject of email */ subject: string; /** The email address of the receiver */ to_addr: string; } declare interface HandlerParamsNotifyReadAll { /** The user email */ email: string; /** The username */ name: string; } declare interface HandlerParamsPageFetchAll { /** If not empty, only fetch pages of this site */ site_name?: string; } declare interface HandlerParamsPagePV { /** The page key */ page_key: string; /** The page title */ page_title?: string; /** The site name of your content scope */ site_name?: string; } declare interface HandlerParamsPageUpdate { /** Updated page admin_only option */ admin_only: boolean; /** Updated page key */ key: string; /** The site name of your content scope */ site_name: string; /** Updated page title */ title: string; } declare interface HandlerParamsSettingApply { /** The content of the config file in YAML format */ yaml: string; } declare interface HandlerParamsSiteCreate { /** The site name */ name: string; /** The site urls */ urls: string[]; } declare interface HandlerParamsSiteUpdate { /** Updated site name */ name: string; /** Updated site urls */ urls: string[]; } declare interface HandlerParamsTransferImport { /** Automatically answer yes for all questions */ assumeyes?: boolean; /** The JSON data */ json_data?: string; /** The JSON file path */ json_file?: string; /** The target site name */ target_site_name?: string; /** The target site url */ target_site_url?: string; /** Keep domain */ url_keep_domain?: boolean; /** Enable URL resolver */ url_resolver?: boolean; } declare interface HandlerParamsUserCreate { /** The user badge color (hex format) */ badge_color?: string; /** The user badge name */ badge_name?: string; /** The user email */ email: string; /** The user is an admin */ is_admin: boolean; /** The user link */ link?: string; /** The user name */ name: string; /** The user password */ password?: string; /** The user receive email */ receive_email: boolean; } declare interface HandlerParamsUserLogin { /** The user email */ email: string; /** The username */ name?: string; /** The user password */ password: string; } declare interface HandlerParamsUserUpdate { /** The user badge color (hex format) */ badge_color?: string; /** The user badge name */ badge_name?: string; /** The user email */ email: string; /** The user is an admin */ is_admin: boolean; /** The user link */ link?: string; /** The user name */ name: string; /** The user password */ password?: string; /** The user receive email */ receive_email: boolean; } declare interface HandlerParamsVoteCreate { /** The user email */ email?: string; /** The username */ name?: string; } declare interface HandlerRequestAuthDataMergeApply { user_name: string; } declare interface HandlerRequestAuthEmailLogin { code?: string; email: string; password?: string; } declare interface HandlerRequestAuthEmailRegister { code: string; email: string; link?: string; name?: string; password: string; } declare interface HandlerRequestAuthEmailSend { email: string; } declare interface HandlerRequestUserInfoUpdate { code?: string; email: string; link?: string; name: string; } declare interface HandlerResponseAdminUserList { count: number; users: EntityCookedUserForAdmin[]; } declare interface HandlerResponseAuthDataMergeApply { deleted_user_count: number; update_comments_count: number; update_notifies_count: number; update_votes_count: number; /** Empty if login user is target user no need to re-login */ user_token: string; } declare interface HandlerResponseAuthDataMergeCheck { need_merge: boolean; user_names: string[]; } declare interface HandlerResponseCaptchaGet { img_data: string; } declare interface HandlerResponseCaptchaStatus { is_pass: boolean; } declare interface HandlerResponseCommentCreate { badge_color: string; badge_name: string; content: string; content_marked: string; date: string; email_encrypted: string; id: number; ip_region: string; is_allow_reply: boolean; is_collapsed: boolean; is_pending: boolean; is_pinned: boolean; is_verified: boolean; link: string; nick: string; page_key: string; page_url: string; rid: number; site_name: string; ua: string; user_id: number; visible: boolean; vote_down: number; vote_up: number; } declare interface HandlerResponseCommentGet { /** The comment detail */ comment: EntityCookedComment; /** The reply comment if exists (like reply) */ reply_comment: EntityCookedComment; } declare interface HandlerResponseCommentList { comments: EntityCookedComment[]; count: number; page: EntityCookedPage; roots_count: number; } declare interface HandlerResponseCommentUpdate { badge_color: string; badge_name: string; content: string; content_marked: string; date: string; email_encrypted: string; id: number; ip_region: string; is_allow_reply: boolean; is_collapsed: boolean; is_pending: boolean; is_pinned: boolean; is_verified: boolean; link: string; nick: string; page_key: string; page_url: string; rid: number; site_name: string; ua: string; user_id: number; visible: boolean; vote_down: number; vote_up: number; } declare interface HandlerResponseConfAuthProviders { anonymous: boolean; providers: AuthAuthProviderInfo[]; } declare interface HandlerResponseConfDomain { /** Is the domain trusted */ is_trusted: boolean; /** The origin of the domain */ origin: string; } declare interface HandlerResponseNotifyList { count: number; notifies: EntityCookedNotify[]; } declare interface HandlerResponsePageFetch { admin_only: boolean; date: string; id: number; key: string; pv: number; site_name: string; title: string; url: string; vote_down: number; vote_up: number; } declare interface HandlerResponsePageFetchStatus { /** The number of pages that have been fetched */ done: number; /** If the task is in progress */ is_progress: boolean; /** The message of the task status */ msg: string; /** The total number of pages */ total: number; } declare interface HandlerResponsePageList { count: number; pages: EntityCookedPage[]; } declare interface HandlerResponsePagePV { pv: number; } declare interface HandlerResponsePageUpdate { admin_only: boolean; date: string; id: number; key: string; pv: number; site_name: string; title: string; url: string; vote_down: number; vote_up: number; } declare interface HandlerResponseSettingGet { envs: string[]; yaml: string; } declare interface HandlerResponseSettingTemplate { yaml: string; } declare interface HandlerResponseSiteCreate { first_url: string; id: number; name: string; urls: string[]; urls_raw: string; } declare interface HandlerResponseSiteList { count: number; sites: EntityCookedSite[]; } declare interface HandlerResponseSiteUpdate { first_url: string; id: number; name: string; urls: string[]; urls_raw: string; } declare interface HandlerResponseTransferExport { /** The exported data which is a JSON string */ artrans: string; } declare interface HandlerResponseTransferUpload { /** The uploaded file name which can be used to import */ filename: string; } declare interface HandlerResponseUpload { file_name: string; file_type: string; public_url: string; } declare interface HandlerResponseUserCreate { badge_color: string; badge_name: string; comment_count: number; email: string; id: number; is_admin: boolean; is_in_conf: boolean; last_ip: string; last_ua: string; link: string; name: string; receive_email: boolean; } declare interface HandlerResponseUserInfo { is_login: boolean; notifies: EntityCookedNotify[]; notifies_count: number; user: EntityCookedUser; } declare interface HandlerResponseUserInfoUpdate { user: EntityCookedUser; } declare interface HandlerResponseUserLogin { token: string; user: EntityCookedUser; } declare interface HandlerResponseUserStatus { is_admin: boolean; is_login: boolean; } declare interface HandlerResponseUserUpdate { badge_color: string; badge_name: string; comment_count: number; email: string; id: number; is_admin: boolean; is_in_conf: boolean; last_ip: string; last_ua: string; link: string; name: string; receive_email: boolean; } declare interface HandlerResponseVote { down: number; is_down: boolean; is_up: boolean; up: number; } declare class HttpClient { baseUrl: string; private securityData; private securityWorker?; private abortControllers; private customFetch; private baseApiParams; constructor(apiConfig?: ApiConfig); setSecurityData: (data: SecurityDataType | null) => void; protected encodeQueryParam(key: string, value: any): string; protected addQueryParam(query: QueryParamsType, key: string): string; protected addArrayQueryParam(query: QueryParamsType, key: string): any; protected toQueryString(rawQuery?: QueryParamsType): string; protected addQueryParams(rawQuery?: QueryParamsType): string; private contentFormatters; protected mergeRequestParams(params1: RequestParams, params2?: RequestParams): RequestParams; protected createAbortSignal: (cancelToken: CancelToken) => AbortSignal | undefined; abortRequest: (cancelToken: CancelToken) => void; request: ({ body, secure, path, type, query, format, baseUrl, cancelToken, ...params }: FullRequestParams) => Promise>; } declare interface HttpResponse extends Response { data: D; error: E; } export declare type I18n = typeof en; export declare type I18nKeys = keyof I18n; export declare const init: typeof Artalk.init; export declare interface Layer { show: () => void; hide: () => void; destroy: () => void; setOnAfterHide(func: () => void): void; setAllowMaskClose(allow: boolean): void; getAllowMaskClose(): boolean; getEl: () => HTMLElement; } export declare interface LayerManager { create(name: string, el?: HTMLElement): Layer; destroy(): void; getEl(): HTMLElement; } declare type Lifecycle = 'transient' | 'singleton'; export declare interface List { getEl: () => HTMLElement; getCommentsWrapEl: () => HTMLElement; getLayout: (arg: { forceFlatMode?: boolean; }) => ListLayout; getCommentNodes: () => CommentNode[]; } export declare interface ListData { /** 评论数据 */ comments: CommentData[]; /** 根评论总数 */ roots_count: number; /** 评论总数(包括所有子评论) */ count: number; /** 页面信息 */ page: PageData; } export declare interface ListErrorData { msg: string; data?: any; } export declare interface ListFetchedArgs { params: Partial; data?: ListData; error?: ListErrorData; } export declare interface ListFetchParams { offset: number; limit: number; flatMode: boolean; paramsModifier?: (p: any) => void; onSuccess?: (data: ListData) => void; onError?: (err: any) => void; } export declare interface ListLastFetchData { params: ListFetchParams; data?: ListData; } export declare interface ListLayout { import: (comments: CommentData[]) => void; insert: (comment: CommentData, replyComment?: CommentData) => void; } export declare const loadCountWidget: typeof Artalk.loadCountWidget; /** * Local User Data (in localStorage) * * @note Keep flat for easy handling */ export declare interface LocalUser { /** Username (aka. Nickname) */ name: string; /** Email */ email: string; /** Link (aka. Website) */ link: string; /** Token (for authorization) */ token: string; /** Admin flag */ is_admin: boolean; } export declare interface NotifyData { /** 通知 ID */ id: number; /** 用户 ID */ user_id: number; /** 评论 ID */ comment_id: number; /** 是否已读 */ is_read: boolean; /** 是否已发送邮件通知 */ is_emailed: boolean; /** 标为已读地址 */ read_link: string; } export declare type NotifyLevel = 'i' | 's' | 'w' | 'e'; export declare interface PageData { /** 页面 ID */ id: number; /** 页面唯一标识符 */ key: string; /** 页面标题 */ title: string; /** 页面 url */ url: string; /** 仅管理员可评 */ admin_only: boolean; /** 站点名(用于隔离) */ site_name: string; /** 赞同数 */ vote_up: number; /** 反对数 */ vote_down: number; } declare type PayloadKey = keyof ApiHandlerPayload; declare class PluginManager implements EditorPluginManager { opts: PluginManagerOptions; private plugins; private openedPlug; private events; constructor(opts: PluginManagerOptions); getPlugins(): EditorPlugin[]; getEvents(): EventManager_2; getEditor(): Editor; getOptions(): PluginManagerOptions; private clear; private loadPluginUI; /** Load the plug btn and plug panel on editor ui */ private loadPluginItem; get(plug: T): InstanceType | undefined; /** Open the editor plug panel */ openPluginPanel(plug: EditorPlugin): void; /** Close the editor plugin panel */ closePluginPanel(): void; /** Get the content which is transformed by plugs */ getTransformedContent(rawContent: string): string; } declare interface PluginManagerOptions { getArtalkRootEl: () => HTMLElement; getEditor: () => Editor; getConf: () => ConfigManager; getUser: () => UserManager; getApi: () => Api; getData: () => DataManager; getCheckers: () => CheckerManager; onSubmitted: () => void; } /** * PlugKit provides a set of methods to help you develop editor plug */ declare class PlugKit { private plugins; constructor(plugins: PluginManager); /** Use the editor */ useEditor(): Editor; /** Use the config of Artalk */ useConf(): Config; /** Use the http api client */ useApi(): Api; /** Use the data manager */ useData(): DataManager; /** Use the user manager */ useUser(): UserManager; /** Use the checkers */ useCheckers(): CheckerManager; /** Use the ui of editor */ useUI(): EditorUI; /** Use the events in editor scope */ useEvents(): EventManager_2; /** Listen the event when plug is mounted */ useMounted(func: () => void): void; /** Listen the event when plug is unmounted */ useUnmounted(func: () => void): void; /** Use the deps of other plug */ useDeps(plug: T): InstanceType | undefined; /** Use the root element of artalk */ useArtalkRootEl(): HTMLElement; } declare type PrimitiveKey = string | number | symbol; declare interface ProvideFuncOptions { /** Lifecycle (default: 'singleton') */ lifecycle?: Lifecycle; } declare type QueryParamsType = Record; declare class Render { comment: CommentNode; get data(): CommentData; get opts(): CommentOptions; $el: HTMLElement; $main: HTMLElement; $header: HTMLElement; $headerNick: HTMLElement; $headerBadgeWrap: HTMLElement; $body: HTMLElement; $content: HTMLElement; $childrenWrap: HTMLElement | null; $actions: HTMLElement; voteBtnUp?: ActionBtn; voteBtnDown?: ActionBtn; $replyTo?: HTMLElement; $replyAt?: HTMLElement; constructor(comment: CommentNode); /** * Render the comment ui * * If comment data is updated, call this method to re-render the comment ui. * The method will be called multiple times, so it should be idempotent. * * Renders may add event listeners to the comment ui, so it should be called only once or override the original. * Please be aware of the memory leak caused by the event listener. */ render(): HTMLElement; /** 内容限高检测 */ checkHeightLimit(): void; /** 子评论区域移除限高 */ heightLimitRemoveForChildren(): void; /** 渐出动画 */ playFadeAnim(): void; /** 渐出动画 · 评论内容区域 */ playFadeAnimForBody(): void; /** Perform the flash animation */ playFlashAnim(): void; /** 获取子评论 Wrap */ getChildrenWrap(): HTMLElement; /** 设置已读 */ setUnread(val: boolean): void; /** 设置为可点击的评论 */ setOpenable(val: boolean): void; /** 设置点击评论打开置顶 URL */ setOpenURL(url: string): void; /** 设置点击评论时的操作 */ setOpenAction(action: () => void): void; } declare type RequestParams = Omit; declare type RequiredExcept = Required> & Pick; declare type ResponseFormat = keyof Omit; declare const Sel: { $header: string; $name: string; $email: string; $link: string; $textareaWrap: string; $textarea: string; $bottom: string; $submitBtn: string; $notifyWrap: string; $bottomLeft: string; $stateWrap: string; $plugBtnWrap: string; $plugPanelWrap: string; }; export declare interface Services { config: ConfigManager; events: EventManager; data: DataManager; api: Api; apiHandlers: ApiHandlers; editor: Editor; editorPlugs: EditorPluginManager | undefined; list: List; sidebar: SidebarLayer; checkers: CheckerManager; layers: LayerManager; user: UserManager; } declare type Services_2 = { [key: PrimitiveKey]: any; }; export declare interface SidebarLayer { onUserChanged: () => void; show: (conf?: SidebarShowPayload) => void; hide: () => void; } export declare interface SidebarShowPayload { view?: 'comments' | 'sites' | 'pages' | 'transfer'; } export declare interface SiteData { /** 站点 ID */ id: number; /** 站点名 */ name: string; /** 站点 URLs */ urls: string[]; /** 站点 URLs(原始字符串) */ urls_raw: string; /** 站点主 URL */ first_url: string; } export declare const use: typeof Artalk.use; export declare interface UserData { /** 用户 ID */ id: number; /** 用户名 */ name: string; /** 邮箱 */ email: string; /** 链接 */ link: string; /** 徽章名称 */ badge_name: string; /** 徽章颜色 */ badge_color: string; /** 是否属于管理员 */ is_admin: boolean; /** 是否允许接收邮件通知 */ receive_email: boolean; } export declare interface UserDataForAdmin extends UserData { /** 最后一次操作 IP */ last_ip: string; /** 最后一次操作 UA */ last_ua: string; /** 是否存在于配置文件中 */ is_in_conf: boolean; /** 评论数 */ comment_count: number; } export declare interface UserInfoApiResponseData { user?: UserData; is_login: boolean; notifies: NotifyData[]; notifies_count: number; } export declare interface UserManager { getData: () => LocalUser; update: (dta: Partial) => void; logout: () => void; checkHasBasicUserInfo: () => boolean; } export { }