artalk 2.9.1 → 2.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,3343 @@
1
+ import { Marked } from 'marked';
2
+ import { MarkedOptions } from 'marked';
3
+
4
+ /**
5
+ * 通用操作按钮
6
+ */
7
+ declare class ActionBtn {
8
+ private opts;
9
+ $el: HTMLElement;
10
+ isLoading: boolean;
11
+ msgRecTimer?: number;
12
+ msgRecTimerFunc?: () => void;
13
+ get isMessaging(): boolean;
14
+ isConfirming: boolean;
15
+ confirmRecTimer?: number;
16
+ /** 构造函数 */
17
+ constructor(opts: ActionBtnOptions | string | (() => string));
18
+ /** 将按钮装载到指定元素 */
19
+ appendTo(dom: HTMLElement): this;
20
+ /** 获取按钮文字(动态/静态) */
21
+ private getText;
22
+ /** 设置点击事件 */
23
+ setClick(func: () => void): void;
24
+ /** 文字刷新(动态/静态) */
25
+ updateText(text?: (() => string) | string): void;
26
+ /** 设置加载状态 */
27
+ setLoading(value: boolean, loadingText?: string): void;
28
+ /** 错误消息 */
29
+ setError(text: string): void;
30
+ /** 警告消息 */
31
+ setWarn(text: string): void;
32
+ /** 成功消息 */
33
+ setSuccess(text: string): void;
34
+ /** 设置消息 */
35
+ setMsg(text: string, className?: string, duringTime?: number, after?: () => void): void;
36
+ /** 设置消息复原操作定时器 */
37
+ private setMsgRecTimer;
38
+ /** 立刻触发器复原定时器 */
39
+ private fireMsgRecTimer;
40
+ /** 仅清除 timer */
41
+ private clearMsgRecTimer;
42
+ }
43
+
44
+ declare interface ActionBtnOptions {
45
+ /** 按钮文字 (动态/静态) */
46
+ text: (() => string) | string;
47
+ /** 仅管理员可用 */
48
+ adminOnly?: boolean;
49
+ /** 确认操作 */
50
+ confirm?: boolean;
51
+ /** 确认时提示文字 */
52
+ confirmText?: string;
53
+ }
54
+
55
+ export declare class Api extends Api_2<void> {
56
+ private _opts;
57
+ constructor(opts: ApiOptions);
58
+ /**
59
+ * Get user info as params for request
60
+ *
61
+ * @returns Request params with user info
62
+ */
63
+ getUserFields(): {
64
+ name: string;
65
+ email: string;
66
+ } | undefined;
67
+ }
68
+
69
+ /**
70
+ * @title Artalk API
71
+ * @version 2.0
72
+ * @license MIT (https://github.com/ArtalkJS/Artalk/blob/master/LICENSE)
73
+ * @baseUrl /api/v2
74
+ * @contact API Support <artalkjs@gmail.com> (https://artalk.js.org)
75
+ *
76
+ * Artalk is a modern comment system based on Golang.
77
+ */
78
+ declare class Api_2<SecurityDataType extends unknown> extends HttpClient<SecurityDataType> {
79
+ auth: {
80
+ /**
81
+ * @description Login by email with verify code (Need send email verify code first) or password
82
+ *
83
+ * @tags Auth
84
+ * @name LoginByEmail
85
+ * @summary Login by email
86
+ * @request POST:/auth/email/login
87
+ * @response `200` `HandlerResponseUserLogin` OK
88
+ * @response `400` `(HandlerMap & {
89
+ msg?: string,
90
+
91
+ })` Bad Request
92
+ * @response `500` `(HandlerMap & {
93
+ msg?: string,
94
+
95
+ })` Internal Server Error
96
+ */
97
+ loginByEmail: (data: HandlerRequestAuthEmailLogin, params?: RequestParams) => Promise<HttpResponse<HandlerResponseUserLogin, HandlerMap & {
98
+ msg?: string;
99
+ }>>;
100
+ /**
101
+ * @description Register by email and verify code (if user exists, will update user, like forget or change password. Need send email verify code first)
102
+ *
103
+ * @tags Auth
104
+ * @name RegisterByEmail
105
+ * @summary Register by email
106
+ * @request POST:/auth/email/register
107
+ * @response `200` `HandlerResponseUserLogin` OK
108
+ * @response `400` `(HandlerMap & {
109
+ msg?: string,
110
+
111
+ })` Bad Request
112
+ * @response `500` `(HandlerMap & {
113
+ msg?: string,
114
+
115
+ })` Internal Server Error
116
+ */
117
+ registerByEmail: (data: HandlerRequestAuthEmailRegister, params?: RequestParams) => Promise<HttpResponse<HandlerResponseUserLogin, HandlerMap & {
118
+ msg?: string;
119
+ }>>;
120
+ /**
121
+ * @description Send email including verify code to user
122
+ *
123
+ * @tags Auth
124
+ * @name SendVerifyEmail
125
+ * @summary Send verify email
126
+ * @request POST:/auth/email/send
127
+ * @response `200` `(HandlerMap & {
128
+ msg?: string,
129
+
130
+ })` OK
131
+ * @response `400` `(HandlerMap & {
132
+ msg?: string,
133
+
134
+ })` Bad Request
135
+ * @response `500` `(HandlerMap & {
136
+ msg?: string,
137
+
138
+ })` Internal Server Error
139
+ */
140
+ sendVerifyEmail: (data: HandlerRequestAuthEmailSend, params?: RequestParams) => Promise<HttpResponse<HandlerMap & {
141
+ msg?: string;
142
+ }, HandlerMap & {
143
+ msg?: string;
144
+ }>>;
145
+ /**
146
+ * @description Get all users with same email, if there are more than one user with same email, need merge
147
+ *
148
+ * @tags Auth
149
+ * @name CheckDataMerge
150
+ * @summary Check data merge
151
+ * @request GET:/auth/merge
152
+ * @secure
153
+ * @response `200` `HandlerResponseAuthDataMergeCheck` OK
154
+ * @response `400` `(HandlerMap & {
155
+ msg?: string,
156
+
157
+ })` Bad Request
158
+ * @response `500` `(HandlerMap & {
159
+ msg?: string,
160
+
161
+ })` Internal Server Error
162
+ */
163
+ checkDataMerge: (params?: RequestParams) => Promise<HttpResponse<HandlerResponseAuthDataMergeCheck, HandlerMap & {
164
+ msg?: string;
165
+ }>>;
166
+ /**
167
+ * @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.
168
+ *
169
+ * @tags Auth
170
+ * @name ApplyDataMerge
171
+ * @summary Apply data merge
172
+ * @request POST:/auth/merge
173
+ * @secure
174
+ * @response `200` `HandlerResponseAuthDataMergeApply` OK
175
+ * @response `400` `(HandlerMap & {
176
+ msg?: string,
177
+
178
+ })` Bad Request
179
+ * @response `500` `(HandlerMap & {
180
+ msg?: string,
181
+
182
+ })` Internal Server Error
183
+ */
184
+ applyDataMerge: (data: HandlerRequestAuthDataMergeApply, params?: RequestParams) => Promise<HttpResponse<HandlerResponseAuthDataMergeApply, HandlerMap & {
185
+ msg?: string;
186
+ }>>;
187
+ };
188
+ cache: {
189
+ /**
190
+ * @description Flush all cache on the server
191
+ *
192
+ * @tags Cache
193
+ * @name FlushCache
194
+ * @summary Flush Cache
195
+ * @request POST:/cache/flush
196
+ * @secure
197
+ * @response `200` `(HandlerMap & {
198
+ msg?: string,
199
+
200
+ })` OK
201
+ * @response `400` `(HandlerMap & {
202
+ msg?: string,
203
+
204
+ })` Bad Request
205
+ * @response `403` `(HandlerMap & {
206
+ msg?: string,
207
+
208
+ })` Forbidden
209
+ */
210
+ flushCache: (params?: RequestParams) => Promise<HttpResponse<HandlerMap & {
211
+ msg?: string;
212
+ }, HandlerMap & {
213
+ msg?: string;
214
+ }>>;
215
+ /**
216
+ * @description Cache warming helps you to pre-load the cache to improve the performance of the first request
217
+ *
218
+ * @tags Cache
219
+ * @name WarmUpCache
220
+ * @summary Warm-Up Cache
221
+ * @request POST:/cache/warm_up
222
+ * @secure
223
+ * @response `200` `(HandlerMap & {
224
+ msg?: string,
225
+
226
+ })` OK
227
+ * @response `400` `(HandlerMap & {
228
+ msg?: string,
229
+
230
+ })` Bad Request
231
+ * @response `403` `(HandlerMap & {
232
+ msg?: string,
233
+
234
+ })` Forbidden
235
+ */
236
+ warmUpCache: (params?: RequestParams) => Promise<HttpResponse<HandlerMap & {
237
+ msg?: string;
238
+ }, HandlerMap & {
239
+ msg?: string;
240
+ }>>;
241
+ };
242
+ captcha: {
243
+ /**
244
+ * @description Get a base64 encoded captcha image or a HTML page to verify for user
245
+ *
246
+ * @tags Captcha
247
+ * @name GetCaptcha
248
+ * @summary Get Captcha
249
+ * @request GET:/captcha
250
+ * @response `200` `HandlerResponseCaptchaGet` OK
251
+ * @response `500` `(HandlerMap & {
252
+ msg?: string,
253
+
254
+ })` Internal Server Error
255
+ */
256
+ getCaptcha: (params?: RequestParams) => Promise<HttpResponse<HandlerResponseCaptchaGet, HandlerMap & {
257
+ msg?: string;
258
+ }>>;
259
+ /**
260
+ * @description Get the status of the user's captcha verification
261
+ *
262
+ * @tags Captcha
263
+ * @name GetCaptchaStatus
264
+ * @summary Get Captcha Status
265
+ * @request GET:/captcha/status
266
+ * @response `200` `HandlerResponseCaptchaStatus` OK
267
+ */
268
+ getCaptchaStatus: (params?: RequestParams) => Promise<HttpResponse<HandlerResponseCaptchaStatus, any>>;
269
+ /**
270
+ * @description Verify user enters correct captcha code
271
+ *
272
+ * @tags Captcha
273
+ * @name VerifyCaptcha
274
+ * @summary Verify Captcha
275
+ * @request POST:/captcha/verify
276
+ * @response `200` `HandlerMap` OK
277
+ * @response `403` `(HandlerMap & {
278
+ img_data?: string,
279
+
280
+ })` Forbidden
281
+ */
282
+ verifyCaptcha: (data: HandlerParamsCaptchaVerify, params?: RequestParams) => Promise<HttpResponse<HandlerMap, HandlerMap & {
283
+ img_data?: string;
284
+ }>>;
285
+ };
286
+ comments: {
287
+ /**
288
+ * @description Get a list of comments by some conditions
289
+ *
290
+ * @tags Comment
291
+ * @name GetComments
292
+ * @summary Get Comment List
293
+ * @request GET:/comments
294
+ * @secure
295
+ * @response `200` `HandlerResponseCommentList` OK
296
+ * @response `500` `(HandlerMap & {
297
+ msg?: string,
298
+
299
+ })` Internal Server Error
300
+ */
301
+ getComments: (query: {
302
+ /** The user email */
303
+ email?: string;
304
+ /** Enable flat_mode */
305
+ flat_mode?: boolean;
306
+ /** The limit for pagination */
307
+ limit?: number;
308
+ /** The username */
309
+ name?: string;
310
+ /** The offset for pagination */
311
+ offset?: number;
312
+ /** The comment page_key */
313
+ page_key: string;
314
+ /** The scope of comments */
315
+ scope?: "page" | "user" | "site";
316
+ /** Search keywords */
317
+ search?: string;
318
+ /** The site name of your content scope */
319
+ site_name?: string;
320
+ /** Sort by condition */
321
+ sort_by?: "date_asc" | "date_desc" | "vote";
322
+ /** Message center show type */
323
+ type?: "all" | "mentions" | "mine" | "pending";
324
+ /** Only show comments by admin */
325
+ view_only_admin?: boolean;
326
+ }, params?: RequestParams) => Promise<HttpResponse<HandlerResponseCommentList, HandlerMap & {
327
+ msg?: string;
328
+ }>>;
329
+ /**
330
+ * @description Create a new comment
331
+ *
332
+ * @tags Comment
333
+ * @name CreateComment
334
+ * @summary Create Comment
335
+ * @request POST:/comments
336
+ * @secure
337
+ * @response `200` `HandlerResponseCommentCreate` OK
338
+ * @response `400` `(HandlerMap & {
339
+ msg?: string,
340
+
341
+ })` Bad Request
342
+ * @response `500` `(HandlerMap & {
343
+ msg?: string,
344
+
345
+ })` Internal Server Error
346
+ */
347
+ createComment: (comment: HandlerParamsCommentCreate, params?: RequestParams) => Promise<HttpResponse<HandlerResponseCommentCreate, HandlerMap & {
348
+ msg?: string;
349
+ }>>;
350
+ /**
351
+ * @description Get the detail of a comment by comment id
352
+ *
353
+ * @tags Comment
354
+ * @name GetComment
355
+ * @summary Get a comment
356
+ * @request GET:/comments/{id}
357
+ * @response `200` `HandlerResponseCommentGet` OK
358
+ * @response `404` `(HandlerMap & {
359
+ msg?: string,
360
+
361
+ })` Not Found
362
+ * @response `500` `(HandlerMap & {
363
+ msg?: string,
364
+
365
+ })` Internal Server Error
366
+ */
367
+ getComment: (id: number, params?: RequestParams) => Promise<HttpResponse<HandlerResponseCommentGet, HandlerMap & {
368
+ msg?: string;
369
+ }>>;
370
+ /**
371
+ * @description Update a specific comment
372
+ *
373
+ * @tags Comment
374
+ * @name UpdateComment
375
+ * @summary Update Comment
376
+ * @request PUT:/comments/{id}
377
+ * @secure
378
+ * @response `200` `HandlerResponseCommentUpdate` OK
379
+ * @response `400` `(HandlerMap & {
380
+ msg?: string,
381
+
382
+ })` Bad Request
383
+ * @response `403` `(HandlerMap & {
384
+ msg?: string,
385
+
386
+ })` Forbidden
387
+ * @response `404` `(HandlerMap & {
388
+ msg?: string,
389
+
390
+ })` Not Found
391
+ * @response `500` `(HandlerMap & {
392
+ msg?: string,
393
+
394
+ })` Internal Server Error
395
+ */
396
+ updateComment: (id: number, comment: HandlerParamsCommentUpdate, params?: RequestParams) => Promise<HttpResponse<HandlerResponseCommentUpdate, HandlerMap & {
397
+ msg?: string;
398
+ }>>;
399
+ /**
400
+ * @description Delete a specific comment
401
+ *
402
+ * @tags Comment
403
+ * @name DeleteComment
404
+ * @summary Delete Comment
405
+ * @request DELETE:/comments/{id}
406
+ * @secure
407
+ * @response `200` `HandlerMap` OK
408
+ * @response `403` `(HandlerMap & {
409
+ msg?: string,
410
+
411
+ })` Forbidden
412
+ * @response `404` `(HandlerMap & {
413
+ msg?: string,
414
+
415
+ })` Not Found
416
+ * @response `500` `(HandlerMap & {
417
+ msg?: string,
418
+
419
+ })` Internal Server Error
420
+ */
421
+ deleteComment: (id: number, params?: RequestParams) => Promise<HttpResponse<HandlerMap, HandlerMap & {
422
+ msg?: string;
423
+ }>>;
424
+ };
425
+ conf: {
426
+ /**
427
+ * @description Get System Configs for UI
428
+ *
429
+ * @tags System
430
+ * @name Conf
431
+ * @summary Get System Configs
432
+ * @request GET:/conf
433
+ * @response `200` `CommonConfData` OK
434
+ */
435
+ conf: (params?: RequestParams) => Promise<HttpResponse<CommonConfData, any>>;
436
+ /**
437
+ * @description Get social login providers
438
+ *
439
+ * @tags System
440
+ * @name GetSocialLoginProviders
441
+ * @summary Get Social Login Providers
442
+ * @request GET:/conf/auth/providers
443
+ * @response `200` `HandlerResponseConfAuthProviders` OK
444
+ * @response `404` `(HandlerMap & {
445
+ msg?: string,
446
+
447
+ })` Not Found
448
+ */
449
+ getSocialLoginProviders: (params?: RequestParams) => Promise<HttpResponse<HandlerResponseConfAuthProviders, HandlerMap & {
450
+ msg?: string;
451
+ }>>;
452
+ /**
453
+ * @description Get Domain Info
454
+ *
455
+ * @tags System
456
+ * @name GetDomain
457
+ * @summary Get Domain Info
458
+ * @request GET:/conf/domain
459
+ * @response `200` `HandlerResponseConfDomain` OK
460
+ */
461
+ getDomain: (query?: {
462
+ /** Domain URL */
463
+ url?: string;
464
+ }, params?: RequestParams) => Promise<HttpResponse<HandlerResponseConfDomain, any>>;
465
+ };
466
+ notifies: {
467
+ /**
468
+ * @description Get unread notifications owned by the authenticated user or anonymous comment credential
469
+ *
470
+ * @tags Notify
471
+ * @name GetNotifies
472
+ * @summary Get Notifies
473
+ * @request GET:/notifies
474
+ * @secure
475
+ * @response `200` `HandlerResponseNotifyList` OK
476
+ * @response `400` `(HandlerMap & {
477
+ msg?: string,
478
+
479
+ })` Bad Request
480
+ * @response `500` `(HandlerMap & {
481
+ msg?: string,
482
+
483
+ })` Internal Server Error
484
+ */
485
+ getNotifies: (query: {
486
+ /** The user email */
487
+ email: string;
488
+ /** The user name */
489
+ name: string;
490
+ }, params?: RequestParams) => Promise<HttpResponse<HandlerResponseNotifyList, HandlerMap & {
491
+ msg?: string;
492
+ }>>;
493
+ /**
494
+ * @description Mark owned notifications as read using a login or anonymous comment credential
495
+ *
496
+ * @tags Notify
497
+ * @name MarkAllNotifyRead
498
+ * @summary Mark All Notifies as Read
499
+ * @request POST:/notifies/read
500
+ * @secure
501
+ * @response `200` `HandlerMap` OK
502
+ * @response `400` `(HandlerMap & {
503
+ msg?: string,
504
+
505
+ })` Bad Request
506
+ * @response `401` `(HandlerMap & {
507
+ msg?: string,
508
+
509
+ })` Unauthorized
510
+ * @response `500` `(HandlerMap & {
511
+ msg?: string,
512
+
513
+ })` Internal Server Error
514
+ */
515
+ markAllNotifyRead: (options: HandlerParamsNotifyReadAll, params?: RequestParams) => Promise<HttpResponse<HandlerMap, HandlerMap & {
516
+ msg?: string;
517
+ }>>;
518
+ /**
519
+ * @description Mark specific notification as read for user
520
+ *
521
+ * @tags Notify
522
+ * @name MarkNotifyRead
523
+ * @summary Mark Notify as Read
524
+ * @request POST:/notifies/{comment_id}/{notify_key}
525
+ * @response `200` `HandlerMap` OK
526
+ * @response `400` `(HandlerMap & {
527
+ msg?: string,
528
+
529
+ })` Bad Request
530
+ * @response `404` `(HandlerMap & {
531
+ msg?: string,
532
+
533
+ })` Not Found
534
+ * @response `500` `(HandlerMap & {
535
+ msg?: string,
536
+
537
+ })` Internal Server Error
538
+ */
539
+ markNotifyRead: (commentId: number, notifyKey: string, params?: RequestParams) => Promise<HttpResponse<HandlerMap, HandlerMap & {
540
+ msg?: string;
541
+ }>>;
542
+ };
543
+ pages: {
544
+ /**
545
+ * @description Get a list of pages by some conditions
546
+ *
547
+ * @tags Page
548
+ * @name GetPages
549
+ * @summary Get Page List
550
+ * @request GET:/pages
551
+ * @secure
552
+ * @response `200` `HandlerResponsePageList` OK
553
+ * @response `403` `(HandlerMap & {
554
+ msg?: string,
555
+
556
+ })` Forbidden
557
+ */
558
+ getPages: (query?: {
559
+ /** Only include pages with comments (including pending comments) */
560
+ has_comments?: boolean;
561
+ /** The limit for pagination */
562
+ limit?: number;
563
+ /** The offset for pagination */
564
+ offset?: number;
565
+ /** Search keywords */
566
+ search?: string;
567
+ /** The site name of your content scope */
568
+ site_name?: string;
569
+ }, params?: RequestParams) => Promise<HttpResponse<HandlerResponsePageList, HandlerMap & {
570
+ msg?: string;
571
+ }>>;
572
+ /**
573
+ * @description Fetch the data of all pages
574
+ *
575
+ * @tags Page
576
+ * @name FetchAllPages
577
+ * @summary Fetch All Pages Data
578
+ * @request POST:/pages/fetch
579
+ * @secure
580
+ * @response `200` `HandlerMap` OK
581
+ * @response `400` `(HandlerMap & {
582
+ msg?: string,
583
+
584
+ })` Bad Request
585
+ * @response `500` `(HandlerMap & {
586
+ msg?: string,
587
+
588
+ })` Internal Server Error
589
+ */
590
+ fetchAllPages: (options: HandlerParamsPageFetchAll, params?: RequestParams) => Promise<HttpResponse<HandlerMap, HandlerMap & {
591
+ msg?: string;
592
+ }>>;
593
+ /**
594
+ * @description Get the status of the task of fetching all pages
595
+ *
596
+ * @tags Page
597
+ * @name GetPageFetchStatus
598
+ * @summary Get Pages Fetch Status
599
+ * @request GET:/pages/fetch/status
600
+ * @secure
601
+ * @response `200` `HandlerResponsePageFetchStatus` OK
602
+ */
603
+ getPageFetchStatus: (params?: RequestParams) => Promise<HttpResponse<HandlerResponsePageFetchStatus, any>>;
604
+ /**
605
+ * @description Increase and get the number of page views
606
+ *
607
+ * @tags Page
608
+ * @name LogPv
609
+ * @summary Increase Page Views (PV)
610
+ * @request POST:/pages/pv
611
+ * @response `200` `HandlerResponsePagePV` OK
612
+ */
613
+ logPv: (page: HandlerParamsPagePV, params?: RequestParams) => Promise<HttpResponse<HandlerResponsePagePV, any>>;
614
+ /**
615
+ * @description Update a specific page
616
+ *
617
+ * @tags Page
618
+ * @name UpdatePage
619
+ * @summary Update Page
620
+ * @request PUT:/pages/{id}
621
+ * @secure
622
+ * @response `200` `HandlerResponsePageUpdate` OK
623
+ * @response `400` `(HandlerMap & {
624
+ msg?: string,
625
+
626
+ })` Bad Request
627
+ * @response `403` `(HandlerMap & {
628
+ msg?: string,
629
+
630
+ })` Forbidden
631
+ * @response `404` `(HandlerMap & {
632
+ msg?: string,
633
+
634
+ })` Not Found
635
+ * @response `500` `(HandlerMap & {
636
+ msg?: string,
637
+
638
+ })` Internal Server Error
639
+ */
640
+ updatePage: (id: number, page: HandlerParamsPageUpdate, params?: RequestParams) => Promise<HttpResponse<HandlerResponsePageUpdate, HandlerMap & {
641
+ msg?: string;
642
+ }>>;
643
+ /**
644
+ * @description Delete a specific page
645
+ *
646
+ * @tags Page
647
+ * @name DeletePage
648
+ * @summary Delete Page
649
+ * @request DELETE:/pages/{id}
650
+ * @secure
651
+ * @response `200` `HandlerMap` OK
652
+ * @response `403` `(HandlerMap & {
653
+ msg?: string,
654
+
655
+ })` Forbidden
656
+ * @response `404` `(HandlerMap & {
657
+ msg?: string,
658
+
659
+ })` Not Found
660
+ * @response `500` `(HandlerMap & {
661
+ msg?: string,
662
+
663
+ })` Internal Server Error
664
+ */
665
+ deletePage: (id: number, params?: RequestParams) => Promise<HttpResponse<HandlerMap, HandlerMap & {
666
+ msg?: string;
667
+ }>>;
668
+ /**
669
+ * @description Fetch the data of a specific page
670
+ *
671
+ * @tags Page
672
+ * @name FetchPage
673
+ * @summary Fetch Page Data
674
+ * @request POST:/pages/{id}/fetch
675
+ * @secure
676
+ * @response `200` `HandlerResponsePageFetch` OK
677
+ * @response `404` `(HandlerMap & {
678
+ msg?: string,
679
+
680
+ })` Not Found
681
+ * @response `500` `(HandlerMap & {
682
+ msg?: string,
683
+
684
+ })` Internal Server Error
685
+ */
686
+ fetchPage: (id: number, params?: RequestParams) => Promise<HttpResponse<HandlerResponsePageFetch, HandlerMap & {
687
+ msg?: string;
688
+ }>>;
689
+ };
690
+ sendEmail: {
691
+ /**
692
+ * @description Send an email to test the email sender
693
+ *
694
+ * @tags System
695
+ * @name SendEmail
696
+ * @summary Send Email
697
+ * @request POST:/send_email
698
+ * @secure
699
+ * @response `200` `HandlerMap` OK
700
+ * @response `403` `(HandlerMap & {
701
+ msg?: string,
702
+
703
+ })` Forbidden
704
+ * @response `500` `HandlerMap` Internal Server Error
705
+ */
706
+ sendEmail: (email: HandlerParamsEmailSend, params?: RequestParams) => Promise<HttpResponse<HandlerMap, HandlerMap | (HandlerMap & {
707
+ msg?: string;
708
+ })>>;
709
+ };
710
+ settings: {
711
+ /**
712
+ * @description Get settings from app config file
713
+ *
714
+ * @tags System
715
+ * @name GetSettings
716
+ * @summary Get Settings
717
+ * @request GET:/settings
718
+ * @secure
719
+ * @response `200` `HandlerResponseSettingGet` OK
720
+ * @response `403` `(HandlerMap & {
721
+ msg?: string,
722
+
723
+ })` Forbidden
724
+ * @response `500` `(HandlerMap & {
725
+ msg?: string,
726
+
727
+ })` Internal Server Error
728
+ */
729
+ getSettings: (params?: RequestParams) => Promise<HttpResponse<HandlerResponseSettingGet, HandlerMap & {
730
+ msg?: string;
731
+ }>>;
732
+ /**
733
+ * @description Apply settings and restart the server
734
+ *
735
+ * @tags System
736
+ * @name ApplySettings
737
+ * @summary Save and apply Settings
738
+ * @request PUT:/settings
739
+ * @secure
740
+ * @response `200` `HandlerMap` OK
741
+ * @response `403` `(HandlerMap & {
742
+ msg?: string,
743
+
744
+ })` Forbidden
745
+ * @response `500` `(HandlerMap & {
746
+ msg?: string,
747
+
748
+ })` Internal Server Error
749
+ */
750
+ applySettings: (settings: HandlerParamsSettingApply, params?: RequestParams) => Promise<HttpResponse<HandlerMap, HandlerMap & {
751
+ msg?: string;
752
+ }>>;
753
+ /**
754
+ * @description Get config templates in different languages for rendering the settings page in the frontend
755
+ *
756
+ * @tags System
757
+ * @name GetSettingsTemplate
758
+ * @summary Get Settings Template
759
+ * @request GET:/settings/template/{locale}
760
+ * @secure
761
+ * @response `200` `HandlerResponseSettingTemplate` OK
762
+ */
763
+ getSettingsTemplate: (locale: string, params?: RequestParams) => Promise<HttpResponse<HandlerResponseSettingTemplate, any>>;
764
+ };
765
+ sites: {
766
+ /**
767
+ * @description Get a list of sites by some conditions
768
+ *
769
+ * @tags Site
770
+ * @name GetSites
771
+ * @summary Get Site List
772
+ * @request GET:/sites
773
+ * @secure
774
+ * @response `200` `HandlerResponseSiteList` OK
775
+ */
776
+ getSites: (params?: RequestParams) => Promise<HttpResponse<HandlerResponseSiteList, any>>;
777
+ /**
778
+ * @description Create a new site
779
+ *
780
+ * @tags Site
781
+ * @name CreateSite
782
+ * @summary Create Site
783
+ * @request POST:/sites
784
+ * @secure
785
+ * @response `200` `HandlerResponseSiteCreate` OK
786
+ * @response `400` `(HandlerMap & {
787
+ msg?: string,
788
+
789
+ })` Bad Request
790
+ * @response `403` `(HandlerMap & {
791
+ msg?: string,
792
+
793
+ })` Forbidden
794
+ * @response `500` `(HandlerMap & {
795
+ msg?: string,
796
+
797
+ })` Internal Server Error
798
+ */
799
+ createSite: (site: HandlerParamsSiteCreate, params?: RequestParams) => Promise<HttpResponse<HandlerResponseSiteCreate, HandlerMap & {
800
+ msg?: string;
801
+ }>>;
802
+ /**
803
+ * @description Update a specific site
804
+ *
805
+ * @tags Site
806
+ * @name UpdateSite
807
+ * @summary Update Site
808
+ * @request PUT:/sites/{id}
809
+ * @secure
810
+ * @response `200` `HandlerResponseSiteUpdate` OK
811
+ */
812
+ updateSite: (id: number, site: HandlerParamsSiteUpdate, params?: RequestParams) => Promise<HttpResponse<HandlerResponseSiteUpdate, any>>;
813
+ /**
814
+ * @description Delete a specific site
815
+ *
816
+ * @tags Site
817
+ * @name DeleteSite
818
+ * @summary Site Delete
819
+ * @request DELETE:/sites/{id}
820
+ * @secure
821
+ * @response `200` `HandlerMap` OK
822
+ * @response `403` `(HandlerMap & {
823
+ msg?: string,
824
+
825
+ })` Forbidden
826
+ * @response `404` `(HandlerMap & {
827
+ msg?: string,
828
+
829
+ })` Not Found
830
+ * @response `500` `(HandlerMap & {
831
+ msg?: string,
832
+
833
+ })` Internal Server Error
834
+ */
835
+ deleteSite: (id: number, params?: RequestParams) => Promise<HttpResponse<HandlerMap, HandlerMap & {
836
+ msg?: string;
837
+ }>>;
838
+ };
839
+ sso: {
840
+ /**
841
+ * @description Validates a third-party OIDC access token by calling the issuer's /userinfo endpoint, requires a verified email claim, then mints an Artalk session JWT. Use when the surrounding application already runs OIDC and you want Artalk comments to inherit that session without showing Artalk's own login UI.
842
+ *
843
+ * @tags Auth
844
+ * @name AuthSsoExchange
845
+ * @summary Exchange an external IdP access token for an Artalk JWT
846
+ * @request POST:/sso/exchange
847
+ * @response `200` `HandlerResponseUserLogin` OK
848
+ * @response `400` `(HandlerMap & {
849
+ msg?: string,
850
+
851
+ })` Bad Request
852
+ * @response `401` `(HandlerMap & {
853
+ msg?: string,
854
+
855
+ })` Unauthorized
856
+ * @response `404` `(HandlerMap & {
857
+ msg?: string,
858
+
859
+ })` Not Found
860
+ * @response `500` `(HandlerMap & {
861
+ msg?: string,
862
+
863
+ })` Internal Server Error
864
+ * @response `502` `(HandlerMap & {
865
+ msg?: string,
866
+
867
+ })` Bad Gateway
868
+ * @response `503` `(HandlerMap & {
869
+ msg?: string,
870
+
871
+ })` Service Unavailable
872
+ */
873
+ authSsoExchange: (body: HandlerParamsAuthSSOExchange, params?: RequestParams) => Promise<HttpResponse<HandlerResponseUserLogin, HandlerMap & {
874
+ msg?: string;
875
+ }>>;
876
+ };
877
+ stats: {
878
+ /**
879
+ * @description Get the statistics of various data analysis
880
+ *
881
+ * @tags Statistic
882
+ * @name GetStats
883
+ * @summary Statistic
884
+ * @request GET:/stats/{type}
885
+ * @response `200` `CommonJSONResult` OK
886
+ * @response `400` `(HandlerMap & {
887
+ msg?: string,
888
+
889
+ })` Bad Request
890
+ * @response `403` `(HandlerMap & {
891
+ msg?: string,
892
+
893
+ })` Forbidden
894
+ * @response `404` `(HandlerMap & {
895
+ msg?: string,
896
+
897
+ })` Not Found
898
+ * @response `500` `(HandlerMap & {
899
+ msg?: string,
900
+
901
+ })` Internal Server Error
902
+ */
903
+ 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?: {
904
+ /** The limit for pagination */
905
+ limit?: number;
906
+ /** multiple page keys separated by commas */
907
+ page_keys?: string;
908
+ /** The site name of your content scope */
909
+ site_name?: string;
910
+ }, params?: RequestParams) => Promise<HttpResponse<CommonJSONResult, HandlerMap & {
911
+ msg?: string;
912
+ }>>;
913
+ };
914
+ transfer: {
915
+ /**
916
+ * @description Export data from Artalk
917
+ *
918
+ * @tags Transfer
919
+ * @name ExportArtrans
920
+ * @summary Export Artrans
921
+ * @request GET:/transfer/export
922
+ * @secure
923
+ * @response `200` `HandlerResponseTransferExport` OK
924
+ * @response `500` `(HandlerMap & {
925
+ msg?: string,
926
+
927
+ })` Internal Server Error
928
+ */
929
+ exportArtrans: (params?: RequestParams) => Promise<HttpResponse<HandlerResponseTransferExport, HandlerMap & {
930
+ msg?: string;
931
+ }>>;
932
+ /**
933
+ * @description Import data to Artalk
934
+ *
935
+ * @tags Transfer
936
+ * @name ImportArtrans
937
+ * @summary Import Artrans
938
+ * @request POST:/transfer/import
939
+ * @secure
940
+ * @response `200` `string` OK
941
+ */
942
+ importArtrans: (data: HandlerParamsTransferImport, params?: RequestParams) => Promise<HttpResponse<string, any>>;
943
+ /**
944
+ * @description Upload a file to prepare to import
945
+ *
946
+ * @tags Transfer
947
+ * @name UploadArtrans
948
+ * @summary Upload Artrans
949
+ * @request POST:/transfer/upload
950
+ * @secure
951
+ * @response `200` `(HandlerResponseTransferUpload & {
952
+ filename?: string,
953
+
954
+ })` OK
955
+ * @response `500` `(HandlerMap & {
956
+ msg?: string,
957
+
958
+ })` Internal Server Error
959
+ */
960
+ uploadArtrans: (data: {
961
+ /**
962
+ * Upload file in preparation for import task
963
+ * @format binary
964
+ */
965
+ file: File;
966
+ }, params?: RequestParams) => Promise<HttpResponse<HandlerResponseTransferUpload & {
967
+ filename?: string;
968
+ }, HandlerMap & {
969
+ msg?: string;
970
+ }>>;
971
+ };
972
+ upload: {
973
+ /**
974
+ * @description Upload file from this endpoint
975
+ *
976
+ * @tags Upload
977
+ * @name Upload
978
+ * @summary Upload
979
+ * @request POST:/upload
980
+ * @secure
981
+ * @response `200` `HandlerResponseUpload` OK
982
+ * @response `400` `(HandlerMap & {
983
+ msg?: string,
984
+
985
+ })` Bad Request
986
+ * @response `403` `(HandlerMap & {
987
+ msg?: string,
988
+
989
+ })` Forbidden
990
+ * @response `500` `(HandlerMap & {
991
+ msg?: string,
992
+
993
+ })` Internal Server Error
994
+ */
995
+ upload: (data: {
996
+ /**
997
+ * Upload file
998
+ * @format binary
999
+ */
1000
+ file: File;
1001
+ }, params?: RequestParams) => Promise<HttpResponse<HandlerResponseUpload, HandlerMap & {
1002
+ msg?: string;
1003
+ }>>;
1004
+ };
1005
+ user: {
1006
+ /**
1007
+ * @description Get user info to prepare for login or check current user status
1008
+ *
1009
+ * @tags Auth
1010
+ * @name GetUser
1011
+ * @summary Get User Info
1012
+ * @request GET:/user
1013
+ * @secure
1014
+ * @response `200` `HandlerResponseUserInfo` OK
1015
+ * @response `400` `(HandlerMap & {
1016
+ msg?: string,
1017
+
1018
+ })` Bad Request
1019
+ */
1020
+ getUser: (query?: {
1021
+ /** The user email */
1022
+ email?: string;
1023
+ /** The username */
1024
+ name?: string;
1025
+ }, params?: RequestParams) => Promise<HttpResponse<HandlerResponseUserInfo, HandlerMap & {
1026
+ msg?: string;
1027
+ }>>;
1028
+ /**
1029
+ * @description Update user profile when user is logged in
1030
+ *
1031
+ * @tags Auth
1032
+ * @name UpdateProfile
1033
+ * @summary Update user profile
1034
+ * @request POST:/user
1035
+ * @secure
1036
+ * @response `200` `HandlerResponseUserInfoUpdate` OK
1037
+ * @response `400` `(HandlerMap & {
1038
+ msg?: string,
1039
+
1040
+ })` Bad Request
1041
+ * @response `500` `(HandlerMap & {
1042
+ msg?: string,
1043
+
1044
+ })` Internal Server Error
1045
+ */
1046
+ updateProfile: (data: HandlerRequestUserInfoUpdate, params?: RequestParams) => Promise<HttpResponse<HandlerResponseUserInfoUpdate, HandlerMap & {
1047
+ msg?: string;
1048
+ }>>;
1049
+ /**
1050
+ * @description Login user by name or email
1051
+ *
1052
+ * @tags Auth
1053
+ * @name Login
1054
+ * @summary Get Access Token
1055
+ * @request POST:/user/access_token
1056
+ * @response `200` `HandlerResponseUserLogin` OK
1057
+ * @response `400` `(HandlerMap & {
1058
+ data?: {
1059
+ need_name_select?: (string)[],
1060
+
1061
+ },
1062
+ msg?: string,
1063
+
1064
+ })` Multiple users with the same email address are matched
1065
+ * @response `401` `(HandlerMap & {
1066
+ msg?: string,
1067
+
1068
+ })` Unauthorized
1069
+ * @response `500` `(HandlerMap & {
1070
+ msg?: string,
1071
+
1072
+ })` Internal Server Error
1073
+ */
1074
+ login: (user: HandlerParamsUserLogin, params?: RequestParams) => Promise<HttpResponse<HandlerResponseUserLogin, (HandlerMap & {
1075
+ data?: {
1076
+ need_name_select?: string[];
1077
+ };
1078
+ msg?: string;
1079
+ }) | (HandlerMap & {
1080
+ msg?: string;
1081
+ })>>;
1082
+ /**
1083
+ * @description Get user login status by header Authorization
1084
+ *
1085
+ * @tags Auth
1086
+ * @name GetUserStatus
1087
+ * @summary Get Login Status
1088
+ * @request GET:/user/status
1089
+ * @secure
1090
+ * @response `200` `HandlerResponseUserStatus` OK
1091
+ */
1092
+ getUserStatus: (query?: {
1093
+ /** The user email */
1094
+ email?: string;
1095
+ /** The username */
1096
+ name?: string;
1097
+ }, params?: RequestParams) => Promise<HttpResponse<HandlerResponseUserStatus, any>>;
1098
+ };
1099
+ users: {
1100
+ /**
1101
+ * @description Create a new user
1102
+ *
1103
+ * @tags User
1104
+ * @name CreateUser
1105
+ * @summary Create User
1106
+ * @request POST:/users
1107
+ * @secure
1108
+ * @response `200` `HandlerResponseUserCreate` OK
1109
+ * @response `400` `(HandlerMap & {
1110
+ msg?: string,
1111
+
1112
+ })` Bad Request
1113
+ * @response `403` `(HandlerMap & {
1114
+ msg?: string,
1115
+
1116
+ })` Forbidden
1117
+ * @response `500` `(HandlerMap & {
1118
+ msg?: string,
1119
+
1120
+ })` Internal Server Error
1121
+ */
1122
+ createUser: (user: HandlerParamsUserCreate, params?: RequestParams) => Promise<HttpResponse<HandlerResponseUserCreate, HandlerMap & {
1123
+ msg?: string;
1124
+ }>>;
1125
+ /**
1126
+ * @description Update a specific user
1127
+ *
1128
+ * @tags User
1129
+ * @name UpdateUser
1130
+ * @summary Update User
1131
+ * @request PUT:/users/{id}
1132
+ * @secure
1133
+ * @response `200` `HandlerResponseUserUpdate` OK
1134
+ * @response `400` `(HandlerMap & {
1135
+ msg?: string,
1136
+
1137
+ })` Bad Request
1138
+ * @response `403` `(HandlerMap & {
1139
+ msg?: string,
1140
+
1141
+ })` Forbidden
1142
+ * @response `404` `(HandlerMap & {
1143
+ msg?: string,
1144
+
1145
+ })` Not Found
1146
+ * @response `500` `(HandlerMap & {
1147
+ msg?: string,
1148
+
1149
+ })` Internal Server Error
1150
+ */
1151
+ updateUser: (id: number, user: HandlerParamsUserUpdate, params?: RequestParams) => Promise<HttpResponse<HandlerResponseUserUpdate, HandlerMap & {
1152
+ msg?: string;
1153
+ }>>;
1154
+ /**
1155
+ * @description Delete a specific user
1156
+ *
1157
+ * @tags User
1158
+ * @name DeleteUser
1159
+ * @summary Delete User
1160
+ * @request DELETE:/users/{id}
1161
+ * @secure
1162
+ * @response `200` `HandlerMap` OK
1163
+ * @response `403` `(HandlerMap & {
1164
+ msg?: string,
1165
+
1166
+ })` Forbidden
1167
+ * @response `404` `(HandlerMap & {
1168
+ msg?: string,
1169
+
1170
+ })` Not Found
1171
+ * @response `500` `(HandlerMap & {
1172
+ msg?: string,
1173
+
1174
+ })` Internal Server Error
1175
+ */
1176
+ deleteUser: (id: number, params?: RequestParams) => Promise<HttpResponse<HandlerMap, HandlerMap & {
1177
+ msg?: string;
1178
+ }>>;
1179
+ /**
1180
+ * @description Get a list of users by some conditions
1181
+ *
1182
+ * @tags User
1183
+ * @name GetUsers
1184
+ * @summary Get User List
1185
+ * @request GET:/users/{type}
1186
+ * @secure
1187
+ * @response `200` `HandlerResponseAdminUserList` OK
1188
+ * @response `403` `(HandlerMap & {
1189
+ msg?: string,
1190
+
1191
+ })` Forbidden
1192
+ */
1193
+ getUsers: (type?: "all" | "admin" | "in_conf", query?: {
1194
+ /** The limit for pagination */
1195
+ limit?: number;
1196
+ /** The offset for pagination */
1197
+ offset?: number;
1198
+ /** Search keywords */
1199
+ search?: string;
1200
+ }, params?: RequestParams) => Promise<HttpResponse<HandlerResponseAdminUserList, HandlerMap & {
1201
+ msg?: string;
1202
+ }>>;
1203
+ };
1204
+ version: {
1205
+ /**
1206
+ * @description Get the version of Artalk
1207
+ *
1208
+ * @tags System
1209
+ * @name GetVersion
1210
+ * @summary Get Version Info
1211
+ * @request GET:/version
1212
+ * @response `200` `CommonApiVersionData` OK
1213
+ */
1214
+ getVersion: (params?: RequestParams) => Promise<HttpResponse<CommonApiVersionData, any>>;
1215
+ };
1216
+ votes: {
1217
+ /**
1218
+ * @description Sync the number of votes in the `comments` or `pages` data tables to keep them the same as the `votes` table
1219
+ *
1220
+ * @tags Vote
1221
+ * @name SyncVotes
1222
+ * @summary Sync Vote Data
1223
+ * @request POST:/votes/sync
1224
+ * @secure
1225
+ * @response `200` `HandlerMap` OK
1226
+ * @response `403` `(HandlerMap & {
1227
+ msg?: string,
1228
+
1229
+ })` Forbidden
1230
+ */
1231
+ syncVotes: (params?: RequestParams) => Promise<HttpResponse<HandlerMap, HandlerMap & {
1232
+ msg?: string;
1233
+ }>>;
1234
+ /**
1235
+ * @description Get vote status for a specific comment or page
1236
+ *
1237
+ * @tags Vote
1238
+ * @name GetVote
1239
+ * @summary Get Vote Status
1240
+ * @request GET:/votes/{target_name}/{target_id}
1241
+ * @response `200` `HandlerResponseVote` OK
1242
+ * @response `400` `(HandlerMap & {
1243
+ msg?: string,
1244
+
1245
+ })` Bad Request
1246
+ * @response `403` `(HandlerMap & {
1247
+ msg?: string,
1248
+
1249
+ })` Forbidden
1250
+ * @response `404` `(HandlerMap & {
1251
+ msg?: string,
1252
+
1253
+ })` Not Found
1254
+ * @response `500` `(HandlerMap & {
1255
+ msg?: string,
1256
+
1257
+ })` Internal Server Error
1258
+ */
1259
+ getVote: (targetName: "comment" | "page", targetId: number, params?: RequestParams) => Promise<HttpResponse<HandlerResponseVote, HandlerMap & {
1260
+ msg?: string;
1261
+ }>>;
1262
+ /**
1263
+ * @description Create a new vote for a specific comment or page
1264
+ *
1265
+ * @tags Vote
1266
+ * @name CreateVote
1267
+ * @summary Create Vote
1268
+ * @request POST:/votes/{target_name}/{target_id}/{choice}
1269
+ * @response `200` `HandlerResponseVote` OK
1270
+ * @response `403` `(HandlerMap & {
1271
+ msg?: string,
1272
+
1273
+ })` Forbidden
1274
+ * @response `404` `(HandlerMap & {
1275
+ msg?: string,
1276
+
1277
+ })` Not Found
1278
+ * @response `500` `(HandlerMap & {
1279
+ msg?: string,
1280
+
1281
+ })` Internal Server Error
1282
+ */
1283
+ createVote: (targetName: "comment" | "page", targetId: number, choice: "up" | "down", vote: HandlerParamsVoteCreate, params?: RequestParams) => Promise<HttpResponse<HandlerResponseVote, HandlerMap & {
1284
+ msg?: string;
1285
+ }>>;
1286
+ };
1287
+ }
1288
+
1289
+ declare interface ApiConfig<SecurityDataType = unknown> {
1290
+ baseUrl?: string;
1291
+ baseApiParams?: Omit<RequestParams, 'baseUrl' | 'cancelToken' | 'signal'>;
1292
+ securityWorker?: (securityData: SecurityDataType | null) => Promise<RequestParams | void> | RequestParams | void;
1293
+ customFetch?: typeof fetch;
1294
+ }
1295
+
1296
+ declare interface ApiHandler<T extends PayloadKey = PayloadKey> {
1297
+ action: T;
1298
+ handler: (data: ApiHandlerPayload[T]) => Promise<void>;
1299
+ }
1300
+
1301
+ declare interface ApiHandlerPayload {
1302
+ need_captcha: {
1303
+ img_data?: string;
1304
+ iframe?: string;
1305
+ };
1306
+ need_login: object;
1307
+ need_auth_login: object;
1308
+ }
1309
+
1310
+ export declare interface ApiHandlers {
1311
+ add: <T extends PayloadKey>(action: T, handler: (data: ApiHandlerPayload[T]) => Promise<void>) => void;
1312
+ remove: (action: PayloadKey) => void;
1313
+ get: () => ApiHandler[];
1314
+ }
1315
+
1316
+ declare interface ApiOptions {
1317
+ baseURL: string;
1318
+ siteName: string;
1319
+ pageKey: string;
1320
+ pageTitle: string;
1321
+ timeout?: number;
1322
+ getGuestToken?: (create?: boolean) => string | undefined;
1323
+ getApiToken?: () => string | undefined;
1324
+ userInfo?: {
1325
+ name: string;
1326
+ email: string;
1327
+ };
1328
+ handlers?: ApiHandlers;
1329
+ }
1330
+
1331
+ export declare interface ApiVersionData {
1332
+ /** API 程序名 */
1333
+ app: string;
1334
+ /** API 程序版本号 */
1335
+ version: string;
1336
+ /** API 程序 CommitHash */
1337
+ commit_hash: string;
1338
+ }
1339
+
1340
+ /**
1341
+ * Artalk
1342
+ *
1343
+ * @see https://artalk.js.org
1344
+ */
1345
+ declare class Artalk {
1346
+ ctx: Context;
1347
+ constructor(conf: ConfigPartial);
1348
+ /** Get the config of Artalk */
1349
+ getConf(): Config;
1350
+ /** Get the root element of Artalk */
1351
+ getEl(): HTMLElement;
1352
+ /** Update config of Artalk */
1353
+ update(conf: ConfigPartial): void;
1354
+ /** Reload comment list of Artalk */
1355
+ reload(): void;
1356
+ /** Destroy instance of Artalk */
1357
+ destroy(): void;
1358
+ /** Add an event listener */
1359
+ on<K extends keyof EventPayloadMap>(name: K, handler: EventHandler<EventPayloadMap[K]>): void;
1360
+ /** Remove an event listener */
1361
+ off<K extends keyof EventPayloadMap>(name: K, handler: EventHandler<EventPayloadMap[K]>): void;
1362
+ /** Trigger an event */
1363
+ trigger<K extends keyof EventPayloadMap>(name: K, payload?: EventPayloadMap[K]): void;
1364
+ /** Set dark mode */
1365
+ setDarkMode(darkMode: boolean): void;
1366
+ /** Init Artalk */
1367
+ static init(conf: ConfigPartial): Artalk;
1368
+ /** Use plugin, the plugin will be used when Artalk.init */
1369
+ static use<T = any>(plugin: ArtalkPlugin<T>, options?: T): void;
1370
+ /** Load count widget */
1371
+ static loadCountWidget(c: ConfigPartial): void;
1372
+ /** @deprecated Please use `getEl()` instead */
1373
+ get $root(): HTMLElement;
1374
+ /** @description Please use `getConf()` instead */
1375
+ get conf(): Config;
1376
+ }
1377
+ export default Artalk;
1378
+
1379
+ export declare type ArtalkConfig = Config;
1380
+
1381
+ export declare type ArtalkPlugin<T = any> = (ctx: Context, options?: T) => void;
1382
+
1383
+ declare namespace ArtalkType {
1384
+ export {
1385
+ I18n,
1386
+ I18nKeys,
1387
+ Api,
1388
+ ApiHandlers,
1389
+ Config,
1390
+ ConfigPartial,
1391
+ ArtalkConfig,
1392
+ ConfigManager,
1393
+ CommentData,
1394
+ ListData,
1395
+ PageData,
1396
+ SiteData,
1397
+ UserData,
1398
+ UserDataForAdmin,
1399
+ NotifyData,
1400
+ EmoticonGrpData,
1401
+ EmoticonListData,
1402
+ ApiVersionData,
1403
+ ListFetchParams,
1404
+ ListLastFetchData,
1405
+ DataManager,
1406
+ DataManagerApi,
1407
+ NotifyLevel,
1408
+ UserInfoApiResponseData,
1409
+ FetchError,
1410
+ Context,
1411
+ ContextApi,
1412
+ LocalUser,
1413
+ UserManager,
1414
+ List,
1415
+ ListLayout,
1416
+ EditorState,
1417
+ Editor,
1418
+ EditorApi,
1419
+ EditorPluginManager,
1420
+ ListErrorData,
1421
+ ListFetchedArgs,
1422
+ EventPayloadMap,
1423
+ EventHandler,
1424
+ Event_2 as Event,
1425
+ EventOptions,
1426
+ EventManager,
1427
+ ArtalkPlugin,
1428
+ SidebarLayer,
1429
+ SidebarShowPayload,
1430
+ Layer,
1431
+ LayerManager,
1432
+ CheckerManager,
1433
+ Services
1434
+ }
1435
+ }
1436
+ export { ArtalkType }
1437
+
1438
+ declare interface AuthAuthProviderInfo {
1439
+ icon: string;
1440
+ label: string;
1441
+ name: string;
1442
+ path?: string;
1443
+ }
1444
+
1445
+ declare type CancelToken = Symbol | string | number;
1446
+
1447
+ declare interface Checker<T = any> {
1448
+ el?: HTMLElement;
1449
+ inputType?: 'password' | 'text';
1450
+ body: (checker: CheckerCtx) => HTMLElement;
1451
+ request: (checker: CheckerCtx, inputVal: string) => Promise<T>;
1452
+ onSuccess?: (checker: CheckerCtx, respData: T, inputVal: string, formEl: HTMLElement) => void;
1453
+ onError?: (checker: CheckerCtx, errData: any, inputVal: string, formEl: HTMLElement) => void;
1454
+ }
1455
+
1456
+ declare interface CheckerCaptchaPayload extends CheckerPayload {
1457
+ img_data?: string;
1458
+ iframe?: string;
1459
+ }
1460
+
1461
+ declare interface CheckerCtx {
1462
+ get<K extends keyof CheckerStore>(key: K): CheckerStore[K];
1463
+ set<K extends keyof CheckerStore>(key: K, val: CheckerStore[K]): void;
1464
+ getOpts(): CheckerLauncherOptions;
1465
+ getApi(): Api;
1466
+ getUser(): UserManager;
1467
+ hideInteractInput(): void;
1468
+ triggerSuccess(): void;
1469
+ cancel(): void;
1470
+ }
1471
+
1472
+ declare interface CheckerLauncherOptions {
1473
+ getApi: () => Api;
1474
+ getLayers: () => LayerManager;
1475
+ getUser: () => UserManager;
1476
+ getCaptchaIframeURL: () => string;
1477
+ onReload: () => void;
1478
+ }
1479
+
1480
+ export declare interface CheckerManager {
1481
+ checkCaptcha: (payload: CheckerCaptchaPayload) => Promise<void>;
1482
+ checkAdmin: (payload: CheckerPayload) => Promise<void>;
1483
+ check: (checker: Checker, payload: CheckerPayload, beforeCheck?: (c: CheckerCtx) => void) => void;
1484
+ }
1485
+
1486
+ declare interface CheckerPayload {
1487
+ onSuccess?: () => void;
1488
+ onMount?: (dialogEl: HTMLElement) => void;
1489
+ onCancel?: () => void;
1490
+ }
1491
+
1492
+ declare interface CheckerStore {
1493
+ val?: string;
1494
+ img_data?: string;
1495
+ iframe?: string;
1496
+ }
1497
+
1498
+ declare class CommentActions {
1499
+ private comment;
1500
+ private get data();
1501
+ private get opts();
1502
+ private getApi;
1503
+ constructor(comment: CommentNode);
1504
+ /** 投票操作 */
1505
+ vote(choice: 'up' | 'down'): void;
1506
+ /** 管理员 - 评论状态修改 */
1507
+ adminEdit(type: 'collapsed' | 'pending' | 'pinned', btnElem: ActionBtn): void;
1508
+ /** 管理员 - 评论删除 */
1509
+ adminDelete(btnElem: ActionBtn): void;
1510
+ /** 快速跳转到该评论 */
1511
+ goToReplyComment(): void;
1512
+ }
1513
+
1514
+ export declare interface CommentData {
1515
+ /** 评论 ID */
1516
+ id: number;
1517
+ /** 评论正文 */
1518
+ content: string;
1519
+ /** 用户昵称 */
1520
+ nick: string;
1521
+ /** 用户邮箱 (该字段仅管理员可见) */
1522
+ email?: string;
1523
+ /** 用户邮箱(已加密) */
1524
+ email_encrypted: string;
1525
+ /** 用户链接 */
1526
+ link: string;
1527
+ /** 回复目标评论 ID */
1528
+ rid: number;
1529
+ /** User Agent */
1530
+ ua: string;
1531
+ /** 评论日期 */
1532
+ date: string;
1533
+ /** 是否折叠 */
1534
+ is_collapsed: boolean;
1535
+ /** 是否待审 */
1536
+ is_pending: boolean;
1537
+ /** 是否置顶 */
1538
+ is_pinned: boolean;
1539
+ /** 是否已验证 */
1540
+ is_verified: boolean;
1541
+ /** 徽章文字 */
1542
+ badge_name?: string;
1543
+ /** 徽章颜色 */
1544
+ badge_color?: string;
1545
+ /** IP 属地 */
1546
+ ip_region?: string;
1547
+ /** 是否允许回复 */
1548
+ is_allow_reply: boolean;
1549
+ /** 评论页面 key */
1550
+ page_key: string;
1551
+ /** 评论页面 url */
1552
+ page_url?: string;
1553
+ /** 是否可见 */
1554
+ visible: boolean;
1555
+ /** 站点名(用于隔离) */
1556
+ site_name: string;
1557
+ /** 赞同数 */
1558
+ vote_up: number;
1559
+ /** 反对数 */
1560
+ vote_down: number;
1561
+ }
1562
+
1563
+ declare class CommentNode {
1564
+ $el?: HTMLElement;
1565
+ private renderInstance;
1566
+ private actionInstance;
1567
+ private data;
1568
+ private opts;
1569
+ private parent;
1570
+ private children;
1571
+ private nestCurt;
1572
+ constructor(data: CommentData, opts: CommentOptions);
1573
+ /** 渲染 UI */
1574
+ render(): void;
1575
+ /** 获取评论操作实例对象 */
1576
+ getActions(): CommentActions;
1577
+ /** 获取评论渲染器实例对象 */
1578
+ getRender(): Render;
1579
+ /** 获取评论数据 */
1580
+ getData(): CommentData;
1581
+ /** 设置数据 */
1582
+ setData(data: CommentData): void;
1583
+ /** 获取父评论 */
1584
+ getParent(): CommentNode | null;
1585
+ /** 获取所有子评论 */
1586
+ getChildren(): CommentNode[];
1587
+ /** 获取当前嵌套层数 */
1588
+ getNestCurt(): number;
1589
+ /** 判断是否为根评论 */
1590
+ getIsRoot(): boolean;
1591
+ /** 获取评论 ID */
1592
+ getID(): number;
1593
+ /** 置入子评论 */
1594
+ putChild(childNode: CommentNode, insertMode?: 'append' | 'prepend'): void;
1595
+ /** 获取存放子评论的元素对象 */
1596
+ getChildrenWrapEl(): HTMLElement;
1597
+ /** 获取所有父评论 */
1598
+ getParents(): CommentNode[];
1599
+ /**
1600
+ * Get the element of the comment
1601
+ *
1602
+ * The `getEl()` will always return the latest $el after calling `render()`.
1603
+ * Please be aware of the memory leak if you use the $el reference directly.
1604
+ */
1605
+ getEl(): HTMLElement;
1606
+ /**
1607
+ * Focus on the comment
1608
+ *
1609
+ * Scroll to the comment and perform flash animation
1610
+ */
1611
+ focus(): void;
1612
+ scrollIntoView(): void;
1613
+ /**
1614
+ * Remove the comment node
1615
+ */
1616
+ remove(): void;
1617
+ /** 获取 Gravatar 头像 URL */
1618
+ getGravatarURL(): string;
1619
+ /** 获取评论 markdown 解析后的内容 */
1620
+ getContentMarked(): string;
1621
+ /** 获取格式化后的日期 */
1622
+ getDateFormatted(): any;
1623
+ /** 获取用户 UserAgent 信息 */
1624
+ getUserUA(): {
1625
+ browser: string;
1626
+ os: string;
1627
+ };
1628
+ /** 获取配置 */
1629
+ getOpts(): CommentOptions;
1630
+ }
1631
+
1632
+ declare interface CommentOptions {
1633
+ onAfterRender?: () => void;
1634
+ onDelete?: (c: CommentNode) => void;
1635
+ /** The comment being replied to (linked comment) */
1636
+ replyTo?: CommentData;
1637
+ flatMode: boolean;
1638
+ vote: boolean;
1639
+ voteDown: boolean;
1640
+ uaBadge: boolean;
1641
+ nestMax: number;
1642
+ gravatar: Config['gravatar'];
1643
+ heightLimit: Config['heightLimit'];
1644
+ avatarURLBuilder: Config['avatarURLBuilder'];
1645
+ scrollRelativeTo: Config['scrollRelativeTo'];
1646
+ dateFormatter: Config['dateFormatter'];
1647
+ getApi: () => Api;
1648
+ replyComment: Context['replyComment'];
1649
+ editComment: Context['editComment'];
1650
+ }
1651
+
1652
+ declare interface CommonApiVersionData {
1653
+ app: string;
1654
+ commit_hash: string;
1655
+ version: string;
1656
+ }
1657
+
1658
+ declare interface CommonConfData {
1659
+ frontend_conf: CommonMap;
1660
+ version: CommonApiVersionData;
1661
+ }
1662
+
1663
+ declare interface CommonJSONResult {
1664
+ /** Data */
1665
+ data?: any;
1666
+ /** Message */
1667
+ msg?: string;
1668
+ }
1669
+
1670
+ declare type CommonMap = Record<string, any>;
1671
+
1672
+ export declare interface Config {
1673
+ /** Element selector or Element to mount the Artalk */
1674
+ el: string | HTMLElement;
1675
+ /** Unique page identifier */
1676
+ pageKey: string;
1677
+ /** Title of the page */
1678
+ pageTitle: string;
1679
+ /** Server address */
1680
+ server: string;
1681
+ /** Site name */
1682
+ site: string;
1683
+ /** Placeholder text for the comment input box */
1684
+ placeholder: string;
1685
+ /** Text to display when there are no comments */
1686
+ noComment: string;
1687
+ /** Text for the send button */
1688
+ sendBtn: string;
1689
+ /** Movable comment box (display below the comment to be replied) */
1690
+ editorTravel: boolean;
1691
+ /** Emoticons settings */
1692
+ emoticons: object | any[] | string | false;
1693
+ /** Gravatar avatar settings */
1694
+ gravatar: {
1695
+ /** API endpoint */
1696
+ mirror: string;
1697
+ /** API parameters */
1698
+ params: string;
1699
+ };
1700
+ /** Avatar URL generator function */
1701
+ avatarURLBuilder?: (comment: CommentData) => string;
1702
+ /** Pagination settings */
1703
+ pagination: {
1704
+ /** Number of comments to fetch per request */
1705
+ pageSize: number;
1706
+ /** "Read more" mode */
1707
+ readMore: boolean;
1708
+ /** Automatically load more comments when scrolled to the bottom */
1709
+ autoLoad: boolean;
1710
+ };
1711
+ /** Height limit configuration */
1712
+ heightLimit: {
1713
+ /** Maximum height for comment content */
1714
+ content: number;
1715
+ /** Maximum height for child comments */
1716
+ children: number;
1717
+ /** Whether the content is scrollable */
1718
+ scrollable: boolean;
1719
+ };
1720
+ /** Voting feature for comments */
1721
+ vote: boolean;
1722
+ /** Downvote button for comments */
1723
+ voteDown: boolean;
1724
+ /** Page Vote Widget */
1725
+ pageVote: {
1726
+ /** Up Vote Button Selector */
1727
+ upBtnEl: string;
1728
+ /** Down Vote Button Selector */
1729
+ downBtnEl: string;
1730
+ /** Up Vote Count Selector */
1731
+ upCountEl: string;
1732
+ /** Down Vote Count Selector */
1733
+ downCountEl: string;
1734
+ /** Active class name if the vote is already cast */
1735
+ activeClass: string;
1736
+ } | boolean;
1737
+ /** Preview feature for comments */
1738
+ preview: boolean;
1739
+ /** Selector for the element binding to the comment count */
1740
+ countEl: string;
1741
+ /** Selector for the element binding to the page views (PV) count */
1742
+ pvEl: string;
1743
+ /** Attribute name for the PageKey in statistics components */
1744
+ statPageKeyAttr: string;
1745
+ /** Dark mode settings */
1746
+ darkMode: boolean | 'auto';
1747
+ /** Request timeout (in seconds) */
1748
+ reqTimeout: number;
1749
+ /** Flat mode for comment display */
1750
+ flatMode: boolean | 'auto';
1751
+ /** Maximum number of levels for nested comments */
1752
+ nestMax: number;
1753
+ /** Sorting order for nested comments */
1754
+ nestSort: 'DATE_ASC' | 'DATE_DESC';
1755
+ /** Display UA badge (user agent badge) */
1756
+ uaBadge: boolean;
1757
+ /** Show sorting dropdown for comment list */
1758
+ listSort: boolean;
1759
+ /** Enable image upload feature */
1760
+ imgUpload: boolean;
1761
+ /** Image uploader function */
1762
+ imgUploader?: (file: File) => Promise<string>;
1763
+ /** Image lazy load mode */
1764
+ imgLazyLoad: false | 'native' | 'data-src';
1765
+ /** Enable version check */
1766
+ versionCheck: boolean;
1767
+ /**
1768
+ * Use remote configuration (from the backend server)
1769
+ *
1770
+ * @deprecated
1771
+ * The `useBackendConf` is always `true` and planned to be removed in the future.
1772
+ *
1773
+ * Please use `preferRemoteConf` to control the priority of the remote and local configuration.
1774
+ *
1775
+ * @default true
1776
+ */
1777
+ useBackendConf: boolean;
1778
+ /**
1779
+ * Prefer to use the local configuration if available
1780
+ *
1781
+ * @note
1782
+ * If `true`, the local config will be used as a fallback (remote config first).
1783
+ *
1784
+ * If `false`, the local config will override the remote config (local config first).
1785
+ *
1786
+ * @default false
1787
+ */
1788
+ preferRemoteConf: boolean;
1789
+ /** Localization settings */
1790
+ locale: I18n | string;
1791
+ /** Backend API version (system data, not allowed for user modification) */
1792
+ apiVersion: string;
1793
+ /** URLs for plugin scripts */
1794
+ pluginURLs?: string[];
1795
+ /** Replacers for the marked (Markdown parser) */
1796
+ markedReplacers?: ((raw: string) => string)[];
1797
+ /** Options for the marked (Markdown parser) */
1798
+ markedOptions?: MarkedOptions;
1799
+ /** Modifier for list fetch request parameters */
1800
+ listFetchParamsModifier?: (params: any) => void;
1801
+ /**
1802
+ * Custom date formatter
1803
+ * @param date - The Date object to format
1804
+ * @returns Formatted date string
1805
+ */
1806
+ dateFormatter?: (date: Date) => string;
1807
+ /** List unread highlight (enable by default in artalk-sidebar) */
1808
+ listUnreadHighlight: boolean;
1809
+ /** The relative element for scrolling (useful if artalk is in a scrollable container) */
1810
+ scrollRelativeTo?: () => HTMLElement;
1811
+ /** Page view increment when comment list is loaded */
1812
+ pvAdd: boolean;
1813
+ /** Immediately fetch comments when Artalk instance is initialized */
1814
+ fetchCommentsOnInit: boolean;
1815
+ /** Callback before submitting a comment */
1816
+ beforeSubmit?: (editor: Editor, next: () => void) => void;
1817
+ }
1818
+
1819
+ export declare interface ConfigManager {
1820
+ watchConf: Context['watchConf'];
1821
+ get: () => Config;
1822
+ update: (conf: ConfigPartial) => void;
1823
+ }
1824
+
1825
+ export declare type ConfigPartial = DeepPartial<Config>;
1826
+
1827
+ declare type Constructor<T, S = Services_2, D extends readonly (keyof S)[] = any> = (...args: {
1828
+ [K in keyof D]: D[K] extends keyof S ? S[D[K]] : never;
1829
+ }) => T;
1830
+
1831
+ declare enum ContentType {
1832
+ Json = "application/json",
1833
+ JsonApi = "application/vnd.api+json",
1834
+ FormData = "multipart/form-data",
1835
+ UrlEncoded = "application/x-www-form-urlencoded",
1836
+ Text = "text/plain"
1837
+ }
1838
+
1839
+ /**
1840
+ * Artalk Context
1841
+ */
1842
+ export declare interface Context extends EventManager<EventPayloadMap>, DependencyContainer<Services> {
1843
+ /** @deprecated Use `getData()` or `inject('data')` instead. */
1844
+ readonly data: Services['data'];
1845
+ /** @deprecated Use `getUser()` or `inject('user')` instead. */
1846
+ readonly user: Services['user'];
1847
+ /** @deprecated Use `inject('editor')` instead. */
1848
+ readonly editor: Services['editor'];
1849
+ /** @deprecated Use `inject('list')` instead. */
1850
+ readonly list: Services['list'];
1851
+ /** @deprecated Use `inject('layers')` instead. */
1852
+ readonly layerManager: Services['layers'];
1853
+ /** @deprecated Use `inject('checkers')` instead. */
1854
+ readonly checkerLauncher: Services['checkers'];
1855
+ /** @deprecated Use `inject('sidebar')` instead. */
1856
+ readonly sidebarLayer: Services['sidebar'];
1857
+ /** @deprecated Use `inject('editorPlugs')` instead. */
1858
+ readonly editorPlugs: Services['editorPlugs'];
1859
+ /**
1860
+ * The root element of Artalk
1861
+ *
1862
+ * @deprecated Use `getEl()` instead
1863
+ */
1864
+ readonly $root: HTMLElement;
1865
+ /** Get the root element */
1866
+ getEl(): HTMLElement;
1867
+ /**
1868
+ * Inject a dependency object
1869
+ *
1870
+ * @deprecated Use `inject()` instead
1871
+ */
1872
+ get<T extends keyof Services>(key: T): Services[T];
1873
+ /**
1874
+ * Get config object
1875
+ *
1876
+ * @deprecated Use `getConf()` and `updateConf()` instead
1877
+ */
1878
+ readonly conf: Config;
1879
+ /** Get the config */
1880
+ getConf(): Config;
1881
+ /** Update the config */
1882
+ updateConf(conf: ConfigPartial): void;
1883
+ /** Watch the config */
1884
+ watchConf<T extends (keyof Config)[]>(keys: T, effect: (val: Pick<Config, T[number]>) => void): void;
1885
+ /** Get the marked instance */
1886
+ getMarked(): Marked | undefined;
1887
+ /** Set dark mode */
1888
+ setDarkMode(darkMode: boolean | 'auto'): void;
1889
+ /** Translate i18n message */
1890
+ $t(key: keyof I18n, args?: {
1891
+ [key: string]: string;
1892
+ }): string;
1893
+ /** Get HTTP API client */
1894
+ getApi(): Api;
1895
+ /** Get HTTP API handlers */
1896
+ getApiHandlers(): ApiHandlers;
1897
+ /** Get Data Manager */
1898
+ getData(): DataManager;
1899
+ /** Get User Manager */
1900
+ getUser(): UserManager;
1901
+ /** Fetch comments */
1902
+ fetch(params: Partial<ListFetchParams>): void;
1903
+ /** Reload comments */
1904
+ reload(): void;
1905
+ /** Destroy */
1906
+ destroy(): void;
1907
+ /** Whether `destroy()` has been called */
1908
+ isDestroyed(): boolean;
1909
+ /** Goto the first comment of the list */
1910
+ listGotoFirst(): void;
1911
+ /** Get the comment data list */
1912
+ getComments(): CommentData[];
1913
+ /** Get the comment node list */
1914
+ getCommentNodes(): CommentNode[];
1915
+ /**
1916
+ * Get the comment data list
1917
+ * @deprecated Use `getComments()` instead
1918
+ */
1919
+ getCommentDataList(): CommentData[];
1920
+ /**
1921
+ * Get the comment node list
1922
+ * @deprecated Use `getCommentNodes()` instead
1923
+ */
1924
+ getCommentList(): CommentNode[];
1925
+ /** Reply to a comment */
1926
+ replyComment(commentData: CommentData, $comment: HTMLElement): void;
1927
+ /** Edit a comment */
1928
+ editComment(commentData: CommentData, $comment: HTMLElement): void;
1929
+ /** Show loading of the editor */
1930
+ editorShowLoading(): void;
1931
+ /** Hide loading of the editor */
1932
+ editorHideLoading(): void;
1933
+ /** Show notify of the editor */
1934
+ editorShowNotify(msg: string, type: NotifyLevel): void;
1935
+ /** Reset the state of the editor */
1936
+ editorResetState(): void;
1937
+ /** Show the sidebar */
1938
+ showSidebar(payload?: SidebarShowPayload): void;
1939
+ /** Hide the sidebar */
1940
+ hideSidebar(): void;
1941
+ /** Check captcha */
1942
+ checkCaptcha(payload: CheckerCaptchaPayload): Promise<void>;
1943
+ /** Check admin */
1944
+ checkAdmin(payload: CheckerPayload): Promise<void>;
1945
+ }
1946
+
1947
+ /** @deprecated Use `Context` instead. */
1948
+ export declare type ContextApi = Context;
1949
+
1950
+ export declare interface DataManager {
1951
+ getLoading(): boolean;
1952
+ setLoading(val: boolean): void;
1953
+ getListLastFetch(): ListLastFetchData | undefined;
1954
+ setListLastFetch(val: ListLastFetchData): void;
1955
+ getComments(): CommentData[];
1956
+ findComment(id: number): CommentData | undefined;
1957
+ fetchComments(params: Partial<ListFetchParams>): void;
1958
+ loadComments(comments: CommentData[]): void;
1959
+ clearComments(): void;
1960
+ insertComment(comment: CommentData): void;
1961
+ updateComment(comment: CommentData): void;
1962
+ deleteComment(id: number): void;
1963
+ getNotifies(): NotifyData[];
1964
+ updateNotifies(notifies: NotifyData[]): void;
1965
+ getPage(): PageData | undefined;
1966
+ updatePage(pageData: PageData): void;
1967
+ }
1968
+
1969
+ /** @deprecated Use `DataManager` instead. */
1970
+ export declare type DataManagerApi = DataManager;
1971
+
1972
+ declare type DeepPartial<T> = T extends (...args: any[]) => unknown ? T : T extends Element | Date | RegExp ? T : T extends readonly unknown[] ? {
1973
+ [K in keyof T]: DeepPartial<T[K]>;
1974
+ } : T extends object ? {
1975
+ [K in keyof T]?: DeepPartial<T[K]>;
1976
+ } : T;
1977
+
1978
+ export declare const Defaults: Readonly<RequiredExcept<Config, ExcludedKeys>>;
1979
+
1980
+ declare interface DependencyContainer<S = Services_2> {
1981
+ provide<K extends keyof S, T extends S[K] = any, D extends readonly (keyof S)[] = any>(key: K, impl: Constructor<T, S, D>, deps?: D, opts?: ProvideFuncOptions): void;
1982
+ inject<T = undefined, K extends keyof S = any>(key: K): T extends undefined ? S[K] : T;
1983
+ }
1984
+
1985
+ export declare interface Editor {
1986
+ /**
1987
+ * Get the editor element
1988
+ *
1989
+ * @deprecated Use `getEl()` instead.
1990
+ */
1991
+ readonly $el: HTMLElement;
1992
+ /**
1993
+ * Get editor options
1994
+ */
1995
+ getOptions(): EditorOptions;
1996
+ /**
1997
+ * Get the editor element
1998
+ */
1999
+ getEl(): HTMLElement;
2000
+ /**
2001
+ * Get the editor UI instance
2002
+ */
2003
+ getUI(): EditorUI;
2004
+ /**
2005
+ * Get the header input elements
2006
+ */
2007
+ getHeaderInputEls(): Record<string, HTMLInputElement>;
2008
+ /**
2009
+ * Set content
2010
+ */
2011
+ setContent(val: string): void;
2012
+ /**
2013
+ * Insert content
2014
+ */
2015
+ insertContent(val: string): void;
2016
+ /**
2017
+ * Get the final content
2018
+ *
2019
+ * This function returns the raw content or the content transformed through a plugin hook.
2020
+ */
2021
+ getContentFinal(): string;
2022
+ /**
2023
+ * Get the raw content which is inputed by user
2024
+ */
2025
+ getContentRaw(): string;
2026
+ /**
2027
+ * Get the HTML format content which is rendered by marked (a markdown parser)
2028
+ */
2029
+ getContentMarked(): string;
2030
+ /**
2031
+ * Get editor current state
2032
+ */
2033
+ getState(): EditorState;
2034
+ /**
2035
+ * Focus editor
2036
+ */
2037
+ focus(): void;
2038
+ /**
2039
+ * Reset editor
2040
+ */
2041
+ reset(): void;
2042
+ /**
2043
+ * Reset editor UI
2044
+ *
2045
+ * call it will move editor to the initial position
2046
+ */
2047
+ resetState(): void;
2048
+ /**
2049
+ * Submit comment
2050
+ */
2051
+ submit(): void;
2052
+ /**
2053
+ * Show notification message
2054
+ */
2055
+ showNotify(msg: string, type: NotifyLevel): void;
2056
+ /**
2057
+ * Show loading on editor
2058
+ */
2059
+ showLoading(): void;
2060
+ /**
2061
+ * Hide loading on editor
2062
+ */
2063
+ hideLoading(): void;
2064
+ /**
2065
+ * Start replying a comment
2066
+ */
2067
+ setReplyComment(commentData: CommentData, $comment: HTMLElement, scroll?: boolean): void;
2068
+ /**
2069
+ * Start replying to a comment
2070
+ *
2071
+ * @deprecated Use `setReplyComment()` instead.
2072
+ */
2073
+ setReply(commentData: CommentData, $comment: HTMLElement, scroll?: boolean): void;
2074
+ /**
2075
+ * Start editing a comment
2076
+ */
2077
+ setEditComment(commentData: CommentData, $comment: HTMLElement): void;
2078
+ /**
2079
+ * Get plugin manager
2080
+ */
2081
+ getPlugins(): PluginManager | undefined;
2082
+ /**
2083
+ * Get plugin manager
2084
+ *
2085
+ * @deprecated Use `getPlugins()` instead.
2086
+ */
2087
+ getPlugs(): PluginManager | undefined;
2088
+ /**
2089
+ * Set plugin manager
2090
+ */
2091
+ setPlugins(plugins: PluginManager): void;
2092
+ }
2093
+
2094
+ /** @deprecated Use `Editor` instead. */
2095
+ export declare type EditorApi = Editor;
2096
+
2097
+ declare interface EditorEventPayloadMap {
2098
+ mounted: undefined;
2099
+ unmounted: undefined;
2100
+ 'header-input': {
2101
+ field: string;
2102
+ $input: HTMLInputElement;
2103
+ };
2104
+ 'header-change': {
2105
+ field: string;
2106
+ $input: HTMLInputElement;
2107
+ };
2108
+ 'content-updated': string;
2109
+ 'panel-show': EditorPlugin;
2110
+ 'panel-hide': EditorPlugin;
2111
+ 'panel-close': undefined;
2112
+ 'editor-close': undefined;
2113
+ 'editor-open': undefined;
2114
+ 'editor-submit': undefined;
2115
+ 'editor-submitted': undefined;
2116
+ }
2117
+
2118
+ declare interface EditorOptions {
2119
+ getEvents: () => EventManager;
2120
+ getConf: () => ConfigManager;
2121
+ }
2122
+
2123
+ /**
2124
+ * Editor 插件
2125
+ */
2126
+ declare class EditorPlugin {
2127
+ protected kit: PlugKit;
2128
+ $btn?: HTMLElement;
2129
+ $panel?: HTMLElement;
2130
+ contentTransformer?(rawContent: string): string;
2131
+ editorStateEffectWhen?: EditorState;
2132
+ editorStateEffect?(comment: CommentData): () => void;
2133
+ constructor(kit: PlugKit);
2134
+ /** Use plug btn will add a btn on the bottom of editor */
2135
+ useBtn(html?: string): HTMLElement;
2136
+ /** Use plug panel will show the panel when btn is clicked */
2137
+ usePanel(html?: string): HTMLElement;
2138
+ /** Use the content transformer to handle the content of the last submit by the editor */
2139
+ useContentTransformer(func: (raw: string) => string): void;
2140
+ /** Listen the event of panel show */
2141
+ usePanelShow(func: () => void): void;
2142
+ /** Listen the event of panel hide */
2143
+ usePanelHide(func: () => void): void;
2144
+ /** Use editor state modifier */
2145
+ useEditorStateEffect(stateName: EditorState, effectFn: (comment: CommentData) => () => void): void;
2146
+ }
2147
+
2148
+ export declare interface EditorPluginManager {
2149
+ getPlugins: () => EditorPlugin[];
2150
+ getEvents: () => EventManager<EditorEventPayloadMap>;
2151
+ getEditor: () => Editor;
2152
+ getOptions: () => PluginManagerOptions;
2153
+ get<T extends typeof EditorPlugin>(plug: T): InstanceType<T> | undefined;
2154
+ openPluginPanel: (plug: EditorPlugin) => void;
2155
+ closePluginPanel: () => void;
2156
+ getTransformedContent: (rawContent: string) => string;
2157
+ }
2158
+
2159
+ export declare type EditorState = 'reply' | 'edit' | 'normal';
2160
+
2161
+ declare interface EditorUI extends Record<keyof typeof Sel, HTMLElement> {
2162
+ $el: HTMLElement;
2163
+ $name: HTMLInputElement;
2164
+ $email: HTMLInputElement;
2165
+ $link: HTMLInputElement;
2166
+ $textarea: HTMLTextAreaElement;
2167
+ $submitBtn: HTMLButtonElement;
2168
+ $sendReplyBtn?: HTMLElement;
2169
+ $editCancelBtn?: HTMLElement;
2170
+ }
2171
+
2172
+ export declare type EmoticonGrpData = {
2173
+ name: string;
2174
+ type: 'emoticon' | 'image' | 'emoji';
2175
+ items: {
2176
+ key: string;
2177
+ val: string;
2178
+ }[];
2179
+ };
2180
+
2181
+ export declare type EmoticonListData = EmoticonGrpData[];
2182
+
2183
+ declare const en: {
2184
+ placeholder: string;
2185
+ noComment: string;
2186
+ send: string;
2187
+ signIn: string;
2188
+ signUp: string;
2189
+ save: string;
2190
+ nick: string;
2191
+ email: string;
2192
+ link: string;
2193
+ emoticon: string;
2194
+ preview: string;
2195
+ uploadImage: string;
2196
+ uploadFail: string;
2197
+ commentFail: string;
2198
+ restoredMsg: string;
2199
+ onlyAdminCanReply: string;
2200
+ uploadLoginMsg: string;
2201
+ counter: string;
2202
+ sortLatest: string;
2203
+ sortOldest: string;
2204
+ sortBest: string;
2205
+ sortAuthor: string;
2206
+ openComment: string;
2207
+ closeComment: string;
2208
+ listLoadFailMsg: string;
2209
+ listRetry: string;
2210
+ loadMore: string;
2211
+ admin: string;
2212
+ reply: string;
2213
+ voteUp: string;
2214
+ voteDown: string;
2215
+ voteFail: string;
2216
+ readMore: string;
2217
+ actionConfirm: string;
2218
+ collapse: string;
2219
+ collapsed: string;
2220
+ collapsedMsg: string;
2221
+ expand: string;
2222
+ approved: string;
2223
+ pending: string;
2224
+ pendingMsg: string;
2225
+ edit: string;
2226
+ editCancel: string;
2227
+ delete: string;
2228
+ deleteConfirm: string;
2229
+ pin: string;
2230
+ unpin: string;
2231
+ seconds: string;
2232
+ minutes: string;
2233
+ hours: string;
2234
+ days: string;
2235
+ now: string;
2236
+ adminCheck: string;
2237
+ captchaCheck: string;
2238
+ confirm: string;
2239
+ cancel: string;
2240
+ msgCenter: string;
2241
+ ctrlCenter: string;
2242
+ userProfile: string;
2243
+ noAccountPrompt: string;
2244
+ haveAccountPrompt: string;
2245
+ forgetPassword: string;
2246
+ resetPassword: string;
2247
+ changePassword: string;
2248
+ confirmPassword: string;
2249
+ passwordMismatch: string;
2250
+ verificationCode: string;
2251
+ verifySend: string;
2252
+ verifyResend: string;
2253
+ waitSeconds: string;
2254
+ emailVerified: string;
2255
+ password: string;
2256
+ username: string;
2257
+ nextStep: string;
2258
+ skipVerify: string;
2259
+ logoutConfirm: string;
2260
+ accountMergeNotice: string;
2261
+ accountMergeSelectOne: string;
2262
+ accountMergeConfirm: string;
2263
+ dismiss: string;
2264
+ merge: string;
2265
+ client: string;
2266
+ server: string;
2267
+ loading: string;
2268
+ loadFail: string;
2269
+ editing: string;
2270
+ editFail: string;
2271
+ deleting: string;
2272
+ deleteFail: string;
2273
+ reqGot: string;
2274
+ reqAborted: string;
2275
+ updateMsg: string;
2276
+ currentVersion: string;
2277
+ ignore: string;
2278
+ open: string;
2279
+ openName: string;
2280
+ };
2281
+
2282
+ declare interface EntityCookedComment {
2283
+ badge_color: string;
2284
+ badge_name: string;
2285
+ content: string;
2286
+ content_marked: string;
2287
+ date: string;
2288
+ email_encrypted: string;
2289
+ id: number;
2290
+ ip_region?: string;
2291
+ is_allow_reply: boolean;
2292
+ is_collapsed: boolean;
2293
+ is_pending: boolean;
2294
+ is_pinned: boolean;
2295
+ is_verified: boolean;
2296
+ link: string;
2297
+ nick: string;
2298
+ page_key: string;
2299
+ page_url: string;
2300
+ rid: number;
2301
+ site_name: string;
2302
+ ua: string;
2303
+ user_id: number;
2304
+ visible: boolean;
2305
+ vote_down: number;
2306
+ vote_up: number;
2307
+ }
2308
+
2309
+ declare interface EntityCookedNotify {
2310
+ comment_id: number;
2311
+ id: number;
2312
+ is_emailed: boolean;
2313
+ is_read: boolean;
2314
+ read_link: string;
2315
+ user_id: number;
2316
+ }
2317
+
2318
+ declare interface EntityCookedPage {
2319
+ admin_only: boolean;
2320
+ date: string;
2321
+ id: number;
2322
+ key: string;
2323
+ pv: number;
2324
+ site_name: string;
2325
+ title: string;
2326
+ url: string;
2327
+ vote_down: number;
2328
+ vote_up: number;
2329
+ }
2330
+
2331
+ declare interface EntityCookedSite {
2332
+ first_url: string;
2333
+ id: number;
2334
+ name: string;
2335
+ urls: string[];
2336
+ urls_raw: string;
2337
+ }
2338
+
2339
+ declare interface EntityCookedUser {
2340
+ badge_color: string;
2341
+ badge_name: string;
2342
+ email: string;
2343
+ id: number;
2344
+ is_admin: boolean;
2345
+ link: string;
2346
+ name: string;
2347
+ receive_email: boolean;
2348
+ }
2349
+
2350
+ declare interface EntityCookedUserForAdmin {
2351
+ badge_color: string;
2352
+ badge_name: string;
2353
+ comment_count: number;
2354
+ email: string;
2355
+ id: number;
2356
+ is_admin: boolean;
2357
+ is_in_conf: boolean;
2358
+ last_ip: string;
2359
+ last_ua: string;
2360
+ link: string;
2361
+ name: string;
2362
+ receive_email: boolean;
2363
+ }
2364
+
2365
+ declare interface Event_2<T, K extends keyof T = keyof T> extends EventOptions {
2366
+ name: K;
2367
+ handler: EventHandler<T[K]>;
2368
+ }
2369
+ export { Event_2 as Event }
2370
+
2371
+ export declare type EventHandler<T> = (payload: T) => void;
2372
+
2373
+ export declare interface EventManager<T = EventPayloadMap> {
2374
+ on<K extends keyof T>(name: K, handler: EventHandler<T[K]>, opts?: EventOptions): void;
2375
+ off<K extends keyof T>(name: K, handler: EventHandler<T[K]>): void;
2376
+ trigger<K extends keyof T>(name: K, payload?: T[K]): void;
2377
+ }
2378
+
2379
+ declare class EventManager_2<T> implements EventManager<T> {
2380
+ private events;
2381
+ /**
2382
+ * Add an event listener for a specific event name
2383
+ */
2384
+ on<K extends keyof T>(name: K, handler: EventHandler<T[K]>, opts?: EventOptions): void;
2385
+ /**
2386
+ * Remove an event listener for a specific event name and handler
2387
+ */
2388
+ off<K extends keyof T>(name: K, handler: EventHandler<T[K]>): void;
2389
+ /**
2390
+ * Trigger an event with an optional payload
2391
+ */
2392
+ trigger<K extends keyof T>(name: K, payload?: T[K]): void;
2393
+ }
2394
+
2395
+ export declare interface EventOptions {
2396
+ once?: boolean;
2397
+ }
2398
+
2399
+ /** EventName to EventPayload Type */
2400
+ export declare interface EventPayloadMap {
2401
+ created: undefined;
2402
+ mounted: undefined;
2403
+ updated: Config;
2404
+ unmounted: undefined;
2405
+ 'list-fetch': Partial<ListFetchParams>;
2406
+ 'list-fetched': ListFetchedArgs;
2407
+ 'list-load': CommentData[];
2408
+ 'list-loaded': CommentData[];
2409
+ 'list-failed': ListErrorData;
2410
+ 'list-goto-first': undefined;
2411
+ 'list-reach-bottom': undefined;
2412
+ 'comment-inserted': CommentData;
2413
+ 'comment-updated': CommentData;
2414
+ 'comment-deleted': CommentData;
2415
+ 'comment-rendered': CommentNode;
2416
+ 'notifies-updated': NotifyData[];
2417
+ 'list-goto': number;
2418
+ 'page-loaded': PageData;
2419
+ 'editor-submit': undefined;
2420
+ 'editor-submitted': undefined;
2421
+ 'user-changed': LocalUser;
2422
+ 'sidebar-show': undefined;
2423
+ 'sidebar-hide': undefined;
2424
+ }
2425
+
2426
+ declare type ExcludedKeys = FunctionKeys<Config>;
2427
+
2428
+ export declare interface FetchError extends Error {
2429
+ code: number;
2430
+ message: string;
2431
+ data?: any;
2432
+ }
2433
+
2434
+ declare interface FullRequestParams extends Omit<RequestInit, 'body'> {
2435
+ /** set parameter to `true` for call `securityWorker` for this request */
2436
+ secure?: boolean;
2437
+ /** request path */
2438
+ path: string;
2439
+ /** content type of request body */
2440
+ type?: ContentType;
2441
+ /** query params */
2442
+ query?: QueryParamsType;
2443
+ /** format of response (i.e. response.json() -> format: "json") */
2444
+ format?: ResponseFormat;
2445
+ /** request body */
2446
+ body?: unknown;
2447
+ /** base url */
2448
+ baseUrl?: string;
2449
+ /** request cancellation token */
2450
+ cancelToken?: CancelToken;
2451
+ }
2452
+
2453
+ declare type FunctionKeys<T> = Exclude<{
2454
+ [K in keyof T]: NonNullable<T[K]> extends (...args: any[]) => any ? K : never;
2455
+ }[keyof T], undefined>;
2456
+
2457
+ declare type HandlerMap = Record<string, any>;
2458
+
2459
+ declare interface HandlerParamsAuthSSOExchange {
2460
+ /** External IdP access token (e.g. an Auth0 access token) */
2461
+ token: string;
2462
+ }
2463
+
2464
+ declare interface HandlerParamsCaptchaVerify {
2465
+ /** The captcha value to check */
2466
+ value: string;
2467
+ }
2468
+
2469
+ declare interface HandlerParamsCommentCreate {
2470
+ /** The comment content */
2471
+ content: string;
2472
+ /** The comment email */
2473
+ email: string;
2474
+ /** The comment link */
2475
+ link?: string;
2476
+ /** The comment name */
2477
+ name: string;
2478
+ /** The comment page_key */
2479
+ page_key: string;
2480
+ /** The comment page_title */
2481
+ page_title?: string;
2482
+ /** The comment rid */
2483
+ rid?: number;
2484
+ /** The site name of your content scope */
2485
+ site_name: string;
2486
+ /** The comment ua */
2487
+ ua?: string;
2488
+ }
2489
+
2490
+ declare interface HandlerParamsCommentUpdate {
2491
+ /** The comment content */
2492
+ content: string;
2493
+ /** The comment email */
2494
+ email?: string;
2495
+ /** The comment ip */
2496
+ ip?: string;
2497
+ /** The comment is_collapsed */
2498
+ is_collapsed: boolean;
2499
+ /** The comment is_pending */
2500
+ is_pending: boolean;
2501
+ /** The comment is_pinned */
2502
+ is_pinned: boolean;
2503
+ /** The comment link */
2504
+ link?: string;
2505
+ /** The comment nick */
2506
+ nick?: string;
2507
+ /** The comment page_key */
2508
+ page_key: string;
2509
+ /** The comment rid */
2510
+ rid: number;
2511
+ /** The site name of your content scope */
2512
+ site_name: string;
2513
+ /** The comment ua */
2514
+ ua?: string;
2515
+ }
2516
+
2517
+ declare interface HandlerParamsEmailSend {
2518
+ /** The body of email */
2519
+ body: string;
2520
+ /** The subject of email */
2521
+ subject: string;
2522
+ /** The email address of the receiver */
2523
+ to_addr: string;
2524
+ }
2525
+
2526
+ declare interface HandlerParamsNotifyReadAll {
2527
+ /** The user email */
2528
+ email: string;
2529
+ /** The username */
2530
+ name: string;
2531
+ }
2532
+
2533
+ declare interface HandlerParamsPageFetchAll {
2534
+ /** If not empty, only fetch pages of this site */
2535
+ site_name?: string;
2536
+ }
2537
+
2538
+ declare interface HandlerParamsPagePV {
2539
+ /** The page key */
2540
+ page_key: string;
2541
+ /** The page title */
2542
+ page_title?: string;
2543
+ /** The site name of your content scope */
2544
+ site_name?: string;
2545
+ }
2546
+
2547
+ declare interface HandlerParamsPageUpdate {
2548
+ /** Updated page admin_only option */
2549
+ admin_only: boolean;
2550
+ /** Updated page key */
2551
+ key: string;
2552
+ /** The site name of your content scope */
2553
+ site_name: string;
2554
+ /** Updated page title */
2555
+ title: string;
2556
+ }
2557
+
2558
+ declare interface HandlerParamsSettingApply {
2559
+ /** The content of the config file in YAML format */
2560
+ yaml: string;
2561
+ }
2562
+
2563
+ declare interface HandlerParamsSiteCreate {
2564
+ /** The site name */
2565
+ name: string;
2566
+ /** The site urls */
2567
+ urls: string[];
2568
+ }
2569
+
2570
+ declare interface HandlerParamsSiteUpdate {
2571
+ /** Updated site name */
2572
+ name: string;
2573
+ /** Updated site urls */
2574
+ urls: string[];
2575
+ }
2576
+
2577
+ declare interface HandlerParamsTransferImport {
2578
+ /** Automatically answer yes for all questions */
2579
+ assumeyes?: boolean;
2580
+ /** The JSON data */
2581
+ json_data?: string;
2582
+ /** The JSON file path */
2583
+ json_file?: string;
2584
+ /** The target site name */
2585
+ target_site_name?: string;
2586
+ /** The target site url */
2587
+ target_site_url?: string;
2588
+ /** Keep domain */
2589
+ url_keep_domain?: boolean;
2590
+ /** Enable URL resolver */
2591
+ url_resolver?: boolean;
2592
+ }
2593
+
2594
+ declare interface HandlerParamsUserCreate {
2595
+ /** The user badge color (hex format) */
2596
+ badge_color?: string;
2597
+ /** The user badge name */
2598
+ badge_name?: string;
2599
+ /** The user email */
2600
+ email: string;
2601
+ /** The user is an admin */
2602
+ is_admin: boolean;
2603
+ /** The user link */
2604
+ link?: string;
2605
+ /** The user name */
2606
+ name: string;
2607
+ /** The user password */
2608
+ password?: string;
2609
+ /** The user receive email */
2610
+ receive_email: boolean;
2611
+ }
2612
+
2613
+ declare interface HandlerParamsUserLogin {
2614
+ /** The user email */
2615
+ email: string;
2616
+ /** The username */
2617
+ name?: string;
2618
+ /** The user password */
2619
+ password: string;
2620
+ }
2621
+
2622
+ declare interface HandlerParamsUserUpdate {
2623
+ /** The user badge color (hex format) */
2624
+ badge_color?: string;
2625
+ /** The user badge name */
2626
+ badge_name?: string;
2627
+ /** The user email */
2628
+ email: string;
2629
+ /** The user is an admin */
2630
+ is_admin: boolean;
2631
+ /** The user link */
2632
+ link?: string;
2633
+ /** The user name */
2634
+ name: string;
2635
+ /** The user password */
2636
+ password?: string;
2637
+ /** The user receive email */
2638
+ receive_email: boolean;
2639
+ }
2640
+
2641
+ declare interface HandlerParamsVoteCreate {
2642
+ /** The user email */
2643
+ email?: string;
2644
+ /** The username */
2645
+ name?: string;
2646
+ }
2647
+
2648
+ declare interface HandlerRequestAuthDataMergeApply {
2649
+ user_name: string;
2650
+ }
2651
+
2652
+ declare interface HandlerRequestAuthEmailLogin {
2653
+ code?: string;
2654
+ email: string;
2655
+ password?: string;
2656
+ }
2657
+
2658
+ declare interface HandlerRequestAuthEmailRegister {
2659
+ code: string;
2660
+ email: string;
2661
+ link?: string;
2662
+ name?: string;
2663
+ password: string;
2664
+ }
2665
+
2666
+ declare interface HandlerRequestAuthEmailSend {
2667
+ email: string;
2668
+ }
2669
+
2670
+ declare interface HandlerRequestUserInfoUpdate {
2671
+ code?: string;
2672
+ email: string;
2673
+ link?: string;
2674
+ name: string;
2675
+ }
2676
+
2677
+ declare interface HandlerResponseAdminUserList {
2678
+ count: number;
2679
+ users: EntityCookedUserForAdmin[];
2680
+ }
2681
+
2682
+ declare interface HandlerResponseAuthDataMergeApply {
2683
+ deleted_user_count: number;
2684
+ update_comments_count: number;
2685
+ update_notifies_count: number;
2686
+ update_votes_count: number;
2687
+ /** Empty if login user is target user no need to re-login */
2688
+ user_token: string;
2689
+ }
2690
+
2691
+ declare interface HandlerResponseAuthDataMergeCheck {
2692
+ need_merge: boolean;
2693
+ user_names: string[];
2694
+ }
2695
+
2696
+ declare interface HandlerResponseCaptchaGet {
2697
+ img_data: string;
2698
+ }
2699
+
2700
+ declare interface HandlerResponseCaptchaStatus {
2701
+ is_pass: boolean;
2702
+ }
2703
+
2704
+ declare interface HandlerResponseCommentCreate {
2705
+ badge_color: string;
2706
+ badge_name: string;
2707
+ content: string;
2708
+ content_marked: string;
2709
+ date: string;
2710
+ email_encrypted: string;
2711
+ id: number;
2712
+ ip_region?: string;
2713
+ is_allow_reply: boolean;
2714
+ is_collapsed: boolean;
2715
+ is_pending: boolean;
2716
+ is_pinned: boolean;
2717
+ is_verified: boolean;
2718
+ link: string;
2719
+ nick: string;
2720
+ page_key: string;
2721
+ page_url: string;
2722
+ rid: number;
2723
+ site_name: string;
2724
+ ua: string;
2725
+ user_id: number;
2726
+ visible: boolean;
2727
+ vote_down: number;
2728
+ vote_up: number;
2729
+ }
2730
+
2731
+ declare interface HandlerResponseCommentGet {
2732
+ /** The comment detail */
2733
+ comment: EntityCookedComment;
2734
+ /** The reply comment if exists (like reply) */
2735
+ reply_comment: EntityCookedComment;
2736
+ }
2737
+
2738
+ declare interface HandlerResponseCommentList {
2739
+ comments: EntityCookedComment[];
2740
+ count: number;
2741
+ page?: EntityCookedPage;
2742
+ roots_count: number;
2743
+ }
2744
+
2745
+ declare interface HandlerResponseCommentUpdate {
2746
+ badge_color: string;
2747
+ badge_name: string;
2748
+ content: string;
2749
+ content_marked: string;
2750
+ date: string;
2751
+ email_encrypted: string;
2752
+ id: number;
2753
+ ip_region?: string;
2754
+ is_allow_reply: boolean;
2755
+ is_collapsed: boolean;
2756
+ is_pending: boolean;
2757
+ is_pinned: boolean;
2758
+ is_verified: boolean;
2759
+ link: string;
2760
+ nick: string;
2761
+ page_key: string;
2762
+ page_url: string;
2763
+ rid: number;
2764
+ site_name: string;
2765
+ ua: string;
2766
+ user_id: number;
2767
+ visible: boolean;
2768
+ vote_down: number;
2769
+ vote_up: number;
2770
+ }
2771
+
2772
+ declare interface HandlerResponseConfAuthProviders {
2773
+ anonymous: boolean;
2774
+ callback_origin?: string;
2775
+ providers: AuthAuthProviderInfo[];
2776
+ }
2777
+
2778
+ declare interface HandlerResponseConfDomain {
2779
+ /** Is the domain trusted */
2780
+ is_trusted: boolean;
2781
+ /** The origin of the domain */
2782
+ origin: string;
2783
+ }
2784
+
2785
+ declare interface HandlerResponseNotifyList {
2786
+ count: number;
2787
+ notifies: EntityCookedNotify[];
2788
+ }
2789
+
2790
+ declare interface HandlerResponsePageFetch {
2791
+ admin_only: boolean;
2792
+ date: string;
2793
+ id: number;
2794
+ key: string;
2795
+ pv: number;
2796
+ site_name: string;
2797
+ title: string;
2798
+ url: string;
2799
+ vote_down: number;
2800
+ vote_up: number;
2801
+ }
2802
+
2803
+ declare interface HandlerResponsePageFetchStatus {
2804
+ /** The number of pages that have been fetched */
2805
+ done: number;
2806
+ /** If the task is in progress */
2807
+ is_progress: boolean;
2808
+ /** The message of the task status */
2809
+ msg: string;
2810
+ /** The total number of pages */
2811
+ total: number;
2812
+ }
2813
+
2814
+ declare interface HandlerResponsePageList {
2815
+ count: number;
2816
+ pages: EntityCookedPage[];
2817
+ }
2818
+
2819
+ declare interface HandlerResponsePagePV {
2820
+ pv: number;
2821
+ }
2822
+
2823
+ declare interface HandlerResponsePageUpdate {
2824
+ admin_only: boolean;
2825
+ date: string;
2826
+ id: number;
2827
+ key: string;
2828
+ pv: number;
2829
+ site_name: string;
2830
+ title: string;
2831
+ url: string;
2832
+ vote_down: number;
2833
+ vote_up: number;
2834
+ }
2835
+
2836
+ declare interface HandlerResponseSettingGet {
2837
+ envs: string[];
2838
+ yaml: string;
2839
+ }
2840
+
2841
+ declare interface HandlerResponseSettingTemplate {
2842
+ yaml: string;
2843
+ }
2844
+
2845
+ declare interface HandlerResponseSiteCreate {
2846
+ first_url: string;
2847
+ id: number;
2848
+ name: string;
2849
+ urls: string[];
2850
+ urls_raw: string;
2851
+ }
2852
+
2853
+ declare interface HandlerResponseSiteList {
2854
+ count: number;
2855
+ sites: EntityCookedSite[];
2856
+ }
2857
+
2858
+ declare interface HandlerResponseSiteUpdate {
2859
+ first_url: string;
2860
+ id: number;
2861
+ name: string;
2862
+ urls: string[];
2863
+ urls_raw: string;
2864
+ }
2865
+
2866
+ declare interface HandlerResponseTransferExport {
2867
+ /** The exported data which is a JSON string */
2868
+ artrans: string;
2869
+ }
2870
+
2871
+ declare interface HandlerResponseTransferUpload {
2872
+ /** The uploaded file name which can be used to import */
2873
+ filename: string;
2874
+ }
2875
+
2876
+ declare interface HandlerResponseUpload {
2877
+ file_name: string;
2878
+ file_type: string;
2879
+ public_url: string;
2880
+ }
2881
+
2882
+ declare interface HandlerResponseUserCreate {
2883
+ badge_color: string;
2884
+ badge_name: string;
2885
+ comment_count: number;
2886
+ email: string;
2887
+ id: number;
2888
+ is_admin: boolean;
2889
+ is_in_conf: boolean;
2890
+ last_ip: string;
2891
+ last_ua: string;
2892
+ link: string;
2893
+ name: string;
2894
+ receive_email: boolean;
2895
+ }
2896
+
2897
+ declare interface HandlerResponseUserInfo {
2898
+ is_login: boolean;
2899
+ notifies: EntityCookedNotify[];
2900
+ notifies_count: number;
2901
+ user: EntityCookedUser;
2902
+ }
2903
+
2904
+ declare interface HandlerResponseUserInfoUpdate {
2905
+ user: EntityCookedUser;
2906
+ }
2907
+
2908
+ declare interface HandlerResponseUserLogin {
2909
+ token: string;
2910
+ user: EntityCookedUser;
2911
+ }
2912
+
2913
+ declare interface HandlerResponseUserStatus {
2914
+ is_admin: boolean;
2915
+ is_login: boolean;
2916
+ }
2917
+
2918
+ declare interface HandlerResponseUserUpdate {
2919
+ badge_color: string;
2920
+ badge_name: string;
2921
+ comment_count: number;
2922
+ email: string;
2923
+ id: number;
2924
+ is_admin: boolean;
2925
+ is_in_conf: boolean;
2926
+ last_ip: string;
2927
+ last_ua: string;
2928
+ link: string;
2929
+ name: string;
2930
+ receive_email: boolean;
2931
+ }
2932
+
2933
+ declare interface HandlerResponseVote {
2934
+ down: number;
2935
+ is_down: boolean;
2936
+ is_up: boolean;
2937
+ up: number;
2938
+ }
2939
+
2940
+ declare class HttpClient<SecurityDataType = unknown> {
2941
+ baseUrl: string;
2942
+ private securityData;
2943
+ private securityWorker?;
2944
+ private abortControllers;
2945
+ private customFetch;
2946
+ private baseApiParams;
2947
+ constructor(apiConfig?: ApiConfig<SecurityDataType>);
2948
+ setSecurityData: (data: SecurityDataType | null) => void;
2949
+ protected encodeQueryParam(key: string, value: any): string;
2950
+ protected addQueryParam(query: QueryParamsType, key: string): string;
2951
+ protected addArrayQueryParam(query: QueryParamsType, key: string): any;
2952
+ protected toQueryString(rawQuery?: QueryParamsType): string;
2953
+ protected addQueryParams(rawQuery?: QueryParamsType): string;
2954
+ private contentFormatters;
2955
+ protected mergeRequestParams(params1: RequestParams, params2?: RequestParams): RequestParams;
2956
+ protected createAbortSignal: (cancelToken: CancelToken) => AbortSignal | undefined;
2957
+ abortRequest: (cancelToken: CancelToken) => void;
2958
+ request: <T = any, E = any>({ body, secure, path, type, query, format, baseUrl, cancelToken, ...params }: FullRequestParams) => Promise<HttpResponse<T, E>>;
2959
+ }
2960
+
2961
+ declare interface HttpResponse<D extends unknown, E extends unknown = unknown> extends Response {
2962
+ data: D;
2963
+ error: E;
2964
+ }
2965
+
2966
+ export declare type I18n = typeof en;
2967
+
2968
+ export declare type I18nKeys = keyof I18n;
2969
+
2970
+ export declare const init: typeof Artalk.init;
2971
+
2972
+ export declare interface Layer {
2973
+ show: () => void;
2974
+ hide: () => void;
2975
+ destroy: () => void;
2976
+ setOnAfterHide(func: () => void): void;
2977
+ setAllowMaskClose(allow: boolean): void;
2978
+ getAllowMaskClose(): boolean;
2979
+ getEl: () => HTMLElement;
2980
+ }
2981
+
2982
+ export declare interface LayerManager {
2983
+ create(name: string, el?: HTMLElement): Layer;
2984
+ destroy(): void;
2985
+ getEl(): HTMLElement;
2986
+ }
2987
+
2988
+ declare type Lifecycle = 'transient' | 'singleton';
2989
+
2990
+ export declare interface List {
2991
+ getEl: () => HTMLElement;
2992
+ getCommentsWrapEl: () => HTMLElement;
2993
+ getLayout: (arg: {
2994
+ forceFlatMode?: boolean;
2995
+ }) => ListLayout;
2996
+ getCommentNodes: () => CommentNode[];
2997
+ }
2998
+
2999
+ export declare interface ListData {
3000
+ /** 评论数据 */
3001
+ comments: CommentData[];
3002
+ /** 根评论总数 */
3003
+ roots_count: number;
3004
+ /** 评论总数(包括所有子评论) */
3005
+ count: number;
3006
+ /** 页面信息 */
3007
+ page: PageData;
3008
+ }
3009
+
3010
+ export declare interface ListErrorData {
3011
+ msg: string;
3012
+ data?: any;
3013
+ }
3014
+
3015
+ export declare interface ListFetchedArgs {
3016
+ params: Partial<ListFetchParams>;
3017
+ data?: ListData;
3018
+ error?: ListErrorData;
3019
+ }
3020
+
3021
+ export declare interface ListFetchParams {
3022
+ offset: number;
3023
+ limit: number;
3024
+ flatMode: boolean;
3025
+ paramsModifier?: (p: any) => void;
3026
+ onSuccess?: (data: ListData) => void;
3027
+ onError?: (err: any) => void;
3028
+ }
3029
+
3030
+ export declare interface ListLastFetchData {
3031
+ params: ListFetchParams;
3032
+ data?: ListData;
3033
+ }
3034
+
3035
+ export declare interface ListLayout {
3036
+ import: (comments: CommentData[]) => void;
3037
+ insert: (comment: CommentData, replyComment?: CommentData) => void;
3038
+ }
3039
+
3040
+ export declare const loadCountWidget: typeof Artalk.loadCountWidget;
3041
+
3042
+ /**
3043
+ * Local User Data (in localStorage)
3044
+ *
3045
+ * @note Keep flat for easy handling
3046
+ */
3047
+ export declare interface LocalUser {
3048
+ /** Username (aka. Nickname) */
3049
+ name: string;
3050
+ /** Email */
3051
+ email: string;
3052
+ /** Link (aka. Website) */
3053
+ link: string;
3054
+ /** Token (for authorization) */
3055
+ token: string;
3056
+ /** Admin flag */
3057
+ is_admin: boolean;
3058
+ }
3059
+
3060
+ export declare interface NotifyData {
3061
+ /** 通知 ID */
3062
+ id: number;
3063
+ /** 用户 ID */
3064
+ user_id: number;
3065
+ /** 评论 ID */
3066
+ comment_id: number;
3067
+ /** 是否已读 */
3068
+ is_read: boolean;
3069
+ /** 是否已发送邮件通知 */
3070
+ is_emailed: boolean;
3071
+ /** 标为已读地址 */
3072
+ read_link: string;
3073
+ }
3074
+
3075
+ export declare type NotifyLevel = 'i' | 's' | 'w' | 'e';
3076
+
3077
+ export declare interface PageData {
3078
+ /** 页面 ID */
3079
+ id: number;
3080
+ /** 页面唯一标识符 */
3081
+ key: string;
3082
+ /** 页面标题 */
3083
+ title: string;
3084
+ /** 页面 url */
3085
+ url: string;
3086
+ /** 仅管理员可评 */
3087
+ admin_only: boolean;
3088
+ /** 站点名(用于隔离) */
3089
+ site_name: string;
3090
+ /** 赞同数 */
3091
+ vote_up: number;
3092
+ /** 反对数 */
3093
+ vote_down: number;
3094
+ }
3095
+
3096
+ declare type PayloadKey = keyof ApiHandlerPayload;
3097
+
3098
+ declare class PluginManager implements EditorPluginManager {
3099
+ opts: PluginManagerOptions;
3100
+ private plugins;
3101
+ private openedPlug;
3102
+ private events;
3103
+ constructor(opts: PluginManagerOptions);
3104
+ getPlugins(): EditorPlugin[];
3105
+ getEvents(): EventManager_2<EditorEventPayloadMap>;
3106
+ getEditor(): Editor;
3107
+ getOptions(): PluginManagerOptions;
3108
+ private clear;
3109
+ private loadPluginUI;
3110
+ /** Load the plug btn and plug panel on editor ui */
3111
+ private loadPluginItem;
3112
+ get<T extends typeof EditorPlugin>(plug: T): InstanceType<T> | undefined;
3113
+ /** Open the editor plug panel */
3114
+ openPluginPanel(plug: EditorPlugin): void;
3115
+ /** Close the editor plugin panel */
3116
+ closePluginPanel(): void;
3117
+ /** Get the content which is transformed by plugs */
3118
+ getTransformedContent(rawContent: string): string;
3119
+ }
3120
+
3121
+ declare interface PluginManagerOptions {
3122
+ getArtalkRootEl: () => HTMLElement;
3123
+ getEditor: () => Editor;
3124
+ getConf: () => ConfigManager;
3125
+ getUser: () => UserManager;
3126
+ getApi: () => Api;
3127
+ getData: () => DataManager;
3128
+ getCheckers: () => CheckerManager;
3129
+ onSubmitted: () => void;
3130
+ }
3131
+
3132
+ /**
3133
+ * PlugKit provides a set of methods to help you develop editor plug
3134
+ */
3135
+ declare class PlugKit {
3136
+ private plugins;
3137
+ constructor(plugins: PluginManager);
3138
+ /** Use the editor */
3139
+ useEditor(): Editor;
3140
+ /** Use the config of Artalk */
3141
+ useConf(): Config;
3142
+ /** Use the http api client */
3143
+ useApi(): Api;
3144
+ /** Use the data manager */
3145
+ useData(): DataManager;
3146
+ /** Use the user manager */
3147
+ useUser(): UserManager;
3148
+ /** Use the checkers */
3149
+ useCheckers(): CheckerManager;
3150
+ /** Use the ui of editor */
3151
+ useUI(): EditorUI;
3152
+ /** Use the events in editor scope */
3153
+ useEvents(): EventManager_2<EditorEventPayloadMap>;
3154
+ /** Listen the event when plug is mounted */
3155
+ useMounted(func: () => void): void;
3156
+ /** Listen the event when plug is unmounted */
3157
+ useUnmounted(func: () => void): void;
3158
+ /** Use the deps of other plug */
3159
+ useDeps<T extends typeof EditorPlugin>(plug: T): InstanceType<T> | undefined;
3160
+ /** Use the root element of artalk */
3161
+ useArtalkRootEl(): HTMLElement;
3162
+ }
3163
+
3164
+ declare type PrimitiveKey = string | number | symbol;
3165
+
3166
+ declare interface ProvideFuncOptions {
3167
+ /** Lifecycle (default: 'singleton') */
3168
+ lifecycle?: Lifecycle;
3169
+ }
3170
+
3171
+ declare type QueryParamsType = Record<string | number, any>;
3172
+
3173
+ declare class Render {
3174
+ comment: CommentNode;
3175
+ get data(): CommentData;
3176
+ get opts(): CommentOptions;
3177
+ $el: HTMLElement;
3178
+ $main: HTMLElement;
3179
+ $header: HTMLElement;
3180
+ $headerNick: HTMLElement;
3181
+ $headerBadgeWrap: HTMLElement;
3182
+ $body: HTMLElement;
3183
+ $content: HTMLElement;
3184
+ $childrenWrap: HTMLElement | null;
3185
+ $actions: HTMLElement;
3186
+ voteBtnUp?: ActionBtn;
3187
+ voteBtnDown?: ActionBtn;
3188
+ $replyTo?: HTMLElement;
3189
+ $replyAt?: HTMLElement;
3190
+ constructor(comment: CommentNode);
3191
+ /**
3192
+ * Render the comment ui
3193
+ *
3194
+ * If comment data is updated, call this method to re-render the comment ui.
3195
+ * The method will be called multiple times, so it should be idempotent.
3196
+ *
3197
+ * Renders may add event listeners to the comment ui, so it should be called only once or override the original.
3198
+ * Please be aware of the memory leak caused by the event listener.
3199
+ */
3200
+ render(): HTMLElement;
3201
+ /** 内容限高检测 */
3202
+ checkHeightLimit(): void;
3203
+ /** 子评论区域移除限高 */
3204
+ heightLimitRemoveForChildren(): void;
3205
+ /** 渐出动画 */
3206
+ playFadeAnim(): void;
3207
+ /** 渐出动画 · 评论内容区域 */
3208
+ playFadeAnimForBody(): void;
3209
+ /** Perform the flash animation */
3210
+ playFlashAnim(): void;
3211
+ /** 获取子评论 Wrap */
3212
+ getChildrenWrap(): HTMLElement;
3213
+ /** 设置已读 */
3214
+ setUnread(val: boolean): void;
3215
+ /** 设置为可点击的评论 */
3216
+ setOpenable(val: boolean): void;
3217
+ /** 设置点击评论打开置顶 URL */
3218
+ setOpenURL(url: string): void;
3219
+ /** 设置点击评论时的操作 */
3220
+ setOpenAction(action: () => void): void;
3221
+ }
3222
+
3223
+ declare type RequestParams = Omit<FullRequestParams, 'body' | 'method' | 'query' | 'path'>;
3224
+
3225
+ declare type RequiredExcept<T, K extends keyof T> = Required<Omit<T, K>> & Pick<T, K>;
3226
+
3227
+ declare type ResponseFormat = keyof Omit<Body, 'body' | 'bodyUsed'>;
3228
+
3229
+ declare const Sel: {
3230
+ $header: string;
3231
+ $name: string;
3232
+ $email: string;
3233
+ $link: string;
3234
+ $textareaWrap: string;
3235
+ $textarea: string;
3236
+ $bottom: string;
3237
+ $submitBtn: string;
3238
+ $notifyWrap: string;
3239
+ $bottomLeft: string;
3240
+ $stateWrap: string;
3241
+ $plugBtnWrap: string;
3242
+ $plugPanelWrap: string;
3243
+ };
3244
+
3245
+ export declare interface Services {
3246
+ config: ConfigManager;
3247
+ events: EventManager;
3248
+ data: DataManager;
3249
+ api: Api;
3250
+ apiHandlers: ApiHandlers;
3251
+ editor: Editor;
3252
+ editorPlugs: EditorPluginManager | undefined;
3253
+ list: List;
3254
+ sidebar: SidebarLayer;
3255
+ checkers: CheckerManager;
3256
+ layers: LayerManager;
3257
+ user: UserManager;
3258
+ }
3259
+
3260
+ declare type Services_2 = {
3261
+ [key: PrimitiveKey]: any;
3262
+ };
3263
+
3264
+ export declare interface SidebarLayer {
3265
+ onUserChanged: () => void;
3266
+ show: (conf?: SidebarShowPayload) => void;
3267
+ hide: () => void;
3268
+ }
3269
+
3270
+ export declare interface SidebarShowPayload {
3271
+ view?: 'comments' | 'sites' | 'pages' | 'transfer';
3272
+ }
3273
+
3274
+ export declare interface SiteData {
3275
+ /** 站点 ID */
3276
+ id: number;
3277
+ /** 站点名 */
3278
+ name: string;
3279
+ /** 站点 URLs */
3280
+ urls: string[];
3281
+ /** 站点 URLs(原始字符串) */
3282
+ urls_raw: string;
3283
+ /** 站点主 URL */
3284
+ first_url: string;
3285
+ }
3286
+
3287
+ export declare const use: typeof Artalk.use;
3288
+
3289
+ export declare interface UserData {
3290
+ /** 用户 ID */
3291
+ id: number;
3292
+ /** 用户名 */
3293
+ name: string;
3294
+ /** 邮箱 */
3295
+ email: string;
3296
+ /** 链接 */
3297
+ link: string;
3298
+ /** 徽章名称 */
3299
+ badge_name: string;
3300
+ /** 徽章颜色 */
3301
+ badge_color: string;
3302
+ /** 是否属于管理员 */
3303
+ is_admin: boolean;
3304
+ /** 是否允许接收邮件通知 */
3305
+ receive_email: boolean;
3306
+ }
3307
+
3308
+ export declare interface UserDataForAdmin extends UserData {
3309
+ /** 最后一次操作 IP */
3310
+ last_ip: string;
3311
+ /** 最后一次操作 UA */
3312
+ last_ua: string;
3313
+ /** 是否存在于配置文件中 */
3314
+ is_in_conf: boolean;
3315
+ /** 评论数 */
3316
+ comment_count: number;
3317
+ }
3318
+
3319
+ export declare interface UserInfoApiResponseData {
3320
+ user?: UserData;
3321
+ is_login: boolean;
3322
+ notifies: NotifyData[];
3323
+ notifies_count: number;
3324
+ }
3325
+
3326
+ export declare interface UserManager {
3327
+ getGuestToken?: (server: string, create?: boolean) => string | undefined;
3328
+ setGuestToken?: (server: string, token: string) => void;
3329
+ getData: () => LocalUser;
3330
+ update: (dta: Partial<LocalUser>) => void;
3331
+ logout: () => void;
3332
+ checkHasBasicUserInfo: () => boolean;
3333
+ }
3334
+
3335
+ export { }
3336
+
3337
+
3338
+
3339
+ declare global {
3340
+ interface Window {
3341
+ ArtalkPlugins?: { [name: string]: ArtalkPlugin }
3342
+ }
3343
+ }