artalk 2.9.0 → 2.10.0

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